Главная страница
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.01 c
1-531
Алексей
2003-04-21 08:39
2003.05.01
Как выполнить exe файл из программы на Делфи?


6-666
sergey2
2003-03-04 21:50
2003.05.01
Как сохранить отдельные элементы HTML документа в файлы?


7-816
SB
2003-03-11 15:37
2003.05.01
Падает print диалог в Windows XP


1-621
tytus
2003-04-19 10:33
2003.05.01
button


1-635
LEON
2003-04-11 17:27
2003.05.01
Как вставить картинку (BMP) в TRichEdit? чтобы пользователь мог у