Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо