3

我们有一个 Delphi 5 应用程序,它是在没有运行时包、dll 或外部资源(即单个可执行文件)的情况下构建的。当我们在客户端 PC 上安装它时,我们会收到以下错误消息:

找不到类 TListView

或者

找不到类 TImage

我们之前已经将它安装在数十台 PC 上而没有发生任何事故,但这次最新的安装是有问题的。

目标 PC 是全新安装的 Windows XP(Service Pack 3),未安装其他软件。

它不会抱怨所有的课程,而只是抱怨一两个。例如TPanel/ TForm/ TEdit 都可以。

谁能想到是什么原因造成的?

编辑

新 PC 上的 exe 在我所知道的大约 30 台其他 PC 上,包括 windows XP Sp1、2、3、Windows Vista 和 Windows Embedded。新旧 PC 都安装了旧版本,然后更新为最新版本。唯一的区别是最新安装的版本跳跃更高。

4

7 回答 7

10

这通常是 .DFM 流式传输期间的错误。通常这种错误发生在 TLabel 组件中,因为许多人从表单或框架中删除了 TLabel 字段,以减少混乱并减少表单的实例大小。然而,他们犯的常见且令人困惑的错误是,他们过于热心,删除了所有TLabel 引用。那是坏事开始发生的时候。让我来看看流系统如何定位组件的类。

请记住,.DFM 中的类引用只是一个字符串. 流系统必须将此字符串转换为类引用(TComponentClass)。流系统使用两种机制来执行此操作。第一个非常简单,涉及类引用的全局列表。您可以调用 RegisterClass 或 RegisterClasses 来显式地让流系统知道它。第二个更微妙,不太为人所知。事实上,这都是德尔福“魔法”的一部分:-)。当编译器构建表单时,所有代表表单组件的字段都会被处理,并构建一个内部表作为表单/框架/数据模块本身的 RTTI 或元数据的一部分。此表包含对组件字段表示的所有单个组件类型的引用列表。所以即使一个组件不是在全局列表中,仍然可以通过扫描这个编译器生成的表找到它。这就是 Classes.TReader.GetFieldClass() 方法的作用。

回到我的 TLabel 示例,只需确保给定组件类型中的至少一个具有字段即可轻松解决此问题。因此,只要至少有 TLabel 类型的字段,所有其他 TLabel 都可以正常加载。因此,在您的情况下,请确保未删除 TListView 或 TImage 字段。

于 2009-02-23T18:31:58.080 回答
4

Re0sless,

我建议您打开和关闭应用程序的每种形式,然后重新构建。如果我没记错的话,那是我们遇到类似问题时的解决方案。

您还可以查看DFM Check以自动打开和关闭所有 dfm,并查看CnPack以帮助您清理 uses 子句。

问候,
利文

于 2009-02-23T09:13:04.727 回答
1

我认为 Lieven 绝对是在正确的轨道上:在运行时找不到简单的基类是 Delphi(链接器)问题。此异常不是由操作系统引起的。

我遇到类似问题的经验:链接器生成了一个单元排列错误的项目。
示例:表单单元链接在基本单元之前。强制项目完全重新编译/重新链接本身应该会使这个异常消失。

一个简单的 [Rebuild All] 可能还不够。您可能会尝试重新编译而不进行优化。

我试图重现此错误,但我无法重现。Delphi 编译器/链接器是最好的编译器之一 - 编译速度/已编译 exe 的速度 - 但这个错误绝对是一个阻碍。

注意:我只在 D5 中遇到过这个错误。有没有其他人在使用其他 Delphi 版本时遇到过这个错误?

于 2009-02-23T14:34:37.807 回答
0

由于文件复制错误,我看到了类似的问题。更令人困惑的是,故障出在中间媒体设备上。只需从现有发布版本中重新复制文件即可解决此问题。

现在可能无法确认,但很可能问题已“解决”;不是因为删除了不必要的使用子句项,而是因为它还涉及可执行文件的新副本。

于 2011-04-25T18:10:21.073 回答
0

我有同样的问题。找不到类 TCheckBox。我通常通过表单的 .DFM 编辑大量组件(例如重命名大量组件)。当我通过 .DFM 重命名表单上的所有 CheckBox 时,会出现此错误。

我只是剪切了所有复选框并再次粘贴它们(因此刷新了 .DFM 文件)。错误消失了。

于 2013-10-30T13:23:46.883 回答
0

此类“找不到类 XXX”的所有错误的解决方案很简单。在文本编辑器中打开表单的 DFM 文件并手动删除其中的 XXX 对象的定义。

于 2014-02-11T07:58:16.053 回答
0

更改表单的名称并使用其他名称保存 .pas。如果在其他单位中使用,请更改所有引用以创建新单位名称。全部构建。有了这个错误就消失了。

于 2018-04-20T01:27:14.337 回答