Главная страница
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.072 c
2-1149058692
Zhekson
2006-05-31 10:58
2006.06.18
почему ValInt := StrToInt( 1 ); выдаёт EConvertError


15-1148137010
YurikGL
2006-05-20 18:56
2006.06.18
Remote desktop в win200 Server потеря сеанса...


3-1145957654
kyn66
2006-04-25 13:34
2006.06.18
SQL-запрос с параметрами выдает ошибки


15-1148393861
vidiv
2006-05-23 18:17
2006.06.18
Сложно ли сделать простую TPanel с простыми "системными" скролами


15-1148554071
Crazy manager
2006-05-25 14:47
2006.06.18
Практический вопрос о планирование в маленькой конторе