Visual Basic 6 和 Visual Basic 2005 中的用户界面控件

翻译|其它|编辑:郝浩|2006-03-21 09:24:00.000|阅读 1662 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


适用于:
Visual Basic 6
Visual Basic 2005
Visual Studio 2005

摘要轻松高效地将 Visual Basic 6 用户界面控件转换到 Visual Basic 2005 中。

*
本页内容
 简介
 集成用户控件
 使用 ActiveX 控件和 Windows 控件库
 升级 OCX、DLL 和第三方控件
 帮助您继续下一步

简介

在进行 Visual Basic 6 应用程序转换时,有少量控件会比不进行转换的控件带来更多问题。在您拥有源代码的项目的控件、1997 年买回来的自定义 ActiveX 控件以及没有实际转换路径的内置 Microsoft 控件之间,要进行转换不是那么容易的。

不过,还是有可能的。Visual Basic 6 用户控件中的代码可以很好地转换到 Visual Basic 2005 中。您可以通过互操作功能来使用某些第三方控件。Visual Studio 2005 中提供的工具有助于创建 OCX 代理。所有功能都不会丢失。

集成用户控件

最大的问题是 Microsoft 稍微调整了用户控件的定义。由于继承的使用,我们实际上可以将用户控件定义为控件集合,从而扩展控件的概念。在 Visual Basic 6 中,用户控件只是可以驻留在其他窗体中的窗体。

幸运的是 Visual Basic 2005 可以出色地完成更改工作。多数更改工作均在后台进行,但是即使细微的设置,Visual Basic 6 升级向导也能很好地对其进行转换。接下来我将对此进行解释。

将带有用户控件的 Visual Basic 6 项目转移到 Visual Basic 2005 中

我在 Visual Basic 6 中构建了一个小型用户控件(仅实现了用于输入美国社会安全号码的三个文本框)。我将使用一些技巧,进行一些设置以查看转换向导的工作方式。


图 1:Visual Basic 6 SSN 控件

我将使用 TextChanged 事件,以在文本框具有正确的字符数时在它们之间自动切换。我将该事件驻留在一个简单的窗体中(该窗体只是在消息框中显示结果),并通过转换向导运行该事件。这是一个相当简单的过程:只需在 Visual Studio 2005 中使用“文件”->“打开项目...”菜单项来打开 Visual Basic 6 项目。

令人高兴的是 Visual Basic 2005 可以非常出色地对其进行处理。向导可以正确地以 Visual Basic 2005 格式创建窗体和用户控件。甚至还添加了 ToolTipExtenderProvider,以支持默认情况下 Visual Basic 6 中的 TextBox 控件和用户控件的实例所具有的 ToolTip 属性。(请注意示例程序文件中的程序员注释使用的是英文,本文中将其译为中文是为了便于参考。)

列表 1:两个版本的代码比较

Visual Basic 6 代码

Private Sub Three_Change()
If Len(Three.Text) = 3 Then
Two.SetFocus
End If
End Sub

Private Sub Two_Change()
If Len(Two.Text) = 2 Then
Four.SetFocus
End If
End Sub

Public Property Get SocialSecurityNumber()
SocialSecurityNumber = Three.Text & _
"-" & Two.Text & "-" & Four.Text
End Property

Visual Basic 2005 代码

Option Strict Off
Option Explicit On
Friend Class UserControl1
Inherits System.Windows.Forms.UserControl
   
Private Sub Three_TextChanged(ByVal eventSender As _ 
System.Object, ByVal eventArgs As System.EventArgs) _
Handles Three.TextChanged

If Len(Three.Text) = 3 Then
Two.Focus()
End If
End Sub
   
Private Sub Two_TextChanged(ByVal eventSender As _
System.Object, ByVal eventArgs As System.EventArgs) _
Handles Two.TextChanged

If Len(Two.Text) = 2 Then
Four.Focus()
End If
End Sub
   
Public ReadOnly Property _
SocialSecurityNumber() As Object
Get
SocialSecurityNumber = Three.Text & _
"-" & Two.Text & "-" & Four.Text
End Get
End Property

几乎没有改变代码,但是我没有做任何复杂的工作。毕竟,我们在此处所做的全部工作就是检查用户控件是否转换,不是吗?此方式的唯一缺陷是转换后将显示一个全局警告:“升级后需要构建用户控件”。这样比较合理,但无论如何我检查了帮助文件。

结果是,在 Visual Basic 6 中要对驻留的控件进行实时编译(每次进行更改时,切记要关闭窗口),而在 Visual Basic 2005 中情况并非如此。仅在使用解决方案之前对其构建一次即可。

控件数组并不起作用。请注意,我在示例中没有使用控件数组(即使在一个非常合适的位置),并且我不建议使用它。当使用简单控件时,使用控件数组反而会使自己陷入混乱中。为什么呢?因为 .NET 中没有互补系统。它们完全删除了这个概念。

ASP.NET:完全不同的世界

因此,似乎是如果您亲自开发了 Visual Basic 用户控件,转换就会进行的比较顺利。我没有对该示例的 Visual Basic 语言部分的每一部分进行测试,但是控件代码本身似乎没有引起太多问题。

但是对于 ASP.NET 用户控件,情况并不是这样。它们是整个不同结构的一部分,并不通过 Visual Basic 6 转换向导进行处理。实际上,ASP3 中确实没有可转换为 ASP.NET 的相应功能,因此这是合理的。

尽管最常听到的担心是在 Web 环境中使用 Windows 服务器控件,例如在 Visual Basic 6 或 ASP3 环境中使用一些 ActiveX 控件。但以后决不会再发生这种情况了。由于您可以像在 ASP3 中一样在 ASP.NET 中使用 ActiveX,因此仍然可以选择那样做。尽管 Windows 控件不在 ASP.NET 中运行,ASP.NET 控件也不会在 Windows Form 应用程序中运行。

使用 ActiveX 控件和 Windows 控件库

Windows 控件库是包含 Visual Basic 2005 中的控件集合的类库。它们与指定用于 Visual Basic 2005 中的 Windows Form 的 ActiveX 控件最相似。应该努力摆脱在 Web 窗体中的可执行概念。最好使用 ClickOnce 并部署 Windows Forms 应用程序。

在该行中,当您将 ActiveX 控件转换到 Visual Basic 2005 中时,将得到一个 Windows 控件库。对于那些习惯于认为 Visual Basic 希望 ActiveX 控件主要用于 Web 的用户来说,这可能令人惊讶。实际上,ActiveX 控件只是一个公开任一容器中的某些属性的可执行控件。可以更好地控制带有继承模型的 .NET Framework,因此我们使用 Windows 控件库。

将 ActiveX 用户控件项目转移到 Visual Basic 2005 中

我在前一个项目中构建为用户控件的“社会安全号码”控件被转移到一个 ActiveX 控件项目,并通过升级向导运行。令人高兴的是,该控件与前一个示例一样运行良好,并且该模型也工作正常。我得到了一个编译到类库中的 .VB 文件。


图 2:工具箱中的控件

实际上,如图 2 所示,Visual Studio 足以胜任将控件添加到解决方案的其他项目中。这是拖放操作,就像操作内置控件一样!

升级 OCX、DLL 和第三方控件

假如您有一个 1997 年购买的控件,而开发人员已消失得无影无踪并且该公司也已经倒闭。现在情况将会怎样?

全部控件均不会丢失。由于缺少源代码,因此您无需像我们以前所做的那样进行纯转换。您可以使用内置工具来自动生成 COM 类的 .NET 代理(这是一个比想象中更简单的体验),或者按照我们所做的进行处理并为该 .NET 控件 DLL 创建一个 COM 包装。

在 Visual Basic 2005 中使用 Visual Basic 6 编译控件

有时,您不能访问源代码。有时,您甚至会发现一个普通的 Visual Basic 6 控件不能在 Visual Basic 2005 中运行。这时,您只好希望可以创建一个运行时可调用包装。

该问题就像在一个新计算机中安装旧网卡一样,实际上,如果您不把网卡安装在计算机上就不知道它是否可以工作。ActiveX 控件执行 Win32 库较旧的部分可以导致崩溃,有时甚至是不在 .NET 周围或正在使用的操作系统的部分库。

如果您要使用当前正在旧系统上运行的旧控件转换应用程序,要尝试的第一件事就是在新系统上安装该控件。即使您从来没有打算在 Visual Basic 6 中使用该系统,但如果您要重新使用任何控件就应该对其进行测试。这将有助于您提前了解兼容性问题。

最常见的控件是来自 Visual Basic 6 的 Web 浏览器控件。但是,Visual Basic 2005 中有一个新的 WebBrowser 控件,并且两者是兼容的。实际上,Visual Basic 2005 中有许多新控件可以转化为我们缺少的 Visual Basic 6 控件,尤其是接管 mscommSerialPort 控件。设计方面还有其他控件:

SoundPlayer

DataGridView

SplitContainer

MaskedTextBox

ToolStrip

努力尝试查找不具有 .NET 程序集的 COM 控件,我将设法获得 ShockWave Flash 控件,如果您的系统中安装了 Flash Web Player,也会有该控件。还没有适用于该控件的 .NET 程序集,并且我认为它将是一个好的升级示例。问题是升级向导是否能够找到可以转换它的方式。


图 3:Flash 浏览器

我使用 Shockwave Flash OCX 控件(包括图 4 中的客户 slash 页面 flash)、一个文本框和一个按钮构建了一个简单的 Visual Basic 6 应用程序,并在 Visual Basic 2005 中对其进行转换。

正如预期的一样,Visual Basic 6 转换向导可以很好地转换组件,并生成控件的 .NET Interop。将 Ax 添加到 Interop 名称中以表明它是一个 ActiveX 驻留控件,该控件派生自 System.Windows.Forms。以下是转换和清理后我的项目所引用的控件:

AxInterop.ShockwaveFlashObjects(本地复制)

System (GACed)

System.Drawing (GACed)

System.Windows.Forms (GACed)

可以使用与转换向导使用 aximp 转换控件相同的方式来转换控件。Aximp 将 System.Web.Forms.AxHost 类用作 ActiveX 控件和 Windows Forms 容器之间的代理。如果您研究一下新的 ShockwaveFlashObjects 程序集的清单,就可以发现它确实派生自 AxHost

.assembly AxInterop.ShockwaveFlashObjects
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() 
.custom instance void [System.Windows.Forms]System.Windows.Forms.AxHost/TypeLibraryTimeStampAttribute::.ctor(string) 
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32)  .hash algorithm 0x00008004
.ver 1:0:0:0
}

可以使用以下命令行亲自运行 aximp:

aximp c:\Windows\System32\Macromed\Flash\flash.ocx

AxHost 将包装 ActiveX 控件并将其公开为功能齐全的 Windows Forms 控件。不能直接使用该类,但是 aximp 使用它来生成我们正在查看的代理。在一定程度上,它是可以将 ActiveX 界面转换为 Windows Forms 界面的 Lego 片。

如果您签出了成员,则可以发现属性通常派生自 Control 类。AxHost 类的根本原因是接触 Win32 模型,并将属性转换为 .NET。经久不衰的面向对象编程。

帮助您继续下一步

没有人相信 Visual Basic 6 明天会消失。我有仍在运行全部 Visual Basic 6 基本代码的客户。当您要开始转移某些内容时,知道自己可能(仅是可能)无需重新编写每行代码是件令人愉快的事情。可以转换代码,可以包装控件。简而言之,有多种方式可以实现该操作。

是否理解了所有内容?转换前花时间清理一下 Visual Basic 6 代码。Code Advisor for Visual Basic 6 是帮助清理代码的极好工具。该工具需要安装 Visual Basic 6 (请记住,可以在一台计算机上同时安装 Visual Basic 2005 和 Visual Basic 6)。它将一个简单的工具条添加到 Visual Basic 中,注释代码以使用更新提示帮助您清理代码。


图 4:Code Advisor

它对代码的所做的更改简单、清晰并且可以管理。

列表 2:Code Advisor 标记控件示例

'FIXIT:使用显式选项以避免意外地创建 Variant 类型的变量       FixIT90210ae-R383-H1984
Private Sub Three_Change()
If Len(Three.Text) = 3 Then
Two.SetFocus
End If
End Sub

Private Sub Two_Change()
If Len(Two.Text) = 2 Then
Four.SetFocus
End If
End Sub

'FIXIT:使用早期绑定数据类型声明“SocialSecurityNumber”                       FixIT90210ae-R1672-R1B8ZE
Public Property Get SocialSecurityNumber()
SocialSecurityNumber = Three.Text & _
"-" & Two.Text & "-" & Four.Text
End Property

可以在此处下载 Code Advisor。

是否有其他可能需要在 Code Advisor 的帮助之外查找的更改?还有应该在几年前转移到用户控件的内容吗?难道那不是吗?可能您现在就非常感兴趣转移它。第三方控件呢?有 .NET 版本吗?如果没有,请尽快参阅 aximp 工具。做好规划是任何成功融合 Visual Basic 6 和 Visual Basic 2005 的关键,使用用户控件以及其他任何东西也是一样。


标签:界面设计

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP