Текущий архив: 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.49 MB
Время: 0.014 c