德尔福:'Property ClientHeight不存在'

时间:2014-03-04 19:32:53

标签: delphi properties height client dfm

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

  

属性ClientHeight不存在

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

  

ClientHeight = 111

我不明白我在哪里出错?

5 个答案:

答案 0 :(得分:6)

您的表单将使用较新版本的Delphi保存。遗憾的是,您需要在IDE中打开每个表单并再次保存以清除较新的属性。有一个工具可以帮助您调用DFMCheck(http://andy.jgknet.de/blog/ide-tools/dfmcheck/)。这是一个附加内容,它将遍历所有表单,并告诉您表单中只会出现的任何问题。

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

答案 1 :(得分:3)

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

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

published
property ClientWidth;
property ClientHeight;

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

答案 2 :(得分:2)

在带有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不存在”错误。

答案 3 :(得分: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' { MyFrame TFrame};"或者你可以手工完成。 至于在同一个单元中有多个帧的可能性,我自己还没有测试过,但由于该行是 {$R *.dfm} 可能是可行的。

希望它是对 kromster 解决方案的评论,但显然不能评论。

答案 4 :(得分:0)

在我的例子中,我继承了在 Delphi 7 中保存的 TFrame,我更改了 .dfm 来解析。

第一行:"object" frmMain: TfrmMain

我改成“继承”了,像这样:inherited frmMain: TfrmMain