Руководство разработчика

Цикл ЭЛЕМЕНТЫ

Цикл ЭЛЕМЕНТЫ позволяет перечислить элементы управления, на форме. Во время показа формы цикл перебирает как статические элементы (поля формы), так и добавленные динамически. Вне показа – только статические.

ЦИКЛ ЭЛЕМЕНТЫ(И_ЭЛЕМЕНТЫ: форма; ПЕРЕМ И_ЭЛЕМЕНТ: элемент)

Параметры

форма
Интерфейс формы, поддерживающей элементы управления.
элемент
Переменная-счетчик для получения интерфейса очередного элемента управления.

При переборе можно применять проверку типа объекта и запрос объекта конкретного типа для переменной интерфейса И_ЭЛЕМЕНТ.

Т.к. тип счетчика И_ЭЛЕМЕНТ совместим с типом любого элемента управления (все они реализуют этот интерфейс), то циклу может быть передана переменная типа КНОПКА, например. При этом, перебираться будут только элементы указанного типа и его производных. Т.к. счетчику цикла устанавливаются значения путем копирования, то получаемые в цикле значения не будут связаны с реальными элементами управления, а будут их копиями. Бессмысленно изменять значения полей счетчика и/или вызывать метод ОБНОВИТЬ, например. См. подробнее в Примере 3.

Пример 1 (используются идентификаторы):

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

  ФУНКЦИЯ ОчиститьВсе
    ПЕРЕМ И_ЭЛЕМЕНТ: эл
    ЦИКЛ ЭЛЕМЕНТЫ(САМ, эл)
      ОчиститьЭлемент(эл)
    КОНЕЦ_ЦИКЛА
  КОНЕЦ_ФУНКЦИИ

  ФУНКЦИЯ НажатаОчистить(ПЕРЕМ КНОПКА: кнопка)
    ОчиститьВсе
    ОБНОВИТЬ
  КОНЕЦ_ФУНКЦИИ
]

Пример 2 (используется запрос типа):

ТИП МояТаблица(ТАБЛИЦА)[ /*...*/ ]

ТИП МойДиалог(ДИАЛОГ)
[
  РЕДАКТОР: Редактор1 = [ /*...*/ ];
  ТАБЛИЦА: Таблица1 = [ /*...*/ ];
  КНОПКА: Кнопка1 = [ /*...*/
                      текст = "Очистить таблицы",
                      нажатие = {НажатаОчиститьТаблицы} ];  
  МояТаблица: Таблица2 = [ /*...*/ ];

  ФУНКЦИЯ НажатаОчиститьТаблицы(ПЕРЕМ КНОПКА: кнопка)
    ПЕРЕМ И_ЭЛЕМЕНТ: эл
    ЦИКЛ ЭЛЕМЕНТЫ(САМ, эл) // цикл находит и очищает таблицы
      ЕСЛИ ОБЪЕКТ(эл, &ТАБЛИЦА) ТО // используем проверку типа
        ПЕРЕМ& табл = ОБЪЕКТ(эл, ТАБЛИЦА) // используем именованную ссылку
        // здесь используем ссылку на реальную таблицу в диалоге, не копию
        табл.кол_строк = 0
        СБРОС(табл.элементы)
        табл.ОБНОВИТЬ
      КОНЕЦ_ЕСЛИ
    КОНЕЦ_ЦИКЛА
  КОНЕЦ_ФУНКЦИИ
]

Пример 3 (используется счетчик объектного типа):

ТИП МойДиалог(ДИАЛОГ)
[
  РЕДАКТОР: Редактор1 = [ /*...*/ ];
  РЕДАКТОР: Редактор2 = [ /*...*/ ];
  РЕДАКТОР: Редактор3 = [ /*...*/ ];

  КНОПКА: Кнопка1 = [ /*...*/
                      текст = "Проверить поля",
                      нажатие = {НажатаПроверитьРедакторы} ];  

  ФУНКЦИЯ НажатаПроверитьРедакторы(ПЕРЕМ КНОПКА: кнопка)
    ПЕРЕМ ЦЕЛОЕ: кол_пустых = 0
    ПЕРЕМ РЕДАКТОР: ред
    ЦИКЛ ЭЛЕМЕНТЫ(САМ, ред) // цикл перебирает только редакторы
      // здесь ред - копия, можно читать, но изменять бессмысленно
      ЕСЛИ ред.текст = "" ТО
        кол_пустых++
      КОНЕЦ_ЕСЛИ
    КОНЕЦ_ЦИКЛА
    ЕСЛИ кол_пустых > 0 ТО
      СООБЩЕНИЕ("Осталось заполнить " + СТР(кол_пустых) + " поля.")
    КОНЕЦ_ЕСЛИ
  КОНЕЦ_ФУНКЦИИ
]

См. также: