我们有一个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都安装了旧版本,然后使用最新版本进行更新.唯一的区别是最新安装的版本跳转更高.
这在流式传输.DFM期间通常是错误的.通常TLabel组件会发生此错误,因为许多人从表单或框架中删除TLabel字段,以减少混乱并减少表单的实例大小.然而,他们犯下的常见且令人困惑的错误是,在他们过度热心的情况下,他们删除了所有 TLabel引用.那是坏事开始发生的时候.让我了解流系统如何定位组件的类.
请记住,.DFM中的类引用只是一个字符串.流系统必须将此字符串转换为类引用(TComponentClass).流系统使用两种机制来执行此操作.第一个非常简单,涉及类引用的全局列表.您可以调用RegisterClass或RegisterClasses来明确地使流系统了解它.第二个更微妙,不太知名; 事实上,它是德尔福"神奇"的一部分:-).当编译器构建表单时,将处理表示表单上组件的所有字段,并构建内部表作为RTTI的一部分或表单/框架/数据模块本身的元数据.此表包含对组件字段表示的所有单个组件类型的引用列表.所以即使一个组件不是在全局列表中,仍然可以通过扫描这个编译器生成的表来找到它.这就是Classes.TReader.GetFieldClass()方法的作用.
回到我的TLabel示例,只需确保给定组件类型中至少有一个具有字段,就可以轻松解决此问题.因此,只要至少存在TLabel类型的字段,所有其他TLabel将加载就好了.因此,在您的情况下,请确保尚未删除TListView或TImage字段.