gpt4 book ai didi

delphi - 当相关类在编译和链接时存在并且在代码中显式存在时,运行时引发的 EClassNotFound 真正意味着什么?

转载 作者:行者123 更新时间:2023-12-03 14:51:55 25 4
gpt4 key购买 nike

我在执行 TReader.ReadRootComponent 时,在表单的 rtl Streaming 中发生运行时错误,导致引发异常 EClassNotFound。具体的错误消息是“找不到类 TActionList”。

奇怪的是:

  1. 我的主表单使用操作列表。
  2. 为了好玩,我将 ActnList.pas(来自 VCL 源文件夹)添加到我的项目中,以尝试修复它。

在实例化几分钟前我还在使用的表单时,就会发生这种情况。我所做的更改是在一些子框架代码中:我使用 ifdef 标记删除了其所有实现部分代码,因为我正在模拟一些框架,以进行单元测试和原型(prototype)。

我尝试将操作列表类添加到项目中,并且尝试使用和不使用各种编译器和链接选项,但是,我仍然遇到此异常。显然有什么奇怪的事情发生了。肯定还有另一种奇怪的方式来解决这个问题。

事实上,似乎发生了一些非常奇怪的事情。引发此错误时,我得到以下调用堆栈:

rtl.Classes.ClassNotFound('TActionList')
rtl.Classes.TReader.FindComponentClass(???)
rtl.Classes.FindExistingComponent
rtl.Classes.TReader.ReadComponent(nil) /// NIL!? WHAT!!!!!
rtl.Classes.TReader.ReadDataInner(???)
rtl.Classes.TReader.ReadData(???)
rtl.Classes.TComponent.ReadState(???)
vcl.Controls.TControl.ReadState(???)
vcl.Controls.TWinControl.ReadState($60B9CF0)
vcl.Forms.TCustomForm.ReadState(???)
rtl.Classes.TReader.ReadRootComponent($606EB90)
rtl.Classes.TStream.ReadComponent($606EB90)
rtl.Classes.InternalReadComponentRes(???,???,$606EB90)
rtl.Classes.InitComponent(TComplexFormContainingFrames)

TReader.ReadDataInner(Instance:TComponent) 中的 nil 似乎是故意的:

      while not EndOfList do ReadComponent(nil);

更新:我相信这个问题的答案是理解梅森提到的“序列化上下文”。而且,是时候承认我自己的愚蠢了:我从项目中删除了框架的父级,没有意识到它是框架的父级。我通过将 TMyFrameParent 的类型声明 stub 为 TMyFrameParent = class(TFrame) 来解决它丢失的问题,这反过来又导致了有问题的情况。我将问题留在这里,因为我认为将来记录在神秘情况下何时发生此异常以及如何修复它可能会非常方便。特别是,Mason 有一些关于“序列化上下文”以及它们如何应用于类名查找的非常有趣的信息。

最佳答案

这意味着在当前反序列化上下文中找不到该类。并非所有现有类都注册用于所有加载。每个表单类都有 RTTI,其中包含对其使用的组件的引用。要使其正常工作,请确保您的表单(或框架,如果这是一个框架)在 private 标记之前至少声明一个 TActionList:

TMyForm = class(TForm)
ActionList: TActionList;
OtherComponent: TSomeComponent;
private
//whatever
public
//whatever
end;

关于delphi - 当相关类在编译和链接时存在并且在代码中显式存在时,运行时引发的 EClassNotFound 真正意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com