在VB6中,UserControl可以编译为OCX,然后作为引用组件包含在另一个项目中。或者,UserControl源本身(即CTL文件)可以直接包含在EXE或DLL项目中。
这两种方法之间存在一个奇怪的区别。从OCX使用时,Extender properties(more)列表与为控件定义的任何自定义属性无缝合并。但是当从CTL使用时,情况似乎并非如此。尝试在控件上使用Extender属性将生成编译器错误。
一个例子是.Tag
属性。当引用为OCX时,此属性在Intellisense中可用并编译正常。但是在使用CTL时,完全相同的使用此属性会产生编译时错误。
其他示例包括.Left
,.Top
等。无论控件是如何包含的,我都希望VB6能够将Extender属性视为相同。
为什么存在这种差异,是否有任何修复?
(注意:作为一种解决方法,当需要访问Extender属性时,我一直将代码中的控件称为类型Object
。但理想情况下,为了清晰和编译时,我更愿意使用实际类型安全性。)
答案 0 :(得分:0)
根本没有真正的程序差异。它被编译到程序中,因此它与控件的程序链接不同,也许你有一些错误的代码,编译器使用外部控件时不会注意到或者不是非法的。 但是如果你用控件运行一些程序,它会节省内存,因为为控件编写的代码只加载一次。你也可以单独更改控件,你只需要编译一次(如果你为其他人创建程序,他们只需要更新更改的excutable)。
答案 1 :(得分:0)
如果您拥有驻留在项目中的控件的源代码,那么在与控件交互(运行其代码)时,您将在步骤调试中逐行查看。
如果您正在调试不在控件中的代码,这可能会让您失望。因此,一旦您的控件工作稳定,就可以编译它并使用OCX参考,直到需要更改控件。