Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

【Access编程技巧】避免重复用对象名称做一串调用

时 间:2016-05-03 08:23:07
作 者:杨雪   ID:42182  城市:南京
摘 要:很多时候可能要连续使用同一个对象的几个不同的属性和方法,很多VB程序员喜欢重复使用对象的名称来做一串调用。例如,窗体上有一个文本框控件Text1,编写代码如下:
正 文:

很多时候可能要连续使用同一个对象的几个不同的属性和方法,很多VB程序员喜欢重复使用对象的名称来做一串调用。例如,窗体上有一个文本框控件Text1,编写代码如下:

     

Text1.Text = "abcd"
Text1.Enabled = True
Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)
Text1.SetFocus

    这段代码看上去没有什么问题,但它会导致最终可执行文件的体积大大增加,而且使程序的运行效率非常低。因为在每次调用“Text1”时VB会进行一次很复杂的操作,以“绑定”到Text1对象,然后才会调用Text1对象的某个属性或方法。这个绑定操作比实现Text1对象的属性会方法的代码还要庞大许多倍,这无疑是一种巨大的浪费!当你的程序很庞大,需要调用的对象属性和方法很多时,程序的效率将会严重低下。正确的做法是使用With...End With 语句结构,例如上述代码应该被修改为:

 

With Text1
    .Text1 = "abcd"
    .Enabled = True
    .SelStart = 0
    .SelLength = Len(Text1.Text)
    .SetFocus
End With

 

     这样除使代码简洁,清晰,易于维护外,更重要的是使用程序的运行效率大大提高。因为上述代码将复杂的对象“绑定”操作只执行了一次,然后一气呵成地调用了所有需要调用的属性和方法。

    使用With...End With  语句结构的缺点是一次With 语句只能简化一个对象的操作,如果要在一段代码中同时用到俩个或更多的对象,With 语句就无能为力了。那么在这种情况下应该如何做呢?这是应该定义一个局部的对象类型的变量,然后用Set语句将要操作的对象赋值给该对象变量,之后可通过该对象变量做连续的属性或方法调用。例如:

 

Dim objText1 As TextBox
Set objText1 = Text1
objText1.Text = "abcd"
objText1.Enabled = 1
objText1.SelStart = 0
objText1.SelLength = Len(objText1.Text)
objText1.SetFocus
Set objText1 = Nothing

   

    这段代码看起来和第一段很类似,然而它的运行效率要高很多。因为复杂的对象“绑定”在这里也只被执行了一次,即是“Set objText1=Text1”的时候;而通过变量objText1调用属性和方法时则么有绑定操作。

      又如,下面的代码笔者每次看到时会感到非常的“畏惧”:

   

ListView1.View = lvwReport
ListView1.ListItems.Add , "L1", "Text1"
ListView1.ListItems("L1").ToolTipText = "ToolTip1"
ListView1.ListItems("L1").SubItem(1) = "Sub1_1"
ListView1.ListItems("L1").SubItem(2) = "Sub1_2"
ListView1.ListItems("L1").Selected = 1

 

    这些代码运行起来速度回非常慢,且难于维护。虽然实现这些功能在VB中所编写的代码并不多,但这并不意味着代码执行起来速度会很快。正确的做法是使用With...End With 语句块以绑定ListView1对象,再定义一个ListIem型的对象变量用于指向新添加的一个ListItem 项目,即:

     

Dim lsItem As ListItem
With ListView1
    .View = lvwReport
    Set lsItem = .ListItems.Add(, "L1", "Text1")
    lsItem.ToolTipText = "ToolTip1"
    lsItem.SubItems(1) = "Sub1_1"
    lsItem.SubItems(2) = "Sub1_2"
    lsItem.Selected = 1
    Set lsItem = Nothing
End With

 

    在使用With ...End With 语句块时,还要注意的是显示或隐式地跳出With 块所带来的“负面影响”,例如下面的程序会产生错误:

       

Private Type ArrType
    long1 As Long
    single2 As Single
End Type


Private Sub Command0_Click()
    Dim arr() As ArrType
    ReDim arr(1 To 10)
    With arr(10)
        .long1 = 1
        .single2 = 2.5
        GoTo Finish
    End With
Finish:
    ReDim arr(1 To 5)    '该语句会产生错误

End Sub

 

    程序中用With 语句绑定了数组元素arr(10),但在执行End With 之前又用Goto语句跳出了With块(这是显式跳出,也有可能当在程序中指定“On Error Goto Finish”后,在With块内,End With 之前出现错误,程序也会跳转到Finish,Finish 后面的语句中试图改变数组arr的大小,这时就会引发错误,如上图,在执行“With arr(10)”后,数组被锁定,只有在执行“End With 后才能被解锁;而在没有被解锁之前重新改变数组的大小自然会引发错误,这在实际编程时要注意。



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助