Delphi 框架继承属性不存在

7hiiyaii  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(114)

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

TCustomFrame = class(TFrame);

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

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

TfStore = class(TFrameObserver)

一切都很好,我保存它,今天早上我在设计时打开时出现错误消息(在执行时也是如此):
您访问的页面不存在!
当我忽略这些错误时,我看到在.fmx中,它删除了属性:

Size.Width
Size.Height
Size.PlateformDefault

并添加:

ClientWidth
ClientHeight

如果我这么做,那就是工作:

TfStore = class(TFrame, IObserver)

我做错什么了吗?
复制:

  • 创建一个新的Firemonkey项目
  • 添加一个从下面的测试继承的TFrame:

类型IFrameTest =接口过程Test; return class();

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

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

关闭并打开项目以显示错误
下面是我的项目代码:

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
carvr3hs

carvr3hs1#

TFrame是一个类,IDE为它做了特殊的魔术。
要从另一个框架继承一个框架,请首先使用IDE创建框架,然后使用IDE(菜单文件/新建/其他./ Inheritable items /选择第一帧)。
我知道你需要一个接口。在第一个(祖先)框架中定义它,并将其添加到类声明中。
当你拥有继承的框架时,你可以(不是强制的,取决于你想做什么)覆盖实现接口的虚方法。
下面是具有接口的基本帧(TFrame 3)的代码:

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

下面是继承帧(TFrame 4)的代码:

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

相关问题