Вниз
Скачать: CL | DM;

Освобождаются ли ресурсы ?   Найти похожие ветки 

 
Fly` ©   (2002-05-27 17:27) [0]

КОгда я работаю с TreeView, я Добавляю свои ITEMS и переменные в DATA .
New(Pi);
Pi^:=Table.FieldByName("Field").AsInteger;
S:=Table.FieldByName("stField").AsString;
WNode := tvTypes.Items.AddChildObject(Node,S,Pi);

ВОпрос такой : освободятся ли ресурсы когда я потом сделаю
tvTypes.Items.Clear или следует в цикле сделать
FreeMem(tvTypes.Items[i].Data) ???


 
Внук ©   (2002-05-27 18:02) [1]

Нет, не освободятся. Хотя бы потому, что Delphi не знает, как их освобождать: Free, FreeMem, Dispose, Release ? А вдруг они еще нужны?


 
Дмитрий Баранов   (2002-05-27 18:28) [2]

Во-первых, New с FreeMem мешать - дурной тон (New->Dispose)
Во-вторых, указатель, который ты освобождаешь, надо бы явно приводить к типу данных

Dispose(PInteger(tvTypes.Items[i].Data));
TMyObject(tvTypes.Items[i].Data).Free;

В-третьих, может случиться так, что тот объект, на который указывает Data, может перестать существовать (сборка мусора, или же ты сам явно разрушил объект). В лучшем случае получишь мусор, в худшем - Access violation. Посему надо почитать про функцию assigned и еще - желательно проверять на nil то, что находится по этому адресу.


 
Fly` ©   (2002-05-27 18:56) [3]

Просьба уточнить этот момент :
> В-третьих, может случиться так, что тот объект, на который
> указывает Data, может перестать существовать (сборка мусора,
> или же ты сам явно разрушил объект).

что такое сборка мусора ? Если я выделил программно память под переменную процедурой New , разве её может что-либо удалить без моего ведома ?


 
NailS ©   (2002-05-28 12:51) [4]

Fly` © (27.05.02 18:56)



> Если я выделил программно память под переменную процедурой
> New , разве её может что-либо удалить без моего ведома ?
>

Память надо освободить руками, вызвав Dispose (Delphi Help). Сборка мусора работает только для интерфейсов (если не ошибаюсь, конечно).


 
Pavlik Morozov   (2002-05-28 14:04) [5]

В TTreeView есть такое событие хорошее OnDeletion, в которое кроме всего прочего передается нод, который уничножаеться

Вот туды и втыкаешь свое
Dispose(PInteger(tvTypes.Items[i].Data));


 
Fly` ©   (2002-05-28 14:32) [6]

Ок... спасибо всем ! Примного благодарен .



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.009 c
14-18110
KIR
2002-04-24 09:45
2002.06.06
Не могу отправить сообщение в форум (наверное из-за XP)


1-18017
Константин
2002-05-24 10:51
2002.06.06
Раскрытие окна на весь экран


8-18067
Ev_genus
2002-01-15 17:40
2002.06.06
Функции bass.dll


1-18019
Qwer
2002-05-24 01:45
2002.06.06
Порядковый номер дня в году


6-18088
Quadro
2002-03-25 12:29
2002.06.06
Smart Whois




   Наверх