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

Вниз

ссылка на узел дерева   Найти похожие ветки 

 
ИгорьФ   (2003-04-21 08:54) [0]

Не пойму, где ошибка

Создаю класс
TNodeInfo = class
public
NodeText:string; {текст нода}
N:TTreeNode; {ссылка на нод}
end;

и ещё один

TMyTree = class (TFrame)
public
FNodes:array of TNodeInfo; {этот массив хранит информацию об узлах TreeView}
TreeView:TTreeView;
procedure BuildTree;
end;

добавление нода...

procedure TMyTree.BuildTree;
begin
SetLength(FNodes,1);
FNodes[0]:=TNodeInfo.Create;
FNodes[0].NodeText:="test";
FNodes[0].N:=TreeView.Items.AddObjectFirst(nil,FNodes[0].Text,FNodes[0]); {добавляем узел, который хранит в себе ссылку на элемент массива FNodes}
end;

так вот, внутри процедуры BuildTree свойство FNodes[0].N.Text возвращает "test" (как и следовало ожидать), но по выходу из неё добраться до этого же свойства я уже не могу (хотя адрес остаётся). Другими словами...

var MT:TMyTree;

procedure TForm1.Button1Click(Sender:TObject);
begin
MT.BuildTree; (пока всё нормально)
ShowMessage(MT.FNodes[0].N.Text); {!!!! Ошибка! Нарушение доступа}
end;


 
evvcom ©   (2003-04-21 09:10) [1]

Вот это завернул! Зачем такой огород?


 
ИгорьФ   (2003-04-21 09:16) [2]

Это только ма-а-ааленький такой кусочек :) Задача - построить дерево и некоторые операции на нём, но так как работа с TTreeView достаточно медленная (например, тот же поиск), то хочу держать ссылки на его узлы в другом классе (TNodeInfo). В этом случае поиск ускоряется в разы.


 
evvcom ©   (2003-04-21 09:25) [3]

Ну не знаю. Что в дереве миллион ветвей? Неужели скорости не хватает? А то может происходит визуальная прокрутка, раскрытие ветвей во время расчетов? Так это можно убрать.


 
Digitman ©   (2003-04-21 09:34) [4]

Для хранения экстра-инфы класс TTreeNode предусматривает св-во Data: Pointer.
Этого в большинстве случаев достаточно, чтобы "не городить огород".
Кр.того, во многих обозримых случаях совершенно неразумно дублировать значение св-ва TTreeNode.Text в экстра-инфе (если она все же требуется) - данное public-св-во доступно в любой момент по чтению/записи и без всякой экстра-инфы

var
NodeInfo: TNodeInfo;

...
NodeInfo := TNodeInfo.Create(..);
try
TreeView.Items.AddObjectFirst(nil, "test", NodeInfo);
except
...
NodeInfo.Free;
raise;
end;

...
procedure TMyForm.MyTreeViewDeletion(Sender: TObject; Node: TTreeNode);
begin
...
TNodeInfo(Node.Data).Free;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
14-762
NetBreaker666
2003-04-12 17:54
2003.05.01
Создание экземпляра класса по имени класса.


3-467
msguns
2003-04-10 18:38
2003.05.01
Технология работы с IB/FB


3-378
ZooN
2003-04-14 22:03
2003.05.01
MySQL


7-812
AlexBeliy
2003-03-13 21:40
2003.05.01
Logoff


14-677
Brand2000
2003-04-15 06:32
2003.05.01
Почему код глючит???????