Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-751
Manjak
2003-04-12 15:00
2003.05.01
Как можно отредактировать exe файл.(Изменить пару значений)


8-652
Алексей Ч.
2003-01-11 02:09
2003.05.01
Как сделать программу, которая выдает список запущенных процессов


1-529
Владимир5
2003-04-18 12:46
2003.05.01
Шрифты в разных кодировках


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


4-847
France
2003-03-04 10:03
2003.05.01
Разрешение экрана





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский