Главная страница
    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.012 c
2-1149186755
Mr tray
2006-06-01 22:32
2006.06.18
Dll не видит функции юнита


1-1147537027
varfolomey
2006-05-13 20:17
2006.06.18
Баг с клавой


2-1149068744
volkodav
2006-05-31 13:45
2006.06.18
Проблема с функцией CopyFile


2-1149226040
Niko
2006-06-02 09:27
2006.06.18
Репозиторий в приложении


3-1146027641
Savek
2006-04-26 09:00
2006.06.18
Присвоить значение QRGroup.Expression





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский