![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Необходимость деструктора в описании своего класса [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.