Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Рефлекшн (однотипные действия для объектов)


Автор: Teoden 2.10.2007, 17:52
Вобще задача довольно простая. Необходимо спрятать все объекты (картинки, кнопки и т.д) расположенные на форме.
Самый простой метод это просто сделать:
Код

Form1.Image1.Visible := false;
Form1.Image2.Visible := false;
Form1.Label1.Visible := false;
Form1.Label2.Visible := false;
//и т.д. для всех объектов на форме

Но если объектов много?

Второй способ, который значительно укорачивает код это для каждого объекта проверять его принадлежность:
Код

for i := 0 to Form1.ComponentsCount-1 do
begin
  try (Form1.Components[i] as TLabel).Visible := False; except end;
  try (Form1.Components[i] as TImage).Visible := False; except end;
  try (Form1.Components[i] as TButton).Visible := False; except end;
  //и т.д. для каждого типа компонента присутствующего на форме
end;


А теперь вопрос к знатокам: Как и можно ли сделать то же самое с помощью рефлекшн в паскале? По идее это выглядело бы примерно так:
Код

for i := 0 to Form1.ComponentsCount-1 do
begin
  Form1.Invoke(Form1.Components[i]+'.Visible') := true;
end;

Но метод Invoke в паскале в отличии от других языков требует кучу параметров. Хелп по методу Invoke в делфи мне не помог. Помогите разобраться. Или объяните использование Invoke на примере.

Автор: maxim1000 2.10.2007, 18:10
Visible - свойство TControl
потому достаточно пройтись по компонентам, для каждого проверить, наследуется ли он от TControl и, если да, установить ему Visible в false...

Автор: bems 2.10.2007, 19:06
Цитата(maxim1000 @  2.10.2007,  18:10 Найти цитируемый пост)
пройтись по компонентам
пройтись по controls[] и ничего не проверять

Код

for i:=0 to Form1.ControlCount-1 do Form1.Controls[i].Hide;

Автор: Virtuals 3.10.2007, 08:01
 smile 
а не проще на форму пооложить TPanel и уже на них все остальное

потом
Panel1.Visible:=false;

ЗЫ к тому-же TPanel может быть не один, и выключать их блоками

Автор: Alexeis 3.10.2007, 12:46
Цитата(Virtuals @  3.10.2007,  08:01 Найти цитируемый пост)
а не проще на форму пооложить TPanel и уже на них все остальное

  Или поместить все на фрейм, и действовать аналогично.

Автор: DonPager 3.10.2007, 18:07
У меня задача была спрятать много наследников панели и я делал так
Код

Panel.enabled := false;
for i:=0 to Panel.ControlCount -1 do Panel.Controls[i].Visible := Panel.enabled;

+ в том что капшен панели остаётся видимым, а обработчики панели недоступны и компоненты на ней невидимы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)