Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
14-5238
Leonidimus
2003-01-16 14:29
2003.02.03
Проблемы с копированием файла через WinApi


14-5131
lb
2003-01-13 19:09
2003.02.03
Решение задачи.


3-4777
michael1
2003-01-16 16:49
2003.02.03
Как в DBGrid делать горизонтальную прокрутку?


3-4778
CPPBuilderDev
2003-01-16 19:24
2003.02.03
ПОМОГИТЕ, извелся весь (модератору плииз не пинать)!


3-4792
Alexandr
2003-01-15 12:12
2003.02.03
Формат даты в Interbase и не только





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