Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Экземпляр класса


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо