Цикл ЭЛЕМЕНТЫ
Цикл ЭЛЕМЕНТЫ позволяет перечислить элементы управления, на форме. Во время показа формы цикл перебирает как статические элементы (поля формы), так и добавленные динамически. Вне показа – только статические.
ЦИКЛ ЭЛЕМЕНТЫ(И_ЭЛЕМЕНТЫ: форма; ПЕРЕМ И_ЭЛЕМЕНТ: элемент)
Параметры
- форма
- Интерфейс формы, поддерживающей элементы управления.
- элемент
- Переменная-счетчик для получения интерфейса очередного элемента управления.
При переборе можно применять проверку типа объекта и запрос объекта конкретного типа для переменной интерфейса И_ЭЛЕМЕНТ.
Т.к. тип счетчика И_ЭЛЕМЕНТ совместим с типом любого элемента управления (все они реализуют этот интерфейс), то циклу может быть передана переменная типа КНОПКА, например. При этом, перебираться будут только элементы указанного типа и его производных. Т.к. счетчику цикла устанавливаются значения путем копирования, то получаемые в цикле значения не будут связаны с реальными элементами управления, а будут их копиями. Бессмысленно изменять значения полей счетчика и/или вызывать метод ОБНОВИТЬ, например. См. подробнее в Примере 3.
Пример 1 (используются идентификаторы):
ТИП МойДиалог(ДИАЛОГ) [ РЕДАКТОР: Редактор1 = [ /*...*/ идент = "поле_ввода" /*...*/ ]; ТАБЛИЦА: Таблица1 = [ /*...*/ идент = "табл" /*...*/ ]; КНОПКА: Кнопка1 = [ /*...*/ текст = "Очистить", нажатие = {НажатаОчистить} ]; ФУНКЦИЯ ОчиститьТаблицу(ПЕРЕМ ТАБЛИЦА: таблица) таблица.кол_строк = 0 СБРОС(таблица.элементы) КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ ОчиститьЭлемент(И_ЭЛЕМЕНТ: эл) ВЫБОР (эл.ИДЕНТ) // один из вариантов выбора действий - по идентификатору // здесь используем ссылки на реальные элементы управления в диалоге, не копии #"поле_ввода": ОБЪЕКТ(эл, РЕДАКТОР).текст = "" #"табл" : ОчиститьТаблицу(ОБЪЕКТ(эл, ТАБЛИЦА)) КОНЕЦ_ВЫБОРА КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ ОчиститьВсе ПЕРЕМ И_ЭЛЕМЕНТ: эл ЦИКЛ ЭЛЕМЕНТЫ(САМ, эл) ОчиститьЭлемент(эл) КОНЕЦ_ЦИКЛА КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ НажатаОчистить(ПЕРЕМ КНОПКА: кнопка) ОчиститьВсе ОБНОВИТЬ КОНЕЦ_ФУНКЦИИ ]
Пример 2 (используется запрос типа):
ТИП МояТаблица(ТАБЛИЦА)[ /*...*/ ] ТИП МойДиалог(ДИАЛОГ) [ РЕДАКТОР: Редактор1 = [ /*...*/ ]; ТАБЛИЦА: Таблица1 = [ /*...*/ ]; КНОПКА: Кнопка1 = [ /*...*/ текст = "Очистить таблицы", нажатие = {НажатаОчиститьТаблицы} ]; МояТаблица: Таблица2 = [ /*...*/ ]; ФУНКЦИЯ НажатаОчиститьТаблицы(ПЕРЕМ КНОПКА: кнопка) ПЕРЕМ И_ЭЛЕМЕНТ: эл ЦИКЛ ЭЛЕМЕНТЫ(САМ, эл) // цикл находит и очищает таблицы ЕСЛИ ОБЪЕКТ(эл, &ТАБЛИЦА) ТО // используем проверку типа ПЕРЕМ& табл = ОБЪЕКТ(эл, ТАБЛИЦА) // используем именованную ссылку // здесь используем ссылку на реальную таблицу в диалоге, не копию табл.кол_строк = 0 СБРОС(табл.элементы) табл.ОБНОВИТЬ КОНЕЦ_ЕСЛИ КОНЕЦ_ЦИКЛА КОНЕЦ_ФУНКЦИИ ]
Пример 3 (используется счетчик объектного типа):
ТИП МойДиалог(ДИАЛОГ) [ РЕДАКТОР: Редактор1 = [ /*...*/ ]; РЕДАКТОР: Редактор2 = [ /*...*/ ]; РЕДАКТОР: Редактор3 = [ /*...*/ ]; КНОПКА: Кнопка1 = [ /*...*/ текст = "Проверить поля", нажатие = {НажатаПроверитьРедакторы} ]; ФУНКЦИЯ НажатаПроверитьРедакторы(ПЕРЕМ КНОПКА: кнопка) ПЕРЕМ ЦЕЛОЕ: кол_пустых = 0 ПЕРЕМ РЕДАКТОР: ред ЦИКЛ ЭЛЕМЕНТЫ(САМ, ред) // цикл перебирает только редакторы // здесь ред - копия, можно читать, но изменять бессмысленно ЕСЛИ ред.текст = "" ТО кол_пустых++ КОНЕЦ_ЕСЛИ КОНЕЦ_ЦИКЛА ЕСЛИ кол_пустых > 0 ТО СООБЩЕНИЕ("Осталось заполнить " + СТР(кол_пустых) + " поля.") КОНЕЦ_ЕСЛИ КОНЕЦ_ФУНКЦИИ ]