我的 Delphi 程序构建和编译都很好,但是当它在调试模式下运行时,我得到以下错误:属性ClientHeight不存在在浏览了所有的.DFM文件源之后,每一种形式的代码都在那里;客户端高度= 111我不明白我哪里做错了?
5kgi1eie1#
您的表单将被保存在更新版本的 Delphi 中。不幸的是,您需要在IDE中打开每个窗体并再次保存它,以清除较新的属性。有一个工具可以帮助你,称为DFMCheck(http://andy.jgknet.de/blog/ide-tools/dfmcheck/)。这是一个插件,它将遍历所有表单,并告诉您表单的任何问题,这些问题只会在运行时显示。你看到问题的原因是这样的。 Delphi 保存表单的所有属性。它使用流在运行时加载表单。当它试图加载一个不存在的属性的表单时,你会得到这样的错误,因为流媒体系统试图在组件上设置属性,而该属性不存在。
ikfrs5lh2#
我知道这是旧的线程,但希望这将有助于其他有这个问题。在这种情况下,你的类继承自其他类,并且你知道属性在那里,只需重新发布它们。添加一个已发布的部分并再次添加它们,例如:
published property ClientWidth; property ClientHeight;
字符串然后,这将迫使编译器编译这些类型信息,以用于父类可能具有正向声明的部分,从而解决您的问题。希望它能帮助到一些人,我花了3天的时间才最终找到解决方案。
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”错误。
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,但不能评论显然。
wgx48brx5#
在我的例子中,我继承了保存在 Delphi 中的TFrame,并更改了.dfm来解析。第一行:“object”frmMain:TfrmMain我改成了“继承”,像这样:继承frmMain:TfrmMain
5条答案
按热度按时间5kgi1eie1#
您的表单将被保存在更新版本的 Delphi 中。不幸的是,您需要在IDE中打开每个窗体并再次保存它,以清除较新的属性。有一个工具可以帮助你,称为DFMCheck(http://andy.jgknet.de/blog/ide-tools/dfmcheck/)。这是一个插件,它将遍历所有表单,并告诉您表单的任何问题,这些问题只会在运行时显示。
你看到问题的原因是这样的。 Delphi 保存表单的所有属性。它使用流在运行时加载表单。当它试图加载一个不存在的属性的表单时,你会得到这样的错误,因为流媒体系统试图在组件上设置属性,而该属性不存在。
ikfrs5lh2#
我知道这是旧的线程,但希望这将有助于其他有这个问题。
在这种情况下,你的类继承自其他类,并且你知道属性在那里,只需重新发布它们。添加一个已发布的部分并再次添加它们,例如:
字符串
然后,这将迫使编译器编译这些类型信息,以用于父类可能具有正向声明的部分,从而解决您的问题。希望它能帮助到一些人,我花了3天的时间才最终找到解决方案。
4ktjp1zp3#
同样的错误也发生在现代 Delphi 中(例如。Rio 10.3)与FMX框架。经过一些调查,发现这是由调整TFrame继承引起的。示例如下:
字符串
说明:
由于类型改变, Delphi 无法在FMX和VCL之间正确选择TMyFrame类型。因此,当在IDE中打开TMyFrame时,它将要求剥离FMX属性(在VCL中不存在,例如,FMX属性)。宽度)并添加VCL属性(例如ClientWidth)。保存后,这会使TMyFrame有错误-它会在初始化时在运行时显示“属性ClientHeight doesNot Exist”错误。
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,但不能评论显然。
wgx48brx5#
在我的例子中,我继承了保存在 Delphi 中的TFrame,并更改了.dfm来解析。
第一行:“object”frmMain:TfrmMain
我改成了“继承”,像这样:继承frmMain:TfrmMain