Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Как удалить объекты?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1148586287
GEN++
2006-05-25 23:44
2006.06.18
Нужен бесплатный компонент


11-1128965722
Riton
2005-10-10 21:35
2006.06.18
TKOLTreeview - item reaching


15-1148392592
vidiv
2006-05-23 17:56
2006.06.18
как перехватит буфер обмена при вставки в richedit


3-1145868776
cosmos
2006-04-24 12:52
2006.06.18
Ошибка подключения к Paradox через ADO


1-1147201373
Leonardo
2006-05-09 23:02
2006.06.18
Своя рамка в ListBox