Delphi 继承的框架 属性 不存在

Delphi Frame inherited property does not exist

在 Firemonkey Delphi 10.3 中,我创建了一个自定义 TFrame 类型来添加功能:

  TCustomFrame = class(TFrame);

  TFrameObserver = class(TCustomFrame, IObserver)
  public
    procedure Update; virtual;
  end;

然后我的框架继承自这个 class :

  TfStore = class(TFrameObserver)

一切都很好,我保存了它,今天早上我在设计时间(与执行时间相同)打开时收到错误消息:

Property fStore.Size.Width does not exist

当我忽略这些错误时,我看到在 .fmx 中,它删除了 属性 :

Size.Width
Size.Height
Size.PlateformDefault

并添加:

ClientWidth
ClientHeight

如果我这样做,就成功了:

TfStore = class(TFrame, IObserver)

我是不是做错了什么?

重现:

关闭再打开项目出现错误

这是我项目中的代码:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type
  IFrameTest = interface
    procedure Test;
  end;

  TFrameTest = class(TFrame);

  TFrameITest = class(TFrameTest, IFrameTest)
    procedure Test; virtual;
  end;

  TFrame2 = class(TFrameITest)
  private
    { Déclarations privées }
  public
    procedure Test; override;
  end;

implementation

{$R *.fmx}

{ TFrameITest }

procedure TFrameITest.Test;
begin
  //
end;

{ TFrame2 }

procedure TFrame2.Test;
begin
  inherited;
  //
end;

end.

以及对应的FMX文件:

object Frame2: TFrame2
  Size.Width = 320.000000000000000000
  Size.Height = 240.000000000000000000
  Size.PlatformDefault = False
end

TFrame 是一个 class,IDE 对其施展了特殊的魔法。

要从另一个框架继承框架,首先使用 IDE 创建框架,然后使用 IDE 创建继承的框架(菜单文件/新建/其他.../可继承的项目/ select第一帧)。

我知道你需要一个界面。在第一个(祖先)框架中定义它并将其添加到 class 声明中。

当你有继承的框架时,你可以(不是强制的,取决于你想做什么)覆盖实现接口的虚拟方法。

这是具有接口的基本框架 (TFrame3) 的代码:

unit Unit3;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

type
  IFrameTest = interface
    procedure Test;
  end;

  TFrame3 = class(TFrame)
  private
    { Private declarations }
  public
    procedure Test; virtual;
  end;

implementation

{$R *.fmx}

{ TFrame3 }

procedure TFrame3.Test;
begin
    ShowMessage('TFrame3.Test');
end;

end.

以及对应的FMX文件:

object Frame3: TFrame3
  Size.Width = 320.000000000000000000
  Size.Height = 240.000000000000000000
  Size.PlatformDefault = False
end

这里是继承框架(TFrame4)的代码:

unit Unit4;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  Unit3;

type
  TFrame4 = class(TFrame3)
  private
    { Private declarations }
  public
    procedure Test; override;
  end;

var
  Frame4: TFrame4;

implementation

{$R *.fmx}

{ TFrame4 }

procedure TFrame4.Test;
begin
    ShowMessage('TFrame4.Test');
end;

end.

以及对应的FMX:

inherited Frame4: TFrame4
  Size.Width = 455.000000000000000000
  Size.Height = 337.000000000000000000
end