在vb6中替换窗体控件

在vb6中替换窗体控件,vb6,controls,Vb6,Controls,我们有一个内部按钮控制,坦率地说,它很糟糕。我想替换它,但我不想进入项目中的每个表单并删除/添加新控件。在我看来,如果我设计了一个新按钮,它的所有属性都与旧按钮相同,那么我应该能够为它命名为与旧按钮相同的名称,并且只需替换vbp文件中的所有参考线以指向新控件 有没有人尝试过这个(更好的是,你有没有听说过一个可以为你做这件事的工具),如果是这样,我应该注意什么 谢谢 您需要更改*.vbp文件。在包含GUI的文件中也有对所用控件库的引用——即表单(*.frm)、控件(*.ctl)和属性页(*.pag

我们有一个内部按钮控制,坦率地说,它很糟糕。我想替换它,但我不想进入项目中的每个表单并删除/添加新控件。在我看来,如果我设计了一个新按钮,它的所有属性都与旧按钮相同,那么我应该能够为它命名为与旧按钮相同的名称,并且只需替换vbp文件中的所有参考线以指向新控件

有没有人尝试过这个(更好的是,你有没有听说过一个可以为你做这件事的工具),如果是这样,我应该注意什么


谢谢

您需要更改*.vbp文件。在包含GUI的文件中也有对所用控件库的引用——即表单(*.frm)、控件(*.ctl)和属性页(*.pag)文件。这些文件是纯文本格式的,您可以在顶部看到引用。它们看起来像这样:

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"
Begin VB.CommandButton Command2 
   Caption         =   "Cancel"
   Height          =   375
   Left            =   2460
   TabIndex        =   1
   Top             =   2400
   Width           =   1455
End
   Picture         =   "frmMain.frx":292F
如果新控件是已编译的OCX,则需要在所有相关文件中添加或更新这些引用。如果它在同一个项目中,我认为它不需要任何参考,如果它在同一个项目组的不同项目中,我也不确定。使用新控件保存测试表单以查看

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

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"
Begin VB.CommandButton Command2 
   Caption         =   "Cancel"
   Height          =   375
   Left            =   2460
   TabIndex        =   1
   Top             =   2400
   Width           =   1455
End
   Picture         =   "frmMain.frx":292F
第一行的语法是“Begin Library或ProjectName.ClassName ThisInstance的名称”。因此,如果违规控件的名称与众不同,那么在基本源代码和GUI布局中搜索和替换对它的引用应该很容易。您可能需要一个可以跨多个文件执行搜索和替换的纯文本编辑器(Notepad++就是其中之一)

某些控件属性的存储方式如下:

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"
Begin VB.CommandButton Command2 
   Caption         =   "Cancel"
   Height          =   375
   Left            =   2460
   TabIndex        =   1
   Top             =   2400
   Width           =   1455
End
   Picture         =   "frmMain.frx":292F
这些文件对应于*.frx、*.ctx和*.pgx文件,其中包含特定控件属性值的二进制数据。我不认为这些文件需要修改或引起任何问题。它们似乎不包含控件名称

使用完整编译(Ctrl+F5)以确保以后在部分源代码中不会出现问题


从来没有试过。祝你好运。

只有一个提示可以添加到已接受的答案中

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

BeginProperty Font

尝试编辑/打开表单时,忽略此操作将导致运行时错误713


如果块中没有BeginProperty语句,则控件使用默认字体,不需要进行替换。

另一个需要查找的场景是OCX中的类是否直接在代码中引用


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

是的,我完全忘记了更新表单,但我知道这一点。我当然可以重命名这些控件,但它们的命名通常都是恰当的,所以没有太多理由这么做。关于引用frx的属性,您确实提出了一个很好的观点。我想使用的新控件实际上是一个.net interop dll,所以我想知道是否有办法保存frx中当前引用的图片?这是一个触摸屏pos应用程序,所以10个按钮中有9个按钮上有图片。@BrandonMoore:真不幸。我不知道.NET互操作。我甚至不知道可以在VB6窗体上使用.NET控件。如果新控件的picture属性是一个VB6
IPactureDisp
StdPicture
,它的存储可能与原始控件相同,但我认为这完全取决于控件内部如何读取和写入其内容——它不必与正常访问其属性的方式一致。你可能需要手动拍照。这是一个很好的观点。我敢打赌,如果我能让它们成为IPIP的话,它们一定会工作得很好。我不相信控件本身对frx有任何作用,我认为vb6只是使用这些信息为您填充属性。然而,我想我只是想到了一个更好的主意。修改现有按钮只存储一个文件名不需要太多,这样我就不需要IPictureDisp了。@BrandonMoore:控件本身不访问frx,但VB也不填充属性;它使用frx填充PropertyBag对象。这取决于控件如何组织属性包中的数据,而这些数据不需要(尽管几乎总是如此)与可见属性关联。文件名当然可以很好地进行互操作,但标准图片属性只是一个内存中的对象,没有引用的文件,因此,除非您当前的按钮以这种方式不同,否则您仍然必须手动在所有现有按钮上设置文件名才能做到这一点。