Форум: "Основная";
Текущий архив: 2003.05.01;
Скачать: [xml.tar.bz2];
Внизссылка на узел дерева Найти похожие ветки
← →
ИгорьФ (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c