日期:2008-12-24  浏览次数:20517 次

使用先前绑定
    Visual Basic 6.0和Visual Basic.NET都支持对象的延迟绑定,

该方法事先定义一个变量为Object数据类型,然后在运行时将其设定为一个类。然而,在升级过程中,当访问延迟绑定对象的缺省属性时可能会产生错误。例如假设工程中包含Form1,Form1中有一个Label对象,名称为Label1,下面的Visual Basic 6.0代码将Label的标题
设定为"SomeText"

Dim o As Object
Set o = Me.Label1
o.Caption = "SomeText"

    在Visual Basic.NET的Windows窗体中,Label控件的Caption属
性被称为Text属性。当你的代码升级后,所有实例中的Caption属性都会转换为Text属性,但是延迟绑定对象是无类型(type-less)的,VB无法检测到对象的类型并做更改,在这种情况下,你需要手工对代码做改动。当你使用先前绑定对象时,对象可以自动升级,如下:

Dim o As Label
Set o = Me.Label1
o.Caption = "SomeText"

    所以在程序中你需要将对象定义为适当的对象类型而不是简单的
定义为Object对象类型。

    同Visual C++类似。Visual Basic.NET支持函数的重载,例如下
面的一个函数具有两个形态

    Environ( Expression As Integer) As String
    Environ( Expression As String ) As String

    Visual Basic.NET会自动检测该使用那个参数的函数。如果你传
递一个正数值到Environ(),那么正数调用版本会被调用;如果传递一个字符串,String版本会被调用。如果传递Object或者Variant数据类型到一个重载函数将产生运行时错误。如果要想产生正确的结果就需要通过数据类型的强制转换,例如:

Dim a As String
Dim v As Variant
v = "Path"
a = Environ(CStr(v))   '正确

    对于延迟绑定的对象使用强制类型转换是一个很好的编程习惯。
这就使得代码可读性更好,同时也可以非常轻松的移植到Visual Basic.NET使用Date存储日期/时间较早版本的VB支持使用Double数据类型来存储和改变时间。
    在Visual Basic.NET中,这个特性将不再支持,因为在计算机内部日期并不是以Double方式存储的,例如下面的代码可以在Visual Basic 6.0中运行,但是在Visual Basic.NET中会产生错误。

Dim dbl As Double
Dim dat As Date
dat = Now
dbl = dat      '错误,不能将一个Date变量赋予一个Double变量
dbl = DateAdd("d", 1, dbl)   '错误,Double变量不能用于日期函

dat = CDate(dbl)   '错误 CDate函数不能将Double变量转换到Date

    .NET架构提供了ToOADate与FromOADate函数用于在double变量以
及Date变量之间转换。然而这需要在升级后手工修改,所以在存储日期时应该使用Date数据类型。

缺省属性
    在Visual Basic 6.0中,许多对象都有缺省属性,缺省属性在代
码中可以省略。例如:

MsgBox Form1.Text1.Text

可以这样编写:

MsgBox Form1.Text1   

缺省属性在代码编译是决定。同样,你也可以在延迟绑定的对象中使
用缺省属性,例如:

Dim obj As Object
Set obj = Form1.Text1
MsgBox obj

对于延迟绑定的对象,缺省属性在程序运行时决定。

    Visual Basic.NET不支持缺省属性,当你的工程升级后,
Visual Basic.NET会自动决定缺省属性,但是对于延迟绑定的对象无法自动解决决定缺省属性的问题。在这种情况下,你需要自己来修改代码。更加复杂的是,很多库是通过 _Default属性来实现缺省属性的。_Default象是一个代理,它将调用传递给真正的缺省属性。所以当你的工程升级后,一些属性会被更改为 _Default。代码还是象往常那样工作,只是代码不如原来的实际属性易读。

Dim obj As Object
Set obj = Me.Text1
MsgBox obj   '不好的代码,使用缺省属性
MsgBox Me.Text1   '不好的代码,使用缺省属性

use:

Dim obj As Object
Set obj = Me.Text1
MsgBox obj.Text   '好的代码,写出了属性
MsgBox Me.Text1.Text   '好的代码,写出了属性

    虽然缺省属性不被Visual Basic.NET支持,但是带参数的缺省属
性是被支持的,要了解它们之间的区别,下面是范例:

Dim rs As ADODB.Recordset
rs("CompanyName") = "SomeCompany"
rs!CompanyName = "SomeCompany"

实际上等于:

Dim rs As ADODB.Recordset
rs.Fields("CompanyName").Value = "SomeCompany"
rs.Fields!CompanyName.Value = "SomeCompany"

因为Value是Fields的缺省属性对于第二种写法,Visual Basic.NET是支持的;然而第一种情况不被支持,那么正确的用法如下:

Dim rs As ADODB.Recordset
rs("CompanyName").Value = "SomeCompany"
rs!CompanyName.Value = "SomeCompany"

    象上面的范例和其它的大多数情况可以在工程升级时解决,但是
你还是要避免在Visual Basic 6.0中在Object和Variant数据类型使用缺省属性。因为升级程序无法发现并解决这些错误。