Главная страница
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.119 c
14-1084156747
TGero
2004-05-10 06:39
2004.05.30
TImage - ничто, Delphi - все!


3-1083650137
TankMan
2004-05-04 09:55
2004.05.30
Что делать со скроллингом в DBGrid


14-1084515269
Rule
2004-05-14 10:14
2004.05.30
Направте на правильный путь решения проблеммы..


4-1082030697
mich
2004-04-15 16:04
2004.05.30
WNetGetUniversalName


14-1084302337
Drakon
2004-05-11 23:05
2004.05.30
Математические алгоритмы вычисления Sin, Cos, Tan