Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.012 c
6-1142314044
Oops
2006-03-14 08:27
2006.07.16
Дата изменения файла на удаленном серваке


15-1150138873
JUS
2006-06-12 23:01
2006.07.16
Размещение игы в инете и её продажа


4-1144022231
XProger
2006-04-03 03:57
2006.07.16
Обойти OleVariant


4-1142139196
Интересующийся
2006-03-12 07:53
2006.07.16
Как определить в какой ОС работает прога?


15-1150402399
AKS
2006-06-16 00:13
2006.07.16
вакансия: программист delphi на удаленную работу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский