Перейти к содержанию
  • 0
gonzales

DisposeOf не вызывает деструктор (сам нашел причину, но решил написать)

Вопросы

Доброго времени суток!

Использую 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

вызывается виртуальный метод TObject.Destroy; виртуальный здесь ключевое! виртуальные методы хранятся в спецтабличке 
Вы же разместили свой деструктор вне этой таблицы сделав его статичным.
статичным он стал потому что нет правильного модификатора, по факту Вы написали destructor Destroy;пусто;
модификатор overload - это из оперы несколько методов с одним названием.
Destroy вызывается у всех типов в цепочке наследования кроме вашего типа, для вашего типа виртуальный Destroy не определен

Поделиться сообщением


Ссылка на сообщение
  • 0

overload - с помощью этой директивы можно объявлять одноименные методы/процедуры с разным набором параметров

override - эта деректива перекрывает реализацию виртуального/динамического метода/конструктора/деструктора/ родительского класса и обозначает, что у наследника она будет своя

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...