在VB6中替换表单控件

3
我们有一个内部的按钮控件,说实话它很糟糕。我想要替换它,但我不想在项目中的每个表单上进行删除/添加新控件的操作。我认为如果我设计一个具有与旧按钮相同属性的新按钮,那么我应该能够给它与旧按钮相同的名称,并仅更改vbp文件中的所有引用行以指向新控件即可。

是否有人尝试过这样的操作(最好是您是否听说过可以自动完成此操作的工具),如果有,我应该注意哪些问题?

谢谢!

3个回答

7

*.vbp文件是需要修改的地方之一。GUI文件包含的控制库的引用也在其中,这些文件包括form (*.frm)、control (*.ctl)和property page (*.pag)。这些文件都是纯文本格式,你可以在顶部看到引用。它们看起来像这样:

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"

如果新控件是已编译的 OCX,则需要在所有相关文件中添加或更新这些引用。如果它在同一项目中,我不认为需要任何引用;如果它在同一项目组中的另一个项目中,我不确定。请保存一个带有新控件的测试表单以查看。

请注意,您不必保留相同的控件类名。在 *.frm/ctl/pag 文件中,它们上的各个控件实例由如下简单格式表示:

Begin VB.CommandButton Command2 
   Caption         =   "Cancel"
   Height          =   375
   Left            =   2460
   TabIndex        =   1
   Top             =   2400
   Width           =   1455
End

第一行的语法是“Begin LibraryOrProjectName.ClassName NameOfThisInstance”。因此,如果问题控件的名称是独特的,那么在BASIC源代码和GUI布局中查找并替换对它的引用应该很容易。您可能需要一个可以跨多个文件执行搜索和替换的纯文本编辑器(Notepad++就是这样一个编辑器)。

有些控件属性是这样存储的:

   Picture         =   "frmMain.frx":292F

这些对应于 *.frx、*.ctx 和 *.pgx 文件,这些文件包含某些控件属性值的二进制数据。我认为这些文件不需要进行修改或引起任何问题。它们似乎不包含控件名称。
使用完整编译 (Ctrl+F5) 确保源代码其他部分没有潜在问题。
从未尝试过。祝你好运。

是的,我完全忘记提到更新表单了,但我知道这一点。我肯定可以重命名控件,但它们通常已经被适当地命名了,所以没有太多理由这样做。你提出了一个关于引用frx的属性的好问题。我想使用的新控件实际上是一个.net互操作dll,所以我想知道是否有办法保留当前在frx中引用的图片? - Brandon Moore
这是一个触摸屏 POS 应用程序,因此有 9 个按钮上面都有图片。 - Brandon Moore
@BrandonMoore:很不幸。我不知道.NET互操作性。我甚至不知道你可以在VB6表单上使用.NET控件。如果新控件的图片属性是VB6的IPictureDispStdPicture,那么它可能会与原始控件存储相同,但我认为它完全取决于控件如何内部读写其内容--它不必与通常访问其属性的方式一致。您可能需要手动处理图片。 - Boann
2
@BrandonMoore:控件本身不访问frx,但VB也不会填充属性;它使用frx来填充PropertyBag对象。控件如何组织属性包中的数据取决于控件本身,这与可见属性几乎没有关联(尽管几乎总是有)。文件名肯定可以很好地进行交互操作,但标准图片属性只是一个内存对象,没有引用文件,因此除非您当前的按钮在这方面有所不同,否则仍然必须手动设置所有现有按钮的文件名。 - Boann
其实,我想你可以修改旧按钮的属性袋以读取图片或文件,但保存一个(新创建的)文件名。然后在所有表单上进行虚拟保存以运行该转换代码。 - Boann
显示剩余2条评论

1

我只需要为已接受答案添加一个提示。

如果您需要用第三方或自定义的ActiveX控件替换任何通用的VB控件,您必须替换:

BeginProperty Font

使用

BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}

未执行此操作将导致在尝试编辑/打开表单时出现运行时错误713
如果块中没有BeginProperty语句,则控件使用默认字体,不需要进行替换。

0

需要注意的另一个情况是,如果OCX中的类在代码中直接引用。

换句话说,如果控件类是ABCButton,那么您需要在所有.BAS.CLS文件中查找ABCButton,并进行适当的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接