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

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

Почему ComponentCount не включает в себя динамические объекты? [D7, WinXP]


lipskiy ©   (2004-09-15 23:20:00) 

Требуется найти на форме все компоненты данного типа. Почему-то несколько физически существующих (видимых) экземпляров динамически созданного визуального компонента (VirtualTreeView) таким образом не обнаруживаются. Это в принципе так для всех динамически создаваемых объектов, или это глюки какие-то? А если не глюки, то как обнаружить динамически созданные объекты?


lipskiy   (2004-09-16 21:00:00) [1]


> в [2] об этом и было написано

Да? Тогда спасибо! Если честно, несколько раз перечитывал ту фразу, но смысл ее до меня так и не дошел :))

Parent и Owner не путаю, родитель у меня табшит, на нем же отрисовывается - значит он, а владелец теперь главная форма.


Digitman   (2004-09-16 16:44:00) [2]


> lipskiy


а действительно - см. [12] - ты не путаешь назначение Parent- и Owner- свойств искомого компонента ? если, конечно же, искомый компонент наследует TWinControl ?


KSergey   (2004-09-16 16:24:00) [3]

> [10] lipskiy ©   (16.09.04 10:01)

Различайте Owner и Parent - это разные вещи, хотя и при непосредственном расположении компонент на форме в дезигн-тайм они и совпадают. А вот для динамически созданных - уж как укажете...


default   (2004-09-16 16:11:00) [4]

lipskiy ©   (16.09.04 09:36) [8]
". Решил проблему проще - владельцем искомых потом объектов при создании сделал главную форму, а не табшиты, как раньше."
в [2] об этом и было написано


lipskiy   (2004-09-16 10:01:00) [5]


> Владелец это тот, который освобождает память занимаемую
> теми кем владеет.

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


NAlexey   (2004-09-16 09:45:00) [6]

>lipskiy ©   (16.09.04 09:36) [8]
Владелец это тот, который освобождает память занимаемую теми кем владеет.


lipskiy   (2004-09-16 09:36:00) [7]


> И что, содержать массив компонентов? Зачем?

Ну, насколько я понимаю, это будет не массив компонентов, а массив указателей на объекты, так что, имхо, jack128, прав.

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


Fedia   (2004-09-16 03:35:00) [8]

jack128 ©   (16.09.04 03:25) [6]
И что, содержать массив компонентов? Зачем?

>>TV:=Integer(NewTreeView);
>>TTreeView(Compon1[i].TV).Color:=clLime;
Эти две строчки ты к чему привел?


jack128   (2004-09-16 03:25:00) [9]

Fedia   (16.09.04 2:53) [5]
TV:=Integer(NewTreeView);
TTreeView(Compon1[i].TV).Color:=clLime


Это сильно.. А почему бы сразу не объявить поле TV как TTreeView??


Fedia   (2004-09-16 02:53:00) [10]

lipskiy ©   (16.09.04 00:24) [3]
Я сталкивался с подобной проблемой: нужно было работать с динамически создаваемыми компонентами, также как у тебя, на закладках PageControl-а.
Для получения доступа к ним после их создания, я завел динамический массив записей. Нечто на подобии такого:
 Compon = record
   TV,          //номер компонента TreeView  
   L1: integer; //номер компонента Label  
 end;

 Compon1: array of Compon;

Количество элементов массива соответствовало количеству TabSheet - ов. Перый элемент массива содержал данные по компонентам, содержащимся на PageControl1.Pages[0], второй на .. Pages[1] и т.д.
Номера компонентов заносил в массив при создании компонента, например:
 NewTreeView:=TTreeView.Create(PageControl1.ActivePage);
 NewTreeView.Parent:=PageControl1.ActivePage;
 Compon1[PageControl1.ActivePageIndex].TV:=Integer(NewTreeView);

после этого доступ к ним можно получить так:
for i:=0 to Length(Compon1)-1 do
TTreeView(Compon1[i].TV).Color:=clLime;


jack128   (2004-09-16 01:30:00) [11]

lipskiy ©   (16.09.04 0:24) [3]
Че-то я не понял, а вложенность не поддерживается что-ль???

в том виде, в каком ты се это представляешь - нет. Если те так нужна - напиши рекурсивную процедурку - делов на 10 минут..


lipskiy   (2004-09-16 00:24:00) [12]

Че-то я не понял, а вложенность не поддерживается что-ль???
Когда стал искать непосредственно на владельце - нашлось.
А когда на владельце владельца - не находится.

Подскажите, как правильно сделать:
На форме PageControl, у него три TabSheet, на каждом из которых лежит динамический TreeView, мне надо в одном цикле найти все TreeView. Причем при дальнейшей разработке проекта число табшитов и деревьев будет расти, а к этой процедуре поиска деревьев я больше возвращаться не хочу, мне нужна здесь полная автоматика, не зависящая от того сколько и где этих деревьев лежат, главное, что все они одного типа.


default   (2004-09-15 23:27:00) [13]

динамическим компонентам присваивай владельца того что присв-ся комп-ам размещённым в рантайм и всё будет тип-топ


jack128   (2004-09-15 23:26:00) [14]

lipskiy ©   (15.09.04 23:20)
в массив Components[] входят все компоненты, _владельцем_ которых является данный компонент.


Наверх

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