Перебор компонентов на форме lazarus

В современных программах на одной форме находится большое количество компонентов, которые постоянно реагируют на работу пользователя. Из-за этого возникает сложность в написании кода для каждого компонента в отдельности или для группы компонентов.

Для примера представим ситуацию, при которой пользователь нажимает кнопку и на форме в 10 компонентах Label случайным образом меняется значение свойства Caption. С первого взгляда достаточно не сложная задача. Но если программировать на прямую, то придется прописывать код генерации случайного значения для каждого Label. Это получится из-за того, что цикл задать не получится. В цикле мы не сможем менять компонент, у которого необходимо менять значение.

Второй способ – это все же задать цикл, но в нем организовать отдельный блок, который по шагу цикла выбирает нужный компонент. Например, так:

Но этот способ также не очень удобен. Для того, чтобы упростить код необходимо организовать поиск нужных компонентов на форме.

Для начал создадим форму с 10 компонентами Label и 1 компонентом Button. Для удобного поиска имена компонентов должны быть цикличны, то есть например в конце имени должна стоять цифра, дающая номер компонента. Иначе будет сложно перебирать компоненты. В нашем случае сохраним стандартные имена, так удобнее всего.

Вот наша форма:

компоненты на форме

Теперь создаем обработчик событий для кнопки. В обработчике описываем две переменные: i,s и MyCom. I, s – даем целочисленный тип, i будет служить для цикла, а s для случайного значения. MyCom будет иметь тип TComponent, в этой переменной мы будем хранить наши компоненты при переборе.

Теперь задаем цикл и первым действием в цикле будет:

Мы переменной присваиваем значение функции FindComponent, которая ищет на форме Form1 компонент с именем ‘Label’+Inttostr(i). Такое имя означает, что при первом шаге цикла i=1 и имя будет Label1 и при последующих шагах будет меняться только цифра.

Следующая строка кода не обязательна, но желательна. Это проверка переменной MyCom. Бываут ситуации когда нужный компонент не найдет и что бы не создавать ошибок необходимо проверить пустая ли переменная:

TLabel(MyCom).Caption:=IntToStr(s); -теперь компоненту TLabel даем конкретное значение MyCom и свойству Caption присваиваем случайно значение из переменной s.

Все! Теперь цикл перебирет 10 компонентов и если все эти компоненты не пустые и Label, то им присвоиться случайное значение. Полный код обработчика событий кнопки:

Этот код намного удобнее других вариантов, главное его достоинство – это отсутствие повторяющегося кода типа:

А вот окно рабочей программы:
рабочая программа