gonzales Опубликовано 16 июля, 2020 Поделиться Опубликовано 16 июля, 2020 Доброго времени суток! Использую 10.4, пытаюсь в рантайме создать и удалить контролы. Вот простое приложение, две кнопки, вертикальный скролбокс и мемо. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; type TMyObject = class(TCircle) protected constructor Create(AOwnedObject: TComponent); Overload; constructor CreateCustom(AOwnedObject: TComponent); Overload; destructor Destroy; Overload; end; type TForm1 = class(TForm) VertScrollBox1: TVertScrollBox; Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} constructor TMyObject.Create(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Red; form1.Memo1.Lines.Add('create'); end; constructor TMyObject.CreateCustom(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Blue; form1.Memo1.Lines.Add('create'); end; destructor TMyObject.Destroy; begin form1.Memo1.Lines.Add('delete'); inherited; end; procedure TForm1.Button1Click(Sender: TObject); var MyCircle: TMyObject; I: Integer; begin for I := 0 to 5 do begin MyCircle := TMyObject.Create(VertScrollBox1); end; end; procedure TForm1.Button2Click(Sender: TObject); var MyCircle: TFmxObject; begin while VertScrollBox1.Content.ChildrenCount > 0 do begin MyCircle := VertScrollBox1.Content.Children[0]; VertScrollBox1.Content.RemoveObject(MyCircle); MyCircle.DisposeOf; MyCircle:=nil; end; end; end. проблема в уничтожении объектов - не заходит в деструктор, вообще, никак. Оказалось что директива Overload для декструктора не отрабатывает. Правильно было написать destructor Destroy; Override; Если, кто из гуру даст комментарий, почему так, буду благодарен (для общего развития); Цитата Ссылка на комментарий
0 Slym Опубликовано 17 июля, 2020 Поделиться Опубликовано 17 июля, 2020 вызывается виртуальный метод TObject.Destroy; виртуальный здесь ключевое! виртуальные методы хранятся в спецтабличке Вы же разместили свой деструктор вне этой таблицы сделав его статичным. статичным он стал потому что нет правильного модификатора, по факту Вы написали destructor Destroy;пусто; модификатор overload - это из оперы несколько методов с одним названием. Destroy вызывается у всех типов в цепочке наследования кроме вашего типа, для вашего типа виртуальный Destroy не определен gonzales 1 Цитата Ссылка на комментарий
0 gonzales Опубликовано 17 июля, 2020 Автор Поделиться Опубликовано 17 июля, 2020 overload - с помощью этой директивы можно объявлять одноименные методы/процедуры с разным набором параметровoverride - эта деректива перекрывает реализацию виртуального/динамического метода/конструктора/деструктора/ родительского класса и обозначает, что у наследника она будет своя Цитата Ссылка на комментарий
Вопрос
gonzales
Доброго времени суток!
Использую 10.4, пытаюсь в рантайме создать и удалить контролы.
Вот простое приложение, две кнопки, вертикальный скролбокс и мемо.
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; type TMyObject = class(TCircle) protected constructor Create(AOwnedObject: TComponent); Overload; constructor CreateCustom(AOwnedObject: TComponent); Overload; destructor Destroy; Overload; end; type TForm1 = class(TForm) VertScrollBox1: TVertScrollBox; Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} constructor TMyObject.Create(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Red; form1.Memo1.Lines.Add('create'); end; constructor TMyObject.CreateCustom(AOwnedObject: TComponent); begin inherited Create(AOwnedObject); Parent := AOwnedObject as TFmxObject; Width := 20; Height := 20; Align := TAlignLayout.Top; Fill.Color := TAlphaColors.Blue; form1.Memo1.Lines.Add('create'); end; destructor TMyObject.Destroy; begin form1.Memo1.Lines.Add('delete'); inherited; end; procedure TForm1.Button1Click(Sender: TObject); var MyCircle: TMyObject; I: Integer; begin for I := 0 to 5 do begin MyCircle := TMyObject.Create(VertScrollBox1); end; end; procedure TForm1.Button2Click(Sender: TObject); var MyCircle: TFmxObject; begin while VertScrollBox1.Content.ChildrenCount > 0 do begin MyCircle := VertScrollBox1.Content.Children[0]; VertScrollBox1.Content.RemoveObject(MyCircle); MyCircle.DisposeOf; MyCircle:=nil; end; end; end.
проблема в уничтожении объектов - не заходит в деструктор, вообще, никак.
Оказалось что директива Overload для декструктора не отрабатывает.
Правильно было написать
destructor Destroy; Override;
Если, кто из гуру даст комментарий, почему так, буду благодарен (для общего развития);
Ссылка на комментарий
2 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.