![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeNode.Data и String [D6, Win95/98]
в режиме поиска © (2003-01-23 12:19:00)Добрый день!
Возникла проблема с присвоением TreeNode.Data строки string.
Как я понимаю, TreeNode.Data - это указатель. Как связать его со строкой.
Спасибо
Reindeer Moss Eater (2003-01-23 14:33:00) [1]Удобно следующее:
-В качестве Data изпользовать пользовательский класс.
-Класс реализовать в отдельном модуле.
-Иметь в модуле приватный экземпляр TList, создаваемый в initialization и убиваемый в finalization
-В конструкторе пользовательского класса добавлять созданный экземпляр в список
-в finalization вызывать процедуру, уничтожающую все созданные экземпляры
-Забыть про мороку с освобождением памяти в своих проектах.
Fiend (2003-01-23 14:26:00) [2]То в режиме поиска:
вам жеж сказали уже OnDeletion внимательно читать надо
То icWasya: неверно говорите название события
в режиме поиска (2003-01-23 14:20:00) [3]2 icWasya
в D6 нет...
icWasya (2003-01-23 14:01:00) [4]у TTreeView есть событие OnDestroyItem
в нём и надо делать удаление
в режиме поиска (2003-01-23 13:51:00) [5]> 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;
В мемо показываются все узлы. Так что Вы не правы :-)
Skier (2003-01-23 13:26:00) [6]>Fiend
"Повторение - мать учения !" :)))
Fiend (2003-01-23 13:24:00) [7]То в режиме поиска
про удаление почти правильно, если у элементов TreeNodes нету дочерних, то всё освободите, а если есть подчинённые, то их память вы не освобождаете
То Skier, отэто повторились :)
uw (2003-01-23 13:22:00) [8]Предлагаю объявить переменную типа TStringList, добавить в этот лист "строка", включить флажок Use Debug DCUs в Project|Options|Compiler и протрассировать вплоть до TStringList.Destroy. Тогда станет понятно, как Они это делают (в частности применяют Finalize).
Fiend (2003-01-23 13:21:00) [9]У дерева есть событие OnDeletion вызывается при удалении узла.
Напишите там обработчик уничтожающий данные под указателем Data.
и еще, на мой взгляд как то помпезно использовать для хранения строки класс. Проще либо ПЧар, либо самому его сделать
pString = ^string;
далее
var a: pString;
new(a);
Node.Data:= a;
обращаться потом string(Node.Data^)
уничтожать dispose(pString(Node.Data))
в режиме поиска (2003-01-23 13:19:00) [10]я к примеру делаю так :
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;
так правильно??
Skier (2003-01-23 13:18:00) [11]>в режиме поиска
1) type PString = ^String;
2)
var
AStr : PString;
begin
//..........
New(AStr)
AStr^ := "hello, world !";
TreeNode.Data := AStr;
//..........
end;
Потом не забыть освободить !
Dispose(TreeNode.Data);
Reindeer Moss Eater (2003-01-23 13:07:00) [12]Но нужно же осободить память. Как сделать если узлов много?
А в чем трудность-то?
в режиме поиска (2003-01-23 12:48:00) [13]> tga
К примеру я создаю TreeView из файла и каждому TreeNode.Data присваиваю стоку вышеуказанным способом.
Но нужно же осободить память. Как сделать если узлов много?
tga (2003-01-23 12:24:00) [14]Можно использовать вместо 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);