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

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

Необходимость деструктора в описании своего класса [D6, WinME, Win2k]


SergP. ©   (2005-05-25 18:25:00) 

Пишу некоторый класс:


type
    TMonth = class(TEdit)
  public
    constructor Create(Aowner:TComponent); override;
  private
    month:byte;
    procedure setValue(value:byte);
    procedure OnPopupClick(sender:TObject);
  published
    property value:byte read month write setvalue;
end;

...
const
  monthlist: array[1..12] of string[8] = ('січень','лютий','березень','квітень','травень','червень','липень','серпень','вересень','жовтень','листопад','грудень') ;
...

constructor TMonth.Create(Aowner:TComponent);
var
i:integer;
MenuItem:TmenuItem;
begin
 inherited Create(Aowner);
 Text:='';
 ReadOnly:=true;
 PopupMenu:=TPopupMenu.create(Aowner);
 PopupMenu.Items.Clear;
 for i:=1 to 12 do
 begin
   MenuItem:=TMenuItem.Create(PopupMenu);
   MenuItem.Caption:=monthlist[i];
   PopupMenu.Items.Add(MenuItem);
   MenuItem.Tag:=i;
   MenuItem.OnClick:=OnPopupClick;
 end;
end;

procedure TMonth.OnPopupClick(sender:TObject);
begin
month:=TMenuItem(sender).tag;
text:=TMenuItem(sender).Caption;
end;

procedure TMonth.setValue(value:byte);
begin
 if (value>0) and (value<13) then month:=value;
 text:=monthlist[value];
end;


нужно ли мне писать деструктор? Или необязательно?


Mx   (2005-05-25 19:13:00) [1]

Правильно, уничтожение формы приведет к вызову ее DestroyComponents, а потом к этому же методу всех ее компонентов, но если этот PopupMenu "жить не может" без TMonth, то Owner'ом корректно сделать TMonth, а иначе будет то, о чем написал Eraser © (25.05.05 18:43) [8].


SergP.   (2005-05-25 18:52:00) [2]


> Mx ©   (25.05.05 18:43) [7]
> Уничтожится, но "зашиваться" на "внешний" Owner думаю не
> стоит, лучше Owner'ом меню сделать сам экземпляр TMonth,
> то бишь Self.


на всякий случай так и сделал....


SergP.   (2005-05-25 18:48:00) [3]


> Eraser ©   (25.05.05 18:43) [8]


Ага. Понятно... Просто в моем случае создается форма, на ней ScrollBox, а уже на нем куча всяких объектов, в том числе и объектов вышеупомянутого класса, а уничтожаться все планируется методом уничтожения самой формы...


Mx   (2005-05-25 18:43:00) [4]

Уничтожится, но "зашиваться" на "внешний" Owner думаю не стоит, лучше Owner'ом меню сделать сам экземпляр TMonth, то бишь Self.


Eraser   (2005-05-25 18:43:00) [5]

SergP.   (25.05.05 18:40) [5]

А если экземпляры твоего класса то создаются, то уничтожаются по ходу выполнения программы, при этом программа "резидентная", т.е. всегда работает, и ещё при этом комп, на котором она установлена,  почти никогда не перезагружают, что тоже частое явления в различных учереждениях... через некоторое время твоя прога сожрёт всю память.


SergP.   (2005-05-25 18:41:00) [6]

Вот просто сомнения возникли...
PopupMenu разве не уничтожится при уничтожении своего Owner'а?


SergP.   (2005-05-25 18:40:00) [7]

Вот просто сомнения возникли...
PopupMenu разве не уничтожится при уничтожении своего Owner'а?


Mx   (2005-05-25 18:38:00) [8]

А если в PopupMenu:=TPopupMenu.create(Aowner) вместо AOwner поставить Self то необходимости в деструкторе не вижу. TComponent.DestroyComponents всё сама разрушит.


Eraser   (2005-05-25 18:33:00) [9]

TUser ©   (25.05.05 18:32) [2]

А айтемы причём? Разве они не уничтожатся в деструкторе TPopupMenu?


TUser   (2005-05-25 18:32:00) [10]

Да, в деструкторе надо будет уничтожить PopupMenu и его итемы


Eraser   (2005-05-25 18:31:00) [11]

SergP.   (25.05.05 18:25)

Нужно.
Деструктор необходим для освобождения ресурсов, занятых в конструкторе. В конструкторе у тебя создан экз. класса TPopupMenu.


Наверх

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