![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить все объекты на форме [D7, XP]
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
> >
>
> дальше можно не продолжать.
То есть?
> Есть такое понятие - рекурсия.
Да спасибо!