Delphi:EReadError,消息“属性持久性不存在”

时间:2009-04-28 14:52:55

标签: delphi exception

我用Delphi 7编写的程序编译好了,但是当我运行它时它会给我错误信息:

  

Project1.Exe引发异常类EReadError,消息'属性持久性不存在'。流程已停止。

这只是在我安装TMS Component Pack以用于此项目之后才开始。谢谢你的帮助。

6 个答案:

答案 0 :(得分:7)

  1. 在Delphi IDE中打开表单
  2. 使用Alt + F12编辑.DFM来源
  3. 搜索“持久性”属性
  4. 删除具有“持久性”属性的行
  5. DFM示例:

    SomeComponent1 = TSomeComponent
      OtherProperty = OtherValue
      Persistence = True
      AnotherProperty = AnotherValue
    end
    

    你也可以使用由Andreas Hausladen设计的伟大的DFMCheck 1.4工具。检查任何其他遗失的财产:

    http://andy.jgknet.de/blog/?page_id=177

    这很可能是由编译过的&安装的软件包与实际的.pas文件不同步。如果您有源代码,那么重建软件包可能会修复它。

答案 1 :(得分:0)

设置断点(F5)并逐步执行程序(F7 / F8)。获取获得该异常的位置,然后向我们提供有关它的更多信息(显示一些代码)。

答案 2 :(得分:0)

此错误意味着它正在尝试从DFM资源加载某些内容(通常是表单),并且它为其创建的组件所没有的属性提供了值。

如果只在您开始使用TMS组件时发生,解决方案很简单:不要使用它们。尽可能多地向作者发送有关错误和项目的信息,看看他们是否能找到解决问题的方法。在那之前,使用别的东西。

答案 3 :(得分:0)

如果您正在使用文本DFM(右键单击表单,请选中“文本DFM”,保存),您可以使用“搜索”|“在文件中查找”查找DFM文件中的所有Persistence实例。只需将搜索字符串设置为“Persistence”(我通常告诉它忽略大小写),将文件掩码设置为“* .dfm”,然后选中“项目中的所有文件”复选框。

如果您尚未使用文本DFM并且不想手动打开所有表单并选中该框然后重新保存它们,则可以使用CONVERT.EXE(在($ DELPHI)\ Bin文件夹中)进行转换他们是集体的。从任何命令提示符运行没有参数的CONVERT以查看选项。默认情况下,CONVERT会将.DFM保存为.txt,但您可以使用-i开关将其保存(使用文本.DFM重写二进制文件.DFM)。 (我通常先将.DFM备份到另一个文件夹,然后转换它们。如果没有报告错误,我可以稍后删除备份的.DFM。)

答案 4 :(得分:0)

升级到新版本时,我遇到了与TMS类似的问题:

如果您认为某个特定组件导致了问题,  删除它,在没有它的情况下编译项目,再将它放在表单/框架上。

如果这对您不起作用:

为了解决问题你需要做的事情,所以你可以使用Designer和新属性,因为那是你真正想要的,不是吗? :-):

  • 卸载TMS组件包(或您正在使用的任何内容)
  • 重新安装TMS组件包
  • 构建&安装软件包
  • 将适当的TMS .lib文件添加到您的应用程序项目(我正在使用C ++ Builder)
  • 将适当的TMS .pas文件添加到您的应用项目。例如,我遇到了TAdvSmoothCalendar组件的问题,所以我已将AdvSmoothCalender.pas添加到我的项目中。

干杯! 我希望它适用于遇到类似问题的每个人:)

答案 5 :(得分:0)

我和nuiGui Delphi Framework有类似的问题, 要解决此问题,请创建包含某些属性的包含文件,并在您的类中使用它。

/// include class 'Basic.inc'
private
   function GetWidth: Integer;

published
   property ClientHeight : Integer Read FHeight Write FHeight;
 //property ClientWidth  : Integer Read FWidth Write FWidth;
 //property OldCreateOrder : Boolean Read FOldCreateOrder Write FOldCreateOrder;
 end;
...

/// main class like this
TuMemoFrame = class(TUniFrame)
  UniMemo1: TUniMemo;
  UniMemo2: TUniMemo;
  UniButton1: TUniButton;
  procedure UniButton1Click(Sender: TObject);
private
public

{$Include Basic.inc } // <---
end;