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

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

Как обратиться к объекту, если еасть его имя. [D7, WinXP]


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

tazik ©   (2005-01-25 21:01:00) 

Здравствуйте!

Пишу такую прогу. Есть уменя на форме объекты определенных типов. Хочу составить дерево этих объектов, подобно Object Explorer

пример кода:

procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
var Comp: TComponent;
begin
       Comp := TComponent(FindComponent(node.Text));
       if Assigned(Comp) then
       begin
          if Comp.ClassName = 'TTabSheet' then      (*)
           showMessage(comp.name);
       ...

Но когда выполяется (*) выскакивает Access violation. Что делать?


begin...end   (2005-01-27 08:41:00) [1]

> [48] Skier ©   (27.01.05 06:53)

Спасибо за поправку. Я как раз пытался показать разницу между родителем и владельцем, и...

В общем, читать следует так:

У каждого компонента есть также свойство-массив Components - в него заносятся все компоненты, для которых владельцем (owner'ом)является данный компонент.


Skier   (2005-01-27 06:53:00) [2]


> У каждого компонента есть также свойство-массив Components
> - в него заносятся все компоненты, для которых родителем
> является данный компонент.


TComponent.Components - Lists all components ownedby the component.


Юрий Зотов   (2005-01-26 22:14:00) [3]

> begin...end ©   (26.01.05 11:27) [45]

Весьма достойно. Уважаю. Искренне.


tazik   (2005-01-26 21:54:00) [4]

> to begin...end

Милый Вы мой человек! Спасибо Вам большое! Я давно ждал такого пояснения ситуации! Теперь я понял, что к чему! Побольше бы таких ответов! Еще раз, спасибо Вам!


begin...end   (2005-01-26 11:27:00) [5]

> tazik

У каждого компонента (экземпляра класса TComponent или его потомка) есть свойства Owner (владелец) и Parent (родитель).

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

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

У каждого компонента есть также свойство-массив Components - в него заносятся все компоненты, для которых родителем является данный компонент.

Метод FindComponent компонента просто ищет в списке Components компонент с нужным именем.

Вот Вы пишете:

> tab := TTabSheet.Create(ParentPC);
> tab.PageControl := ParentPC;

В первой строке Вы указываете, кто будет владельцем tab - ParentPC. Это означает, что за уничтожение tab будет отвечать ParentPC. И что после создания tab ссылка на неё окажется именно в массиве ParentPC.Components. Вместо ParentPC можно было указать, например, форму, или объект Application, т.е. любой компонент, или вообще NIL.

Во второй строке, фактически, происходит назначение свойства tab.Parent (см. в исходниках VCL реализацию метода tab.SetPageControl).

Поэтому теперь есть два варианта:

1. Оставить создание tab в том виде, в каком оно было до сих пор. Но учесть то, что владельцем (owner'ом) этой tab будет не форма, а ParentPC. И потом искать tab не в списке компонентов формы, как Вы это делали до сих пор, а в списке ParentPC.Components, т.е. вызывать метод ParentPC.FindComponent.
2. Назначать владельцем tab форму, а не ParentPC. Искать также, как Вы искали раньше, т.е. среди компонентов формы.


ЮЮ   (2005-01-26 09:22:00) [6]

Коль ты строишт дерево объектов, то это должен быть не Form.FindComponent, а <Компонент, соответствующий узлу дерева, содержащий текуший>.FindComponent


ЮЮ   (2005-01-26 09:19:00) [7]

TComponent.FindComponent
Indicates whether a given component is ownedby the component.

Чей FindComponent работает в так нызываемом "примере кода"?


tazik   (2005-01-26 09:05:00) [8]

> Gero

FindComponent - это стандартная функция, типа TComponent, возращающая Component по его имени.

Form.FindComponent('SomeComponent').свойства


Gero   (2005-01-25 22:51:00) [9]


> Абсолютно уверен. Дело в том, что у меня перед собой открытый
> исходник, я от туда все беру.

Тогда что такое FindComponent?


tazik   (2005-01-25 22:27:00) [10]

ЛАДНО! ВСЕМ БОЛЬШОЕ СПАСИБО ЗА ВНИМАНИЕ!!!! МНЕ ПОРА!!!!!


tazik   (2005-01-25 22:17:00) [11]

>begin...end
Как это? Ведь TabSheet создается на PageCtrl!!!


begin...end   (2005-01-25 22:11:00) [12]

> [36] tazik ©   (25.01.05 22:09)

Почему же? Можно написать, например, так:

tab := TTabSheet.Create({имя формы, на которой находится ParentPC});
tab.PageControl := ParentPC;


tazik   (2005-01-25 22:11:00) [13]

>begin...end

Так ведь в качестве аргумента конструктора нужно списывать PageControl. и свойству PageControl тоже нужно указывать на PageControl

tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;


tazik   (2005-01-25 22:09:00) [14]

>begin...end

Так ведь в качестве аргумента конструктора нужно списывать PageControl. и свойству PageControl тоже нужно указывать на PageControl

tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;


begin...end   (2005-01-25 22:04:00) [15]

> [34] tazik ©   (25.01.05 22:00)

Ну и что?


tazik   (2005-01-25 22:00:00) [16]

> begin...end[33]

Дело в том, что у меня эта процедура выписана в отдельном файле.


begin...end   (2005-01-25 21:57:00) [17]

> [31] tazik ©   (25.01.05 21:54)

> ParentPC: TPageControl

> tab := TTabSheet.Create( ParentPC)

А почему же Вы потом ищете этот компонент в списке Components формы, а не компонента-владельца- ParentPC?


tazik   (2005-01-25 21:57:00) [18]

> [29] Gero

Абсолютно уверен. Дело в том, что у меня перед собой открытый исходник, я от туда все беру.


tazik   (2005-01-25 21:54:00) [19]

Ну а как же! Вот кусок процедуры по созданию TabSheet:

procedure CrtTab(Caption: string; ParentPC: TPageControl);
var Tab: TTabSheet;
begin
tab := TTabSheet.Create(ParentPC);
tab.PageControl := ParentPC;
tab.Caption := Caption;
tab.Name := Caption;
ParentPC.ActivePage := tab;
...


begin...end   (2005-01-25 21:51:00) [20]

> [27] tazik ©   (25.01.05 21:48)

Чему равно свойство Owner для TabSheet?

Т.е. проверьте (ещё при создании дерева), чему равно Tab1.Owner.Name.


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

Наверх

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