首页 > 解决方案 > Delphi Frame继承属性不存在

问题描述

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

  TCustomFrame = class(TFrame);

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

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

  TfStore = class(TFrameObserver)

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

属性 fStore.Size.Width 不存在

当我忽略这些错误时,我在 .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

标签: delphifiremonkey

解决方案


TFrame 是一个由 IDE 完成特殊魔法的类。

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

我看到你需要一个接口。在第一个(祖先)框架中定义它并将其添加到类声明中。

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

这是具有接口的基本框架(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

推荐阅读