Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1149092376
Loginov Dmitry
2006-05-31 20:19
2006.06.18
Работа с пакетами


15-1148218724
Desdechado
2006-05-21 17:38
2006.06.18
Лето близится. Как настроение?


2-1149159277
koha
2006-06-01 14:54
2006.06.18
CreateProcess


2-1149175089
dimak-2k
2006-06-01 19:18
2006.06.18
Проверка о существовании файла и кое-что о RadioGroup


1-1147463679
Kostromich
2006-05-12 23:54
2006.06.18
Анализ содержимого выбраной директории





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский