【问题标题】:Delphi: EReadError with message 'Property Persistence does Not Exist'Delphi:带有消息“属性持久性不存在”的 EReadError
【发布时间】:2009-04-28 14:52:54
【问题描述】:

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

Project1.Exe 引发异常类 EReadError,并带有消息“属性持久性不存在”。进程已停止。

这只是在我安装了用于此项目的 TMS 组件包后才开始的。感谢您的帮助。

【问题讨论】:

  • 我们需要查看一些代码。
  • 尝试在设计模式下打开所有表单并保存它们,看看是否有帮助。

标签: delphi exception


【解决方案1】:
  1. 在 Delphi IDE 中打开表单
  2. 使用 Alt + F12 编辑 .DFM 源
  3. 搜索“持久性”属性
  4. 删除具有“持久性”属性的行

DFM 示例:

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

您还可以使用 Andreas Hausladen 的出色 DFMCheck 1.4 工具。要检查任何其他类似的缺失属性:

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

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

【讨论】:

  • @Cesar:您发布的答案与我正在写的相同,因此我将我的答案与您的合并。干得好!不过,我已经忘记了 DFMCheck。手感不错。
  • 这可行,但前提是您知道是哪种形式导致了问题。您可以通过在引发异常时检查调用堆栈来发现这一点,但它会变得混乱。 Delphi 的 DFM 加载代码跟踪起来并不有趣。
  • @Jim:谢谢! @Mason:这就是我建议 DFMCheck 的原因。 DFMCheck 工具可以检查项目中的所有 .dfm 文件。
  • 如有必要,您可以使用windows FindStr(基本上是grep)实用程序:FINDSTR /is Persistence *.dfm
  • 它似乎适用于其他属性,感谢您的解决方案!
【解决方案2】:

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

【讨论】:

  • 你永远不会走那么远。该错误是由运行时本身在尝试创建表单时在 dfm 中流式传输引起的。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      如果这对你不起作用:

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

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

      干杯! 我希望它适用于所有有类似问题的人:)

      【讨论】:

        【解决方案6】:

        我在使用 nuiGui Delphi 框架时遇到了类似的问题, 为了解决这个问题,创建一个包含一些属性的包含文件并在你的类中使用它。

        /// 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-13
          • 2014-02-05
          • 2015-08-22
          • 2012-12-26
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多