Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить все объекты на форме [D7, XP]


Страницы:   1 2 3

v_a_belousov ©   (2010-10-12 23:39:00) 

Здравствуйте! Поискал в интернете, но так и не нашел каким образом можно получить все объекты имеющиеся на форме. То есть что то вроде...

for i:=0 to Form.ControlCount-1 do
begin
 Control := Form.Control[i];
end;

Это я понимаю... Но вот что если на форме есть PageControl, на котором есть вкладки, в которых есть элементы? Каким образом тогда в общем виде должна выглядеть обработка?

Ведь не могу же я в цикле точно написать что-то вроде

Control := Form.Control[i].Control[i].Control[i].Control[i]; так как не знаю точно сколько и чего есть на форме... подскажите пожалуйста каким образом можно узнать что имеется на форме?


v_a_belousov   (2010-10-13 13:11:00) [21]


> Сергей М.

Да но как? Может я запутался уже конечно совсем. Но у Controls[i] нет свойства Controls....


v_a_belousov   (2010-10-13 13:09:00) [22]


> родительский оконный контрол для неких других контролов,
>  которые в свою очередь тоже могут являться родителями контролов.
> .. и т.д.

вот только как это может быть не могу понять. То есть у TControl ведь нет свойства Controls или Child но тем не менее на примере Form -> PageControl -> TabSheet -> Button каждый из них является Control'ом


Сергей М.   (2010-10-13 13:08:00) [23]


> v_a_belousov   (13.10.10 13:06) [19]


Тогда ComponentCount и Components[] идут лесом.
Вместо них следует пользовать ControlCount и Controls[] соответственно.


v_a_belousov   (2010-10-13 13:06:00) [24]


> Сергей М.

рассматривается как родительский оконный контрол для неких других контролов, которые в свою очередь тоже могут являться родителями контролов... и т.д.


Сергей М.   (2010-10-13 12:57:00) [25]


> v_a_belousov


"На форме" - понятие растяжимое.
Одно дело когда форма рассматривается как владелецнеких компонентов (не обязательно контролов) , и совсем другое когда она рассматривается как родительский оконный контрол для неких других (дочерних, не обязательно оконных) контролов.
Соответственно и решения разные.


v_a_belousov   (2010-10-13 12:55:00) [26]


> Скажи, зачем. Нам будет проще понять

Затем чтобы получив в параметре моей функции форму TCustomForm взять из нее все объекты то есть построить список всех объектов формы с их событиями. И использовать их в другом месте. Вот пример:

есть форма с двумя кнопками и одним текстовым полем(TEdit) . Заранее мне неизвестно что есть на форме, то есть сначала мне нужно определить что на форме присутствует.

затем должен построиться список что то вроде

Form.Button1
Form.Button2
Form.Edit1

Причем у Button1 и т.д. все свойства должны быть сохранены. В том числе и обработчики их событий.

Все это дело сохраняется в файл.

После с помощью функции из dll загрузки объектов из файла я могу использовать эти элементы в других местах.


v_a_belousov   (2010-10-13 12:45:00) [27]


> Этот дерьмокод через пару секунд поднимет исключение переполнения
> стека.

Это часть кода одна из процедур... Исключения не вызывает. Все компоненты сохраняются в файл. ShowMessages - это я дописывал для себя так как функция вызывающая эту процедуру сидит в dll, как и сама эта процедура.


Плохиш   (2010-10-13 11:01:00) [28]


> Dennis I. Komarov ©   (13.10.10 10:59) [14]

Поиск на слово exit сделал :-P


Dennis I. Komarov   (2010-10-13 10:59:00) [29]


> Этот дерьмокод через пару секунд поднимет исключение переполнения
> стека.

Даже прочитал его? %)


Плохиш   (2010-10-13 10:41:00) [30]


> v_a_belousov   (13.10.10 02:39) [8]

Этот дерьмокод через пару секунд поднимет исключение переполнения стека.


Игорь Шевченко   (2010-10-13 10:09:00) [31]

v_a_belousov   (13.10.10 03:47) [11]

Скажи, зачем. Нам будет проще понять


v_a_belousov   (2010-10-13 03:47:00) [32]


> Что есть объекты в данном вопросе (про задачу молчу).
> Сначала искали контролы, потом стали искать компоненты.
> Что дальше искать будем?

Нужно получить все объекты на форме(контролы, компоненты). Затем получить их свойства к примеру имя. Также у объектов есть события к примеру у кнопки OnClick. И эти события также необходимо получать.


Германн   (2010-10-13 03:17:00) [33]


> v_a_belousov   (13.10.10 02:39) [8]
>
> Задача получить все объекты на форме. Пока сделал вот так.

Как учебное задание я ещё могу эту задачу принять. Но только после ряда уточнений.
" Получить все объекты".
Что есть объекты в данном вопросе (про задачу молчу).
Сначала искали контролы, потом стали искать компоненты.
Что дальше искать будем?


v_a_belousov   (2010-10-13 02:40:00) [34]

Если нужно делать по другому подскажите пожалуйста как.


v_a_belousov   (2010-10-13 02:39:00) [35]

Задача получить все объекты на форме. Пока сделал вот так...

procedure GetObjects(Form: TCustomForm);
var i, i1, num: integer;
begin
//
if not Recurs then
begin
 //
 CC := 0;
 for i:=0 to Form.ComponentCount-1 do
  begin
   //
   num := Length(Components);
   //
   SetLength(Components, num+1);
   SetLength(RComponents, num+1);
   //
   Components[num] := Form.Components[i];
   RComponents[num] := Form.Components[i];
  end;
 //
 CC:=Form.ComponentCount;
 ComponentsCount:=0;
 //
 Recurs := true;
 ShowMessage('Recurs'+inttostr(Length(Components))+'  '+inttostr(Length(RComponents)));
end;
//
if CC<>0 then
begin
 //
 for i:=0 to Length(RComponents)-1 do
  begin
   //
   for i1:=0 to RComponents[i].ComponentCount-1 do
    begin
     //
     num := Length(Components);
     //
     SetLength(Components, num+1);
     //
     Components[num] := RComponents[i].Components[i1];
//     ShowMessage('i '+inttostr(i)+'i1 '+inttostr(i1)+inttostr(Length(Components))
//     +'  '+inttostr(Length(RComponents)));
    end;
  end;
 //
 RComponents := nil;
 //
 ShowMessage('CC '+inttostr(ComponentsCount)+'LG '+inttostr(Length(Components)));
 ComponentsCount := Length(Components)-CC;
 CC := CC + ComponentsCount;
 //
 SetLength(RComponents, ComponentsCount);
 ShowMessage('CC '+inttostr(ComponentsCount)+'LG '+inttostr(Length(Components)));
 //
 for i:=0 to Length(RComponents)-1 do
  begin
   //
   RComponents[i] := Components[i+ComponentsCount];
  // ShowMessage('RC ' + inttostr(Length(RComponents)));
  end;
//  ShowMessage('CC '+inttostr(ComponentsCount));
 //
 if ComponentsCount=0 then CC:=0;
 GetObjects(Form);
end;

Дальше буду поправлять...


Германн   (2010-10-13 01:55:00) [36]


> KilkennyCat ©   (12.10.10 23:52) [4]
>
> неоднозначное решение.

Непонятная задача, точнее будет сказать.


KilkennyCat   (2010-10-13 00:16:00) [37]

Например, динамическая страница PageControlа, имплэйсэдитор, чекбокс в каом-нить виртуалтривью... да мильен примеров.


v_a_belousov   (2010-10-12 23:54:00) [38]


> неоднозначное решение. не все контролы создаются в момент.

Например?


KilkennyCat   (2010-10-12 23:52:00) [39]

неоднозначное решение. не все контролы создаются в момент.


v_a_belousov   (2010-10-12 23:48:00) [40]


> Хотя, после
>
> > for i:=0 to Form.ControlCount-1 do
> >
>
> дальше можно не продолжать.

То есть?

> Есть такое понятие - рекурсия.

Да спасибо!


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо