Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.021 c
1-1084970810
Zigmond
2004-05-19 16:46
2004.05.30
Обработка исключений


6-1081854176
Сережа550
2004-04-13 15:02
2004.05.30
Скролл в TWebBrowser


6-1081437214
som
2004-04-08 19:13
2004.05.30
проблема с навигацией по FTP серверу


1-1084559440
Dhg
2004-05-14 22:30
2004.05.30
Как определить цвет пикселя.


14-1084284261
296321823
2004-05-11 18:04
2004.05.30
delphigfx.mastak.ru




   Наверх