![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить объекты? [D5]
newbie2 © (2006-06-01 16:50:00)два 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?
StriderMan (2006-06-01 18:45:00) [1]ну freeAndNil можно заменить на
Item.Free;
Item := nil;
а переписать метод Clear нет возможности?
Alx2 (2006-06-01 18:43:00) [2]Вдогонку Alx2 © (01.06.06 18:38)
Непросек сразу. Нильность не спасает. У тебя ссылки независимые.
Но правило одно: убивать не более одного раза.
newbie2 (2006-06-01 18:38:00) [3]StriderManда не могу я TList взять, неужто вы думаете я оперирую чистыми TCollection?
TCollection это только предок, а на него уже накручена гора кода, при этом коллекции лежит глубоко в компонентах (fastreport)
Alx2 (2006-06-01 18:38:00) [4]>newbie2 (01.06.06 18:32) [17]
Писали уже. FreeAndNil, либо заниливать вручную.
Иначе каждого дважды убиваешь. А Free - он не сбрасывает в Nil убиенного.
А assigned только проверяет ненильность аргумента. Это еще не значит, что аргумент жив.
newbie2 (2006-06-01 18:32:00) [5]han_malignну ладно я понимаю вы гуру , все дела...
но неужто у вас подобной ситуации не бывало, как вы поступите
я имею ввиду код, а не умные изречения
StriderMan (2006-06-01 18:31:00) [6]
> это две коллекции хранящие один список объектов
ну это вы махнули....
если уж такая необходимость, лучше TList взять
han_malign (2006-06-01 18:26:00) [7]> неужто просто myColl2.Clear?
- не поможет...
Поможет покупка пособия для начинающих...
newbie2 (2006-06-01 18:10:00) [8]тогда получается
> неужто просто myColl2.Clear?
из моего первого поста
правильно я понимаю?
han_malign (2006-06-01 18:09:00) [9]
> если ссылку то после первого цикла удаления Assigned(myColl2[i]) должен возвращать FALSE
P1: pointer; //ССЫЛКА
P2: pointer; //ССЫЛКА
P1:= TObject.Create;
P2:= P1;
TObject(P1).Free;
P1:= nil;
- и какое значение у ССЫЛКИ P2?
han_malign (2006-06-01 18:05:00) [10]
> я так понял что это две несвязные коллекции.
- правильно понял...
А в свете еще одной ветки ветки автора - понятно почему ошибка:
- От уничтожения экземпляра(1) TCollectionItem в myColl, другойэкземпляр(2) TCollectionItem в myColl2, в котором есть ссылка на объект уничтоженный в (1)- не уничтожится и значение ссылки, никаким образом, не обнулится, и, при уничтожениии (2), повторное уничтожени по битой ссылке приведет к Invalid pointer operation...
З.Ы. Assigned(myColl2[i]) - в коллекции НЕ МОЖЕТ быть нулевых ссылок - при уничтожении элемента - этот элемент извлекается!
newbie2 (2006-06-01 17:53:00) [11]StriderMan
это две коллекции хранящие один список объектов
newbie2 (2006-06-01 17:52:00) [12]уважаемый han_malignне кричите, а поясните TCollection что хранит ссылку на объект или копию объекта?
IMHO:
если ссылку то после первого цикла удаления Assigned(myColl2[i]) должен возвращать FALSE
если копию объекта то myColl2[i].Free не должен давать ошибку
но у меня Assigned(myColl2[i]) дает TRUE myColl2[i].Free следующий за ним выдает ошибку, объясните ПОЧЕМУ?
StriderMan (2006-06-01 17:49:00) [13]
> - это вас глючит, с какой радости операции с myColl будут
> влиять на содержимое myColl2?
> И каким образом Один экземпляр TCollectionItem может быть
> в Двух TCollection - это-ж как извратиться надо?
я так понял что это две несвязные коллекции. или я че-т не догнал?
han_malign (2006-06-01 17:38:00) [14]
> глючит наверное
- это вас глючит, с какой радости операции с myColl будут влиять на содержимое myColl2?
И каким образом Один экземпляр TCollectionItem может быть в Двух TCollection - это-ж как извратиться надо?
newbie2 (2006-06-01 17:33:00) [15]FreeAndNil требует varобъект, у меня
published
property
как преобразовать не подскажите?
StriderMan (2006-06-01 17:20:00) [16]
> но почему тогда Assigned(myColl2[i]) возвращает TRUE ?
глючит наверное
у меня было похожее.
вызывал у TForm.Free
и после этого Assigned божился что TRUE
FreeAndNil помогает в таком случае.
newbie2 (2006-06-01 17:13:00) [17]но почему тогда Assigned(myColl2[i]) возвращает TRUE ?
StriderMan (2006-06-01 17:11:00) [18]Стоп. Пошли все на поводу
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.
StriderMan (2006-06-01 17:09:00) [19]
while MyColl.Count > 0 do
MyCol[0].free;
newbie2 (2006-06-01 17:05:00) [20]не помогло