7

我的 Delphi 程序可以很好地构建和编译,但是一旦在调试模式下运行,就会出现以下错误;

属性 ClientHeight 不存在

在查看了所有 .DFM 文件源之后,每种形式的代码都在那里;

客户高度 = 111

我不明白我哪里出错了?

4

5 回答 5

7

您的表单将使用较新版本的 Delphi 保存。不幸的是,您需要在 IDE 中打开每个表单并再次保存以清除较新的属性。有一个可以帮助您的工具称为 DFMCheck ( http://andy.jgknet.de/blog/ide-tools/dfmcheck/ )。这是一个附加组件,它将遍历您的所有表单,并告诉您仅在运行时显示的表单的任何问题。

您看到问题的原因是这样的。Delphi 保存具有所有属性的表单。它使用流在运行时加载表单。当它尝试加载具有不存在属性的表单时,您将收到类似这样的错误,因为流系统试图在属性不存在时在组件上设置属性。

于 2014-03-04T19:41:49.950 回答
7

我知道这是旧线程,但希望这会帮助其他有这个问题的人。

在这种情况下,您的类从其他类继承并且您知道属性在那里,只需重新发布它们。添加已发布的部分并再次添加它们,例如:

published
property ClientWidth;
property ClientHeight;

然后,这会强制编译器为父类可能具有前向声明的部分编译这些类型信息,从而解决您的问题。希望它对某人有所帮助,我花了 3 天时间才最终找到解决方案。

于 2015-02-06T11:44:56.377 回答
5

在具有 FMX 帧的现代 Delphi(例如 Rio 10.3)中也会发生同样的错误。经过一番调查,发现它是由调整 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 中不存在,例如 Size.Width)并添加 VCL 属性(例如 ClientWidth)。保存后,这会使 TMyFrame 出错 - 它会在初始化时在运行时显示“Property ClientHeight 不存在”错误。

于 2019-02-05T12:49:15.340 回答
0

就我而言,我继承了保存在 Delphi 7 中的 TFrame,并且我更改了 .dfm 来解析。

第一行:“对象”frmMain:TfrmMain

我改为“继承”,像这样:继承frmMain:TfrmMain

于 2021-03-10T17:12:44.663 回答
0

有类似的错误。首先,您的框架需要一个 dfm 文件。继承框架时,dfm 文件必须以“inherited MyFrame: TFRameEx”而不是“object MyFrame: TFrameEx”开头。如果没有继承,当我这样做时,它正在添加 TForm 属性,并且在编辑器中框架有 TForm 事件,在 Delphi 10.3 中。所以delphi真的需要dfm来找到正确的类型。如果您使用 ide 菜单,它将自动完成。New->Others->inheritables 它将使用继承的行创建 dfm,在其中创建一个包含 {$R *.dfm} 的文件和项目源中的一行“unitname in '......pas' {我的框架 TFrame};" 或者你可以手工完成。至于在同一个单元中有多个帧的可能性,我自己还没有测试过,但由于该行是 {$R *.dfm} 它可能是可行的。

希望它是对克罗姆斯特解决方案的评论,但显然不能发表评论。

于 2021-01-09T10:26:59.217 回答