Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

TTreeNode   Найти похожие ветки 

 
mfender ©   (2006-06-28 15:48) [0]

Здравствуйте.
Создал потомка TTreeNode.
У него есть ещё несколько классов потомков.
Вобщем, иерархия такая: TTreeNode->ThsNode->ThsPartsNode.

ThsPartNode(TreeView1.Selected).ClassName показывает, что это TTreeNode, а (TreeView1.Selected as ThsPartNode).ClassName вообще ругается и говорит, что это - Invalid class typecast.

Я изначально догадывался, что это так. А как сделать, чтобы он мои классы принимал, как родные?


 
Плохиш ©   (2006-06-28 15:52) [1]


> А как сделать, чтобы он мои классы принимал, как родные?

Используй событие OnCreateNodeClass


 
mfender ©   (2006-06-28 16:02) [2]


> Используй событие OnCreateNodeClass

Не совсем понял: как его можно использовать? К тому же, он и в нём - NodeClass.ClassName = TTreeNode, несмотря на то, что создавал я:

var Node: ThsPartNode;
begin
 Node := ThsPartNode.Create(TreeView1.Items);
 TreeView1.Items.Add(Node, "root");


 
Stakan ©   (2006-06-28 16:17) [3]

procedure Form1....(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass)
begin
 NodeClass := ThsPartNode;
end;


 
mfender ©   (2006-06-28 16:22) [4]


> Stakan ©   (28.06.06 16:17) [3]

Дада, я уже только что догадался :) Блин, как всё просто...!
Осталось только додуматься, какому ноду какой класс приписывать.
Наверное буду в них ещё поле с именем класса (String) приделывать.

Спасибо всем!


 
TUser ©   (2006-06-28 16:36) [5]


> Наверное буду в них ещё поле с именем класса (String) приделывать.

ClassName


 
mfender ©   (2006-06-28 16:45) [6]


> TUser ©   (28.06.06 16:36) [5]
>
> > Наверное буду в них ещё поле с именем класса (String)
> приделывать.
>
> ClassName

Вот не получается...
Наверху написано TTreeNodeClass = class of TTreeNode;
Это понятно. Но function TTreeNodes.Add(Sibling: TTreeNode; const S: string): TTreeNode; подразумевает, что я передаю именно TTreeNode (это в пресловутом событии).

Так как же, всё-таки, определелить в OnCreateNode какой именно объект я создаю - ThsPartNode, или ещё какой-нибудь ThsXNode?

Прямо замкнутый круг какой-то... :(


 
ЕГыук   (2006-06-28 16:54) [7]


> что я передаю именно TTreeNode

или его наследника


 
Stakan ©   (2006-06-28 16:55) [8]


> Это понятно. Но function TTreeNodes.Add(Sibling:
> TTreeNode; const S: string): TTreeNode; подразумевает,
> что я передаю именно TTreeNode (это в пресловутом
> событии).

TTreeNode или его потомка. Чесно говоря не понятно в чём проблема.


 
mfender ©   (2006-06-28 17:22) [9]


> TTreeNode или его потомка. Чесно говоря не понятно в чём
> проблема.

Проблема в том, что это могут быть разные классы. Может быть ThsPartNode, может быть ThsDomainNode, может быть ThsObjectNode etc. Но в OnCreateNode они все выглядят как TTreeNode. И как мне определить, кто из них кто?


 
Stakan ©   (2006-06-28 17:40) [10]

if Noddy is ThsDomainNode then
...
else if Noddy is ThsObjectNode then
...
?


 
mfender ©   (2006-06-28 17:56) [11]


> Stakan ©   (28.06.06 17:40) [10]
> if Noddy is ThsDomainNode then
> ...
> else if Noddy is ThsObjectNode then
> ...?

Так вот и я о том же: откуда мне взять эти самые "Noddy"? Ну нету их! По команде Add() дело передаётся сразу в OnCreateNode, а потом уже в Add(). И как получить того Node, который написан в Add(Node, "")?
Вот ведь в чём беда!


 
Stakan ©   (2006-06-28 18:30) [12]

Ничего не понял, что такое OnCreateNode, какой Node нужно получить . . .


 
Плохиш ©   (2006-06-28 18:41) [13]


> mfender ©   (28.06.06 17:56) [11]

На вскидку, заведи вспомогательную переменную и перед добавлением присваивай ей тот узел, относительно которого добавляешь.


 
mfender ©   (2006-06-28 18:52) [14]

Вобщем, решение я нашёл такое:

1. Сделал наследыша от TTreeView:

 ThsTreeView = class(TTreeView)
 private
   procedure CreateNodeClass(Sender: TCustomTreeView;
     var NodeClass: TTreeNodeClass);
 public
   FCreatedNode: TClass;
   constructor Create(AOwner: TComponent); override;
 end;

FCreatedNode - переменная, куда я буду складывать определение класса создаваемых узлов.

У общего для всех ThsNode в конструкторе я передаю в неё ClassType

constructor ThsNode.Create(AOwner: TTreeNodes);
begin
 inherited Create(AOwner);
 (AOwner.Owner as ThsTreeView).FCreatedNode := Self.ClassType;
end;


Ну, а там уже понимаю, как её зовут:

procedure ThsTreeView.CreateNodeClass(Sender: TCustomTreeView;
 var NodeClass: TTreeNodeClass);
begin
 NodeClass := TTreeNodeClass(FCreatedNode);
end;


Работает!


 
mfender ©   (2006-06-28 18:52) [15]


> Плохиш ©   (28.06.06 18:41) [13]

> На вскидку, заведи вспомогательную переменную и перед добавлением
> присваивай ей тот узел, относительно которого добавляешь.
>

Так и сделал :)
Спасибо за помощь!


 
TUser ©   (2006-06-29 01:34) [16]

> Так и сделал :)

Имхо зря. Тебе передается нод, а ты его проверяй операцией is или проверкой поля ClassName


 
Плохиш ©   (2006-06-29 02:15) [17]


> TUser ©   (29.06.06 01:34) [16]
> > Так и сделал :)
>
> Имхо зря. Тебе передается нод, а ты его проверяй операцией
> is или проверкой поля ClassName

К сожалению, после беглого просмотра генокода, не было найдено возможности узнать в событии OnCreateNodeClass какой Нод был передан в функцию Add :-(
Если знаете такую возможность, то поделитесь, автор об этом и просит.


 
mfender ©   (2006-06-29 08:38) [18]


> TUser ©   (29.06.06 01:34) [16]
> > Так и сделал :)
>
> Имхо зря. Тебе передается нод, а ты его проверяй операцией
> is или проверкой поля ClassName

Так потому весь сыр-бор и разгорелся, что в OnCreateNodeClass невозможно узнать тип. Они там все - TTreeNode, что не создавай.



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
1-1149560100
Explorer
2006-06-06 06:15
2006.07.16
Экспорт данных в Источник данных Worda


2-1151591357
Id
2006-06-29 18:29
2006.07.16
Номер в имени компонента


15-1150355744
DillerXX
2006-06-15 11:15
2006.07.16
Программа для анимирования картинок.


15-1149881378
Strate
2006-06-09 23:29
2006.07.16
Интересная задачка


2-1151671180
Gizza
2006-06-30 16:39
2006.07.16
База данных