Delphi Frame继承的属性不存在

问题描述 投票:0回答:1

在 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)

我做错了什么吗?

重现:

  • 创建一个新的 Firemonkey 项目

  • 添加从下面的测试继承的 TFrame :

    类型 IFrameTest = 接口 程序测试; 结尾; TFrameTest = 类(TFrame);

    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
delphi firemonkey tframe
1个回答
2
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.