![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Экземпляр класса
faiwer © (2009-09-24 11:48:00)[code]function TFotoViewer.Add(caption: string; id: smallint): boolean;
var im: TImageBox;
begin
im:=TImageBox.Create(self);
im.Parent:=panel;
im.Caption:=caption;
im.OnClick:=SetCurIndex;
im.OnDblClick:=self.OnDblClick;
im.Left:=panel.Width+1;
Items.Add(im);
if self.Showing then ItemIndex:=Items.Count-1;
end;[/code]
где Items это Items: TList<TImageBox>; а TImageBox это компонент на основе панели, рисунка и метки. собственно вопрос, а что происходит с Im после окончания процедуры Add? и вообще такой код нормальный с точки зрения распределения памяти? TList при Destroy-е сам удаляет все своим Items которые TImageBox, а вот что из себя представляет Im я не понимаю. Это указатель на размещение экземпляра на в ОЗУ? в общем такой код оптимален или мне надо его переделывать?
P.S.CodeGear 2009
faiwer (2009-09-24 14:48:00) [41]не люблю списки из указателей :) мне бы пришлось по всему коду кидать чтото вроде @ ^ ( ... as TImageBox). и прочее. этой мой первый компонент, к тому же для дела, и я решил без лишнего геммороя
Сергей М. (2009-09-24 14:39:00) [42]Ты вот скажи, за каким лешим тебе в дан.ситуации потребовались дженерики ?
Чем не угодило обычное объявление
Items: TObjectList;
?
faiwer (2009-09-24 14:26:00) [43]
procedure TFotoViewer.SetCurIndex(Sender: TObject);
var
i: smallint;
begin
for i := 0 to Items.Count - 1 do
begin
if sender=items.Items[i] then begin
ItemIndex:=i; Exit;
end;
end;
Click;
end;
написал СВОЙ IndexOf, заработало... не знаю насколько это оптимально, но так лучше чем никак :D
faiwer (2009-09-24 14:03:00) [44]задействовал TObjectList вместо TList, и всё бы хорошо, но теперь вот такая конструкция:
function TFotoViewer.Add(caption: string; id: smallint): boolean;
var num: smallint;
begin
num:=Items.Add(TImageBox.Create(self));
...
Items[num].OnClick:=SetCurIndex;
...
end;
procedure TFotoViewer.SetCurIndex(Sender: TObject);
begin
if Sender is TImageBox then ItemIndex:=Items.IndexOf(Sender as TImageBox);
Click;
end;
Перестала работать. Грубо говоря попытка получить Items.IndexOf(Sender as TImageBox) стало приводить в ошибке памяти. Стоит только поменять описание Items на обычный TList<TImageBox>, и Items:=TObj... на обычный TList<TImageBox> как код работает на ура.
Ошибка происходит в следующем. При клике на ImageBox я должен получить его ID в списке Items, для того чтобы мог его выбрать. раньше IndexOf возвращало как раз индекс этого ImageBox в массиве, сейчас просто ошибка памяти (Acces Violation).
Могу скинуть файл целиком.
Сергей М. (2009-09-24 12:56:00) [45]http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Generics_Collections_TObjectList.html
faiwer (2009-09-24 12:47:00) [46]items: TObjectList<TImageBox>
вот такой? если я его буду использовать он будет при Delete,Destroy сам удалять их? мне просто будет достаточно вызвать Delete(i) и Destroy?
Сергей М. (2009-09-24 12:42:00) [47]
> faiwer © (24.09.09 12:37) [4]
Я не понял, ЧТО мешает задействовать T ObjectList вместо TList ?
faiwer (2009-09-24 12:37:00) [48]нее.
я пишу для своей программы компонент TFotoViewer
у него разумеется свой Destroy; и я в этом Destroy освобождаю каждый компонент (а надо ли? или он может автоматом?)
на данный момент умну так:
destructor TFotoViewer.Destroy;
begin
Clear;
panel.free;
inherited Destroy;
end;
Но могу сделать так:
destructor TFotoViewer.Destroy;
var
i: byte;
begin
Clear;
if Items.Count>0 then
for i:=Items.Count-1 downto 0 do begin
Items.Items[i].Free;
Items.Delete(i);
end;
panel.free;
inherited Destroy;
end;
Сергей М. (2009-09-24 12:32:00) [49]
> faiwer © (24.09.09 12:21) [2]
Как ты его переделывать собрался ? Править исходники TList что ли ?
faiwer (2009-09-24 12:21:00) [50]Сергей М., а если этот код оставить таким же но переделать Destroy вот так:
if Items.Count>0 then
for i:=Items.Count-1 downto 0 do begin
Items.Items[i].Free;
Items.Delete(i);
end;
Тогда утечек памяти не будет?
Сергей М. (2009-09-24 12:13:00) [51]
> TList при Destroy-е сам удаляет все своим Items которые
> TImageBox
Ничего он не удаляет.
> что из себя представляет Im я не понимаю
Переменная объектного типа - специальный типизированный указатель.
> указатель на размещение экземпляра на в ОЗУ?
Не в ОЗу , а в ВАП процесса.
> надо его переделывать?
Надо. Иначе будут утечки памяти.
Самое простое - заменить TList на TObjectList. При его разрушении он будет ответстверен за разрушение объектов в своем списке Items