Форум: "Начинающим";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
ВнизКак удалить объекты? Найти похожие ветки
← →
newbie2 (2006-06-01 16:50) [0]два TCollection содержат одинаковые объекты
for i := 0 to myColl.Count - 1 do
myColl[i].Free;
...
for i := 0 to myColl2.Count - 1 do
if Assigned(myColl2[i]) then
myColl2[i].Free;
Assigned - выдает TRUE и при попытке удаления из myColl2 возникает ошибка, почему и как быть в данной ситуации, неужто просто myColl2.Clear?
← →
Amoeba © (2006-06-01 16:52) [1]А если так?
for i := myColl.Count - 1 downto 0 do
← →
newbie2 (2006-06-01 17:05) [2]не помогло
← →
StriderMan © (2006-06-01 17:09) [3]
while MyColl.Count > 0 do
MyCol[0].free;
← →
StriderMan © (2006-06-01 17:11) [4]Стоп. Пошли все на поводу
TCollection сам убивает элементы коллекции:
Deletes all items from the collection.
Delphi syntax:
procedure Clear;
C++ syntax:
void __fastcall Clear(void);
Description
Clear empties the Items array and destroys each TCollectionItem.
← →
newbie2 (2006-06-01 17:13) [5]но почему тогда Assigned(myColl2[i]) возвращает TRUE ?
← →
StriderMan © (2006-06-01 17:20) [6]
> но почему тогда Assigned(myColl2[i]) возвращает TRUE ?
глючит наверное
у меня было похожее.
вызывал у TForm.Free
и после этого Assigned божился что TRUE
FreeAndNil помогает в таком случае.
← →
newbie2 (2006-06-01 17:33) [7]FreeAndNil требует var объект, у меня
published
property
как преобразовать не подскажите?
← →
han_malign © (2006-06-01 17:38) [8]
> глючит наверное
- это вас глючит, с какой радости операции с myColl будут влиять на содержимое myColl2?
И каким образом Один экземпляр TCollectionItem может быть в Двух TCollection - это-ж как извратиться надо?
← →
StriderMan © (2006-06-01 17:49) [9]
> - это вас глючит, с какой радости операции с myColl будут
> влиять на содержимое myColl2?
> И каким образом Один экземпляр TCollectionItem может быть
> в Двух TCollection - это-ж как извратиться надо?
я так понял что это две несвязные коллекции. или я че-т не догнал?
← →
newbie2 (2006-06-01 17:52) [10]уважаемый han_malign не кричите, а поясните TCollection что хранит ссылку на объект или копию объекта?
IMHO:
если ссылку то после первого цикла удаления Assigned(myColl2[i]) должен возвращать FALSE
если копию объекта то myColl2[i].Free не должен давать ошибку
но у меня Assigned(myColl2[i]) дает TRUE myColl2[i].Free следующий за ним выдает ошибку, объясните ПОЧЕМУ?
← →
newbie2 (2006-06-01 17:53) [11]StriderMan
это две коллекции хранящие один список объектов
← →
han_malign © (2006-06-01 18:05) [12]
> я так понял что это две несвязные коллекции.
- правильно понял...
А в свете еще одной ветки ветки автора - понятно почему ошибка:
- От уничтожения экземпляра(1) TCollectionItem в myColl, другой экземпляр(2) TCollectionItem в myColl2, в котором есть ссылка на объект уничтоженный в (1) - не уничтожится и значение ссылки, никаким образом, не обнулится, и, при уничтожениии (2), повторное уничтожени по битой ссылке приведет к Invalid pointer operation...
З.Ы. Assigned(myColl2[i]) - в коллекции НЕ МОЖЕТ быть нулевых ссылок - при уничтожении элемента - этот элемент извлекается!
← →
han_malign © (2006-06-01 18:09) [13]
> если ссылку то после первого цикла удаления Assigned(myColl2[i]) должен возвращать FALSE
P1: pointer; //ССЫЛКА
P2: pointer; //ССЫЛКА
P1:= TObject.Create;
P2:= P1;
TObject(P1).Free;
P1:= nil;
- и какое значение у ССЫЛКИ P2?
← →
newbie2 (2006-06-01 18:10) [14]тогда получается
> неужто просто myColl2.Clear?
из моего первого поста
правильно я понимаю?
← →
han_malign © (2006-06-01 18:26) [15]> неужто просто myColl2.Clear?
- не поможет...
Поможет покупка пособия для начинающих...
← →
StriderMan © (2006-06-01 18:31) [16]
> это две коллекции хранящие один список объектов
ну это вы махнули....
если уж такая необходимость, лучше TList взять
← →
newbie2 (2006-06-01 18:32) [17]han_malign ну ладно я понимаю вы гуру , все дела...
но неужто у вас подобной ситуации не бывало, как вы поступите
я имею ввиду код, а не умные изречения
← →
Alx2 © (2006-06-01 18:38) [18]>newbie2 (01.06.06 18:32) [17]
Писали уже. FreeAndNil, либо заниливать вручную.
Иначе каждого дважды убиваешь. А Free - он не сбрасывает в Nil убиенного.
А assigned только проверяет ненильность аргумента. Это еще не значит, что аргумент жив.
← →
newbie2 (2006-06-01 18:38) [19]StriderMan да не могу я TList взять, неужто вы думаете я оперирую чистыми TCollection?
TCollection это только предок, а на него уже накручена гора кода, при этом коллекции лежит глубоко в компонентах (fastreport)
← →
Alx2 © (2006-06-01 18:43) [20]Вдогонку Alx2 © (01.06.06 18:38)
Непросек сразу. Нильность не спасает. У тебя ссылки независимые.
Но правило одно: убивать не более одного раза.
← →
StriderMan © (2006-06-01 18:45) [21]ну freeAndNil можно заменить на
Item.Free;
Item := nil;
а переписать метод Clear нет возможности?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c