Delphi :'属性ClientHeight不存在'

kjthegm6  于 2023-08-04  发布在  其他
关注(0)|答案(5)|浏览(160)

我的 Delphi 程序构建和编译都很好,但是当它在调试模式下运行时,我得到以下错误:
属性ClientHeight不存在
在浏览了所有的.DFM文件源之后,每一种形式的代码都在那里;
客户端高度= 111
我不明白我哪里做错了?

5kgi1eie

5kgi1eie1#

您的表单将被保存在更新版本的 Delphi 中。不幸的是,您需要在IDE中打开每个窗体并再次保存它,以清除较新的属性。有一个工具可以帮助你,称为DFMCheck(http://andy.jgknet.de/blog/ide-tools/dfmcheck/)。这是一个插件,它将遍历所有表单,并告诉您表单的任何问题,这些问题只会在运行时显示。
你看到问题的原因是这样的。 Delphi 保存表单的所有属性。它使用流在运行时加载表单。当它试图加载一个不存在的属性的表单时,你会得到这样的错误,因为流媒体系统试图在组件上设置属性,而该属性不存在。

ikfrs5lh

ikfrs5lh2#

我知道这是旧的线程,但希望这将有助于其他有这个问题。
在这种情况下,你的类继承自其他类,并且你知道属性在那里,只需重新发布它们。添加一个已发布的部分并再次添加它们,例如:

published
property ClientWidth;
property ClientHeight;

字符串
然后,这将迫使编译器编译这些类型信息,以用于父类可能具有正向声明的部分,从而解决您的问题。希望它能帮助到一些人,我花了3天的时间才最终找到解决方案。

4ktjp1zp

4ktjp1zp3#

同样的错误也发生在现代 Delphi 中(例如。Rio 10.3)与FMX框架。经过一些调查,发现这是由调整TFrame继承引起的。示例如下:

type
  // Declaration of custom type
  TFrameEx = class(TFrame) .. {here I override a couple of methods} end;

// Causes a bug (described below)
TMyFrame = class(TFrameEx)

// Works fine
TMyFrame = class(TFrame)

字符串
说明:
由于类型改变, Delphi 无法在FMX和VCL之间正确选择TMyFrame类型。因此,当在IDE中打开TMyFrame时,它将要求剥离FMX属性(在VCL中不存在,例如,FMX属性)。宽度)并添加VCL属性(例如ClientWidth)。保存后,这会使TMyFrame有错误-它会在初始化时在运行时显示“属性ClientHeight doesNot Exist”错误。

au9on6nz

au9on6nz4#

有类似的bug首先,你需要一个dfm文件为您的帧。当您继承一个框架时,dfm文件必须以“inherited MyFrame:TFRameEx”和NOT“对象MyFrame:TFrameEx”。没有继承的,当我这样做的时候,它添加了TForm属性,在编辑器中框架有TForm事件,在 Delphi 10.3中。所以 Delphi 确实需要dfm来找到正确的类型。如果您使用ide菜单,它将自动完成。New->Others->inheritables它将创建带有继承行的dfm,创建一个文件,其中包含{$R *.dfm},项目源代码“unitname in '. pas' {MyFrame TFrame};“或者你可以用手做。至于在同一个单元中有多个帧的可能性,我没有测试过,但由于线路是{$R *.dfm},这可能是可行的。
希望这是一个评论的解决kromster,但不能评论显然。

wgx48brx

wgx48brx5#

在我的例子中,我继承了保存在 Delphi 中的TFrame,并更改了.dfm来解析。
第一行:“object”frmMain:TfrmMain
我改成了“继承”,像这样:继承frmMain:TfrmMain

相关问题