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

Вниз

Удаление списка?   Найти похожие ветки 

 
Mishenka   (2004-05-17 01:11) [0]

Нужно ли при удалении списка удалять каждый его элеммент или вызова метода Free будет достаточно?


 
GuAV ©   (2004-05-17 01:13) [1]


> Нужно ли при удалении списка удалять каждый его элеммент
> или вызова метода Free будет достаточно?


зависит от того, что есть список


 
Mishenka   (2004-05-17 01:25) [2]

Список TList


 
Ihor Osov'yak ©   (2004-05-17 01:35) [3]

Вызов метода Free класса TList уничтожает экземпляр самого TList, но не те вещи, которые есть элементами списка. Нужно ли "освобождать" элементы списка, и как "осводождать" - зависит от задачи и природы самих элементов. Но точно можно сказать, что Delete для каждого элемента перед уничтожением списка вызывать совершенно ни к чему. Так как Delete удаляет ссылку из списка (не затрагивая саму "вещь", на которую указывает ссылка), из списка, который все равно будет уничтожен с помощью free.

Зы - обратите внимание, что я использовал слово "вещь" вместо "экземпляр обьекта" - так как экземпляр TList в общем случае содержит указатели на что угодно, или даже не указатели, и как "освобождать" это "что угодно" TList в принцыпе знать не может.


 
Rouse_ ©   (2004-05-17 01:37) [4]

Items у него идет от TPersistent

Смотрим добавление:
procedure TCustomListBox.SetItems(Value: TStrings);
begin
 if Style in [lbVirtual, lbVirtualOwnerDraw] then
   case Style of
     lbVirtual: Style := lbStandard;
     lbVirtualOwnerDraw: Style := lbOwnerDrawFixed;
   end;
 Items.Assign(Value);
end;


Смотрим деструктор класса:
destructor TCustomListBox.Destroy;
begin
 inherited Destroy;
 FCanvas.Free;
 FItems.Free;
 FSaveItems.Free;
end;


Смотрим следующий деструктор:
destructor TStrings.Destroy;
begin
 StringsAdapter := nil;
 inherited Destroy;
end;


А теперь видем то, что нас и интересует:
destructor TPersistent.Destroy;
begin
 RemoveFixups(Self);
 inherited Destroy;
end;


Которое можно расписать вот так:
procedure RemoveFixups(Instance: TPersistent);
var
 I: Integer;
 Fixup: TPropFixup;
begin
 if GlobalFixupList = nil then Exit;
 with GlobalFixupList.LockList do
 try
   for I := Count - 1 downto 0 do
   begin
     Fixup := Items[I];
     if (Fixup.FInstance = Instance) then
     begin
       Delete(I);
       Fixup.Free;
     end;
   end;
 finally
   GlobalFixupList.UnlockList;
 end;
end;


И еще чуть ниже:
procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;


Вывод: достаточно взглянуть на код...


 
Ihor Osov'yak ©   (2004-05-17 01:45) [5]

> Items у него идет от TPersistent

Или Вы ошиблисть веткой, или немного не того...


 
Rouse_ ©   (2004-05-17 01:53) [6]

> [5] Ihor Osov"yak ©   (17.05.04 01:45)
Опс... я не про то подумал... мои извинения...



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
4-1082520099
marina
2004-04-21 08:01
2004.05.30
Рисование


1-1084724706
killer
2004-05-16 20:25
2004.05.30
функция округления


1-1084667934
IrBisoff
2004-05-16 04:38
2004.05.30
OwnerDraw TLabel


14-1084254602
Vlad Oshin
2004-05-11 09:50
2004.05.30
по одной и той же ссылке хожу на разные страницы. Почему?


3-1083581813
Hound_Dog
2004-05-03 14:56
2004.05.30
TDBImage не показывает картинки из БД через ADO