Очищение объектов

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

если так использовать
try
for i:=0 to Tree.Items.Count-1 do
if Assigned(Tree.Items.Item.Data) then Tree.Items.Item.Free;
finally
Tree.Items.Clear; - тут выскакивает
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

попробуй
[syntax="delphi"]if Assigned(Tree.Items.Data) then TObject(Tree.Items.Data).Free;[/syntax]
С уважением, Lost Angel...
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

LAngel,
А treeview.clear; как думаешь надо будет делать?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Нашел сейас думаю как избавитья

Когда добавляю так
Tree.items.Addobject(nil,'111',Data)
Data это класс с переменными
или так
Tree.items.Add(nil,'111')
то все нормалньо очищается

но если так, то ошибка
Tree.items.Addobject(nil,'111',pointer(111))
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

&quot писал(а):LAngel,
А treeview.clear; как думаешь надо будет делать?
TObject(Items.Data).Free вызовет деструктор объекта, указатель которого "привязан" к Data итема, сам итем продолжит существовать, так что Items.Clear вызывать надо, если необходимо очистить список самих итемов.
&quot писал(а):Tree.items.Add(nil,'111')
то все нормалньо очищается

но если так, то ошибка
Tree.items.Addobject(nil,'111',pointer(111))

Потому что, в первом случае if assigned(Items.Data) будет false, и "удаление объекта" не произойдет, а во втором, будет произведена попытка удалить некий объект по адресу (111), которого, есс-но не существует.

Если в параметр Data заносится просто информация, а не ссылки на объекты наследники TObject, тогда будет достаточно просто удалить сами итемы (Items.clear).

Если в Data заносится указатель на выделенную память - надо будет сначала освободить память FreeMemory(Items.Data).

Выбирай свой случай :) ))
С уважением, Lost Angel...
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

FreeMemory(Items.Data).
Вот тут-то и вылетает если ссылка

П.С. перевл я тут эти дервье на этот метод очищения, теперь если в одном дереве добавть данные с датой потом скопировать их в другое. Затем очистть данные в 1 дереве приведенным выше методом, то будет другая инфомрация во 2 дереве
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Лелик, лажа у тебя там с указателями явно

внимательно перечитываем пост 15
Изображение
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Сохраняй все свои объекты во вспомогательном списке, каждый раз, когда привязываешь указатель объекта к TTreeItem.Data добавляй этот же объект и во вспомогательный список (для начала проверяй, что его там ещё нет) и когда тебе будет нужно, то очищай только этот вспомогательный список, и будет у тебя что-то типа Garbage Collection, только без контроля связей между объектами :)
Ответить