Delphi 德尔福;EClassNotFound“未找到”;错误和损坏的DFM可能性

Delphi 德尔福;EClassNotFound“未找到”;错误和损坏的DFM可能性,delphi,dfm,eclassnotfound,Delphi,Dfm,Eclassnotfound,在我的Delphi2007项目中,我得到了一组级联的“EClassNotFound”错误。通常情况下,似乎不是由于缺少Name属性值造成的,尽管在初始化部分添加RegisterClass(XXX)修复了现有的EClassNotFound错误,但另一个错误似乎无限期地跟随它 我最终在文本编辑器中打开了DFM文件,它看起来很可能已损坏(表单元素名称中有大量非ASCII字符,与我在DFM文件中看到的情况相比,看起来非常“无结构”)。(我会在这里发布一个相同的帖子,但不确定这是否正确,因为非aSCII码

在我的Delphi2007项目中,我得到了一组级联的“EClassNotFound”错误。通常情况下,似乎不是由于缺少Name属性值造成的,尽管在初始化部分添加RegisterClass(XXX)修复了现有的EClassNotFound错误,但另一个错误似乎无限期地跟随它

我最终在文本编辑器中打开了DFM文件,它看起来很可能已损坏(表单元素名称中有大量非ASCII字符,与我在DFM文件中看到的情况相比,看起来非常“无结构”)。(我会在这里发布一个相同的帖子,但不确定这是否正确,因为非aSCII码,所以会推迟)

表单加载很好,似乎编译/语法检查也很正常,但一旦我运行它,麻烦就来了

回到SVN的早期版本,它看起来已经处于这种状态有一段时间了,这让我觉得A)DFM文件不是我的问题,或者B)Delphi表单流非常容错/健壮(附加问题:它是哪一个?)

如果DFM文件是问题所在,并且已经损坏,那么回滚必须是一种回滚方式,这将是非常昂贵的。如果IDE仍然可以加载它,那么有没有任何实用程序可以清理该文件

或者,我是否完全偏离了基地,DFM是主要嫌疑人

谢谢大家的意见。忘记了带DFM文件的二进制/文本选项,所以这很有帮助。看起来DFM本身没有损坏

但仍然存在EClassError问题。re:由于缺少属性值,或引用不存在的属性等,还有一个问题:给出错误的类(目前是TnxSqlUpdateObject,但如果到目前为止的经验是一致的,可能会有更多的等待)通常/总是实际的“罪魁祸首”类/对象吗

例如,现在我的主窗体有四个对TnxSqlUpdateObject的引用,这些引用实际上被丢弃在窗体上。如果我将RegisterClass(TnxSqlUpdateObject)放在初始化部分,它会针对EClassNotFound错误正常运行,但会继续执行下一个错误(在本例中为TStringField)

在本例中,我重新安装了NexusDB组件,并使用我认为可能存在问题的一些组件构建了一个新项目。它编译并运行良好,直到我从实际项目中添加了另一个表单(不幸的是,它又引用了很多其他表单)


所以,听起来我真正的问题是如何系统地诊断和修复所有EClassNotFound错误?

嗯,dfm文件可以是二进制文件或tekst(从4.0版开始我是正确的)

您可以通过右键单击表单并检查文本DFM标志来检查这一点

如果dfm文件已损坏,tou可以尝试通过删除所有可疑行来修复该文件。 一定要离开这个物体。。端点集完好无损,您可能只丢失了一些属性值

顺便说一下,dfm文件应该是这样的(为了了解一般结构):


如果看起来不是在编辑二进制文件。

如果可以在Delphi IDE中加载表单,则DFM资源不会损坏。Delphi使用与最终可执行文件相同的代码加载DFM,所以我认为这不是原因

您可以直接在DelphiIDE中打开DFM(如果相应的pas文件未打开),也可以使用Alt+F12在DFM的表单视图和文本视图之间切换。从这个角度来看,结构应该是合理的,有正确的压痕等等

如前所述,您可以使用表单弹出菜单中的命令切换DFM存储格式。对于Delphi5+,将其保留为文本,这样使用SVN效果更好

至于运行时问题的原因-我不知道

编辑:在您排除DFM是问题的根源之后,我只能假设uses列表中缺少一个重要单元,这只有在表单上的所有组件都没有相应的成员字段时才会发生。您应该检查DFM中引用的所有组件是否也在表单中,即使您没有在代码中访问它们。这将导致Delphi在保存文件时向uses子句添加任何缺少的单位。如果表单类引用了DFM中的所有组件,则不需要手动注册组件


为了进行快速检查,您可以创建一个测试表单,将“问题”表单上的所有组件都放到该表单上(一个实例就足够了),然后检查此操作是否有效。

如果您更改了其中一个自定义组件并从中删除了属性,则可能会发生这种情况。该属性在DFM中仍然存在,Delphi尝试对其进行初始化


尝试从DFM中手动删除零件,以便您可以查明是哪个组件导致了问题。

如果表单上有组件,但源文件中的表单定义中也没有条目,则会出现此错误。大多数情况下,当我从另一个窗体复制和粘贴时。最简单的解决方案是选择组件,剪切它,然后粘贴回去。保存时,组件的单元将添加到源中,再次运行时一切正常。

如果您有一个最近编译的exe,可以使用资源编辑器(如)获取dfm定义。然后,您可以将exe中的文件与您现在拥有的文件进行比较

我相信也有工具可以将二进制dfm文件转换为文本文件。这将为您提供更好的文件视图,并帮助您确定文件是否真的损坏。我看到菲利克斯有些东西

如果DelphiIDE显示表单ok没有错误,我不相信会有损坏错误。会不会有包装问题?您使用运行时包吗

更新:

您是否尝试过Eurekalog或madExcept或类似的方法来获取有关callstack和memorydumt的更详细的错误消息?也许会的
object Form5: TForm5
  Left = 0
  DesignSize = (
    426
    652)
  object Button1: TButton
    Left = 343
  end
  object Memo2: TMemo
    Anchors = [akLeft, akTop, akRight, akBottom]
  end
end