Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить объекты? [D5]


Страницы:   1 2

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]

не помогло


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо