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)
我是不是做错了什么?
重现:
创建一个新的 Firemonkey 项目
添加一个继承自以下测试的 TFrame :
类型
IFrameTest = 界面
程序测试;
结尾;
TFrameTest = class(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
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
在 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)
我是不是做错了什么?
重现:
创建一个新的 Firemonkey 项目
添加一个继承自以下测试的 TFrame :
类型 IFrameTest = 界面 程序测试; 结尾; TFrameTest = class(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
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