delphi - 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)
我做错什么了吗 ?
重现:
创建一个新的 Firemonkey 项目
添加从以下测试继承的 TFrame:
type 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
解决方案
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
推荐阅读
- c++ - 局部堆栈变量成员的返回值优化
- prism - 如何让依赖注入在 Prism for Xamarin 上工作?
- java - 使用 Maven 构建带有 res 文件夹的 jar
- c# - 为什么玩家要穿过墙壁地板门?
- android - Android Jetpack:设置 LiveData 时 RecyclerView 未更新
- css - PDFKIT 格式化页眉/页脚
- android - 如何将我的 XMPP 服务器 (ejabberd) 与 Firebase for Chat APP Android 连接
- node.js - 将 RTSP/HTTP 视频流转发到新的 HTTPS 流
- uefi - ExitBootServices 后 UEFI 硬盘访问
- c - ISO C 是否允许提供给 main() 的 argv[] 指针的别名?