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