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

Вниз

TreeNode.Data и String   Найти похожие ветки 

 
в режиме поиска   (2003-01-23 12:19) [0]

Добрый день!
Возникла проблема с присвоением TreeNode.Data строки string.
Как я понимаю, TreeNode.Data - это указатель. Как связать его со строкой.
Спасибо


 
tga ©   (2003-01-23 12:24) [1]

Можно использовать вместо String PChar например.

Но я в таких случаях делаю нечто такое:
type
Tstr=class
val:string;
constructor Create(val:string);
end;
...
constructor TStr.Create(val:string);
begin
self.var=var;
end;

...


а в проге:

TreeNode.Data := TStr.Create(MyStr);


 
в режиме поиска   (2003-01-23 12:48) [2]

> tga
К примеру я создаю TreeView из файла и каждому TreeNode.Data присваиваю стоку вышеуказанным способом.
Но нужно же осободить память. Как сделать если узлов много?


 
Reindeer Moss Eater   (2003-01-23 13:07) [3]

Но нужно же осободить память. Как сделать если узлов много?
А в чем трудность-то?


 
Skier ©   (2003-01-23 13:18) [4]

>в режиме поиска
1) type PString = ^String;
2)
var
AStr : PString;
begin
//..........
New(AStr)
AStr^ := "hello, world !";
TreeNode.Data := AStr;
//..........
end;

Потом не забыть освободить !
Dispose(TreeNode.Data);


 
в режиме поиска   (2003-01-23 13:19) [5]

я к примеру делаю так :


var
MyStr : PString;
begin


Добавляю узлы :


//...........
New(MyStr);
MyStr^ := "bla-bla-bla"
TreeView.Items.AddChildObject(ParentNode, NodeName, MyStr);
....


Потом освобождаю :


procedure TMainFrm.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
begin
for i:=0 to TreeView1.Items.Count-1 do
Dispose(TreeView1.Items.Item[i].Data);
end;


так правильно??


 
Fiend ©   (2003-01-23 13:21) [6]

У дерева есть событие OnDeletion вызывается при удалении узла.
Напишите там обработчик уничтожающий данные под указателем Data.

и еще, на мой взгляд как то помпезно использовать для хранения строки класс. Проще либо ПЧар, либо самому его сделать

pString = ^string;

далее
var a: pString;
new(a);

Node.Data:= a;

обращаться потом string(Node.Data^)

уничтожать dispose(pString(Node.Data))


 
uw ©   (2003-01-23 13:22) [7]

Предлагаю объявить переменную типа TStringList, добавить в этот лист "строка", включить флажок Use Debug DCUs в Project|Options|Compiler и протрассировать вплоть до TStringList.Destroy. Тогда станет понятно, как Они это делают (в частности применяют Finalize).


 
Fiend ©   (2003-01-23 13:24) [8]

То в режиме поиска
про удаление почти правильно, если у элементов TreeNodes нету дочерних, то всё освободите, а если есть подчинённые, то их память вы не освобождаете

То Skier, отэто повторились :)


 
Skier ©   (2003-01-23 13:26) [9]

>Fiend
"Повторение - мать учения !" :)))


 
в режиме поиска   (2003-01-23 13:51) [10]

> Fiend:
> про удаление почти правильно, если у элементов TreeNodes нету дочерних, то всё освободите,
> а если есть подчинённые, то их память вы не освобождаете

Почему?
Попробуйте создать на форме TreeView, в design-time насоздавать несколько узлов (вложенных и просто), бросить на форму мемо и кнопку.

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to TreeView1.Items.Count-1 do
begin
Memo1.Lines.Add(TreeView1.Items.Item[i].Text);
end;
end;

В мемо показываются все узлы. Так что Вы не правы :-)


 
icWasya ©   (2003-01-23 14:01) [11]

у TTreeView есть событие OnDestroyItem
в нём и надо делать удаление


 
в режиме поиска   (2003-01-23 14:20) [12]

2 icWasya

в D6 нет...


 
Fiend ©   (2003-01-23 14:26) [13]

То в режиме поиска:
вам жеж сказали уже OnDeletion внимательно читать надо

То icWasya: неверно говорите название события


 
Reindeer Moss Eater   (2003-01-23 14:33) [14]

Удобно следующее:

-В качестве Data изпользовать пользовательский класс.
-Класс реализовать в отдельном модуле.
-Иметь в модуле приватный экземпляр TList, создаваемый в initialization и убиваемый в finalization
-В конструкторе пользовательского класса добавлять созданный экземпляр в список
-в finalization вызывать процедуру, уничтожающую все созданные экземпляры
-Забыть про мороку с освобождением памяти в своих проектах.





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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
4-5356
Pavel Lechenko
2002-12-18 17:45
2003.02.03
Создание пользовательского контекста


14-5146
Кот Бегемот
2003-01-16 18:50
2003.02.03
Первый раз в жизни спрашиваю о компоненте :)


3-4759
Relict
2003-01-15 11:57
2003.02.03
опять запись/чтение рисунков ... ну не получается...


14-5136
Лохматый
2003-01-17 14:03
2003.02.03
Рулез...


4-5337
kalishenko stas
2002-12-20 11:44
2003.02.03
Рихтер