Перебор компонентов формы, скрыть компоненты формы

Дата публикации

Сегодня мы научимся перебирать компоненты на форме, определять класс найденного компонента, менять его свойства.

Совсем недавно я писал как можно динамически создать форму. Настал черед поработать с её компонентами.

Шаг 1. Поиск компонентов формы.

Компоненты, принадлежащие владельцу, хранятся в специальном списке. И форма в данном случае не исключение.

    property Components[Index: Integer]: TComponent;

Каждый компонент в списке пронумерован. Номер хранится в свойстве.

    property ComponentIndex: Integer;

Количество компонентов в списке Components можно посмотреть в свойстве ComponentCount.

    property ComponentIndex: Integer;

Итак, мы знаем список, в котором хранятся все элементы формы, знаем, сколько этих элементов. Написать цикл для перебора всех компонентов напрашивается сам собой.

Выглядеть он будет так:

for i:=0 to ComponentCount-1 do

Или так, кому как удобнее:

for i:=0 to MyForm.ComponentCount-1 do

Шаг 2. Работа с компонентами

Теперь мы знаем как найти все компоненты на форме. Теперь давайте подумаем, как это нам может пригодиться? Я предлагаю создать новый проект, накидать на него несколько разных визуальных элементов. Обязательно добавьте пару кнопок. Делать мы будем следующее: по клику мы будем скрывать все элементы формы, кроме Button. Обработчик нажатия будет выглядеть следующим образом:

procedure TMyForm.BVisibleClick(Sender: TObject);
var i:integer;
begin
for i:=0 to ComponentCount-1 do
    if (Components[i] is TControl) and (not (Components[i] is TButton)) then
       (Components[i] as TControl).Visible:=false;
end;

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

Область применения данного приема ограничена только вашей фантазией. Можно массово очищать Edit, проставлять птичек в CheckBox и тд.

Шаг 3. Как управлять списком компонентов.

Удаление копонента:

 procedure RemoveComponent(AComponent: TComponent);  

Очистка всего списка:

procedure DestroyComponents;   

Добавить компонент. Новый элемент будет последним в списке.

procedure InsertComponent(AComponent: TComponent); 

Поиск компонента в списке:

 function FindComponent(const AName: string): TComponent;  

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

Добавить комментарий



Обновить

Комментарии   

 
+1 #4 Maxim 20.02.2016 08:19
Цитирую Shami:
Как сделать так, что бы скрывались все компоненты даже Button но кроме одного Button1?
Если честно хочу понять как различать Button1 от Button2 или Edit1 от Edit2 ну и т.д.т.п.


Условие нужно изменить:
if (Components is TControl) and (not(Components [1] as TControl).name = 'Button1'))
Цитировать
 
 
0 #3 Maxim 20.02.2016 08:16
Цитирую Дмитрий:
Ув. автор. Тут у вас судя по всему ошибка. Исправьте=)
.Количество компонентов в списке Components можно посмотреть в свойстве ComponentCount.

1.
property ComponentCount: Integer;


Действительно ошибся, хотя ниже по тексту все правильно.
Цитировать
 
 
0 #2 Shami 08.02.2016 16:30
Как сделать так, что бы скрывались все компоненты даже Button но кроме одного Button1?
Если честно хочу понять как различать Button1 от Button2 или Edit1 от Edit2 ну и т.д.т.п.
Цитировать
 
 
0 #1 Дмитрий 08.02.2016 07:26
Ув. автор. Тут у вас судя по всему ошибка. Исправьте=)
.Количество компонентов в списке Components можно посмотреть в свойстве ComponentCount.

1.
property ComponentCount: Integer;
Цитировать
 
Thursday the 20th. icq 486350790
Copyright 2012

©