我们有一个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。旧版和新版PC都安装了旧版本,然后使用最新版本进行更新。唯一的区别是最新安装的版本跳转更高。
答案 0 :(得分:9)
在流式传输.DFM期间,这通常是一个错误。通常TLabel组件会发生此错误,因为许多人从表单或框架中删除TLabel字段,以减少混乱并减少表单的实例大小。然而,他们犯下的常见且令人困惑的错误是,他们过度热心,删除了所有 TLabel引用。那是坏事开始发生的时候。让我来看看流媒体系统如何定位组件的类。
请记住.DFM中的类引用只是一个字符串。流系统必须将此字符串转换为类引用(TComponentClass)。流系统使用两种机制来执行此操作。第一个非常简单,涉及类引用的全局列表。您可以调用RegisterClass或RegisterClasses来明确地使流系统了解它。第二个更微妙,不太知名;事实上,它是德尔福“神奇”的一部分:-)。当编译器构建表单时,将处理表示表单上组件的所有字段,并构建内部表作为RTTI的一部分或表单/框架/数据模块本身的元数据。此表包含对组件字段表示的所有单个组件类型的引用列表。因此,即使组件在全局列表中不,仍然可以通过扫描此编译器生成的表来找到它。这就是Classes.TReader.GetFieldClass()方法的作用。
回到我的TLabel示例,只需确保至少有一个给定的组件类型有一个字段,就可以轻松解决这个问题。所以只要至少有TLabel类型的字段, 全部其他TLabels将加载正常。因此,在您的情况下,请确保未删除TListView或TImage字段。
答案 1 :(得分:4)
Re0sless,
我建议您打开并关闭应用程序的每种形式,然后再进行新的构建。如果记忆能很好地帮助我,那就是遇到类似问题时的解决方案。
您还可以查看DFM Check自动打开和关闭所有dfm,并CnPack帮助您清理使用条款。
的问候,
利芬
答案 2 :(得分:1)
我认为Lieven肯定是在正确的轨道上:在运行期间找不到简单的基类是Delphi(链接器)问题。此操作系统导致不这个例外。
我遇到类似问题的经验:链接器生成一个错误排列单元的项目 示例:表单单元在基本单元之前链接。强制项目完全重新编译/重新链接应该会使这个例外消失。
简单的[Rebuild All]可能还不够。您可能会尝试重新编译而不进行优化。
我试图重现此错误,但我无法做到。 Delphi编译器/链接器是编译exes的最佳编译/速度之一 - 但这个bug肯定是一个显示阻止。
注意:我只是经历过 D5中的这个错误。还有其他人吗? 与其他人经历过这个错误 Delphi版本?
答案 3 :(得分:0)
由于文件复制错误,我看到了类似的问题。为了使问题更加混乱,故障发生在中间媒体设备上。只需从现有版本构建中重新复制该文件即可解决该问题。
现在可能无法确认,但问题很可能已经“解决”了;不是因为删除了不必要的使用子句项,而是因为它还涉及可执行文件的新副本。
答案 4 :(得分:0)
我遇到了同样的问题。找不到类TCheckBox。我通常通过.DFM形式编辑大量组件(例如重命名大量组件)。当我通过它重命名我的表单上的所有CheckBox时出现此错误.DFM。
我只是剪切了所有复选框并再次粘贴它们(所以.DFM文件被刷新)。错误消失了。
答案 5 :(得分:0)
此类型“未找到类XXX”的所有错误的解决方案很简单。在文本编辑器中打开表单的DFM文件,并手动删除其中XXX对象的定义。
答案 6 :(得分:0)
更改表单的名称并使用其他名称保存.pas。如果在其他单位中使用,则更改所有引用以创建新单元名称。全部构建。 有了这个,错误就消失了。