【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交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)
- 分享一下Access工程中的acw...(11.07)