主题:[原创]浅谈编程注意要点
孙瑞
[专家分:590] 发布于 2010-05-02 00:24:00
很多人在初学编程的时候会遇到这样那样的问题,我也是一样。在这些问题的探索中,我们会慢慢的了解VB的特性,进入VB的神奇世界,体验简单编程的乐趣!
在我最近开发的一款小型使用软件中,有这样一段代码:
Private Sub ListView1_Click()
On Error Resume Next
shengchanriqi = ListView1.SelectedItem.ListSubItems.Item(3)
timecount = Abs(DateDiff("y", shengchanriqi, Date))
baozhiqi = Val(ListView1.SelectedItem.ListSubItems.Item(2))
If timecount > baozhiqi Then
Pbar1.Visible = False 'forbidden the appear of Prossess Bar
Frame2.Visible = False 'Frobidden the appear of Frame2
Label4.Visible = True 'show the label
Label4.Caption = "食品已过期" & timecount - ListView1.SelectedItem.ListSubItems.Item(2) & "天,请不要食用或使用!"
Else
Label4.Visible = False 'forbidden label
Pbar1.Visible = True 'show prossess bar
Frame2.Visible = True 'show frame2
baozhiqi = ListView1.SelectedItem.ListSubItems.Item(2)
bili = (timecount / baozhiqi) * 100
Pbar1.Value = bili
bili = 0
End If
End Sub
原来,使用的是 If timecount > ListView1.SelectedItem.ListSubItems.Item(2) Then
后来发现,在运行过程中,VB会跳过if 直接运行紧接着IF的程序段。这让我想起了一种可能性:在使用ListView1.SelectedItem.ListSubItems.Item(2)语句与IF这个函数进行组合时,系统会有一个优先原则,到底是哪一个优先?答案是:IF
也就是说,这个语句中,由于timecount变量的值是已经赋予了的正数值,而ListView1.SelectedItem.ListSubItems.Item(2)则表示了一个获取数据的过程,这个过程来不及执行系统就进行了比对。系统认为timecount比ListView1.SelectedItem.ListSubItems.Item(2)大,于是执行了下面进阶的程序。
所以,要像上面一样(baozhiqi = Val(ListView1.SelectedItem.ListSubItems.Item(2)))将数据预先储存在一个变量中,然后在执行比对,这样才不容易出错!
还有一个例子,大家自己分析一下:
VB延时函数
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
sleep 1000'1秒
记住,在使用延时函数的同时,要使用DoEvents
例程:
/*****************************
a = 0
Do While a < 11
Label1.Caption = a
a = a + 1
DoEvents
Sleep 1000
Loop
/*****************************
函数声明
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
这里,DoEvents与Sleep函数的位置如果放反了,就会失去Sleep函数的延时效果。
大家自己思考一下原因!谢谢~!
回复列表 (共11个回复)
沙发
tanchuhan [专家分:15140] 发布于 2010-05-02 02:35:00
[quote]
原来,使用的是 If timecount > ListView1.SelectedItem.ListSubItems.Item(2) Then
后来发现,在运行过程中,VB会跳过if 直接运行紧接着IF的程序段。这让我想起了一种可能性:在使用ListView1.SelectedItem.ListSubItems.Item(2)语句与IF这个函数进行组合时,系统会有一个优先原则,到底是哪一个优先?答案是:IF
也就是说,这个语句中,由于timecount变量的值是已经赋予了的正数值,而ListView1.SelectedItem.ListSubItems.Item(2)则表示了一个获取数据的过程,这个过程来不及执行系统就进行了比对。系统认为timecount比ListView1.SelectedItem.ListSubItems.Item(2)大,于是执行了下面进阶的程序。
所以,要像上面一样(baozhiqi = Val(ListView1.SelectedItem.ListSubItems.Item(2)))将数据预先储存在一个变量中,然后在执行比对,这样才不容易出错!
[/quote]
错,真正原因是ListView1.SelectedItem.ListSubItems.Item(2)的值不是"一个可以转化为数字的字符串",本来应该引发异常,但由于你前面有On Error Resume Next,它直接跳出If...End If继续执行。
你前面加上Val()放到中间变量就可以,是因为Val("非数字") = 0,接着的If也就合法,进入If内部。
Sleep是挂起当前线程N毫秒
Doevents是调用GetMessage/TranslateMessage/DispatchMessage在消息队列里取消息(如果没有则等待,因此可以释放CPU),翻译消息,分派消息。但可能会引起"代码重入"的问题,因此要注意程序逻辑是否会因此出问题
(例如
点击按钮A,打开文件,然后用Doevents等待5秒,再写文件,最后关闭文件。
点击按钮B,关闭所有打开的文件。
当用户点击A,然后不到5秒就点击B,过了5秒后A代码继续执行,就发生异常挂了。
这个例子也许不太常见,但还有很多其他很隐蔽的例子,例如全局变量的同步问题,因此使用Doevents时要小心点)
就你发的那段代码,我看不出Dovents和Sleep互换有不同?
板凳
孙瑞 [专家分:590] 发布于 2010-05-02 08:39:00
谢谢谈出汗的指导!但是貌似有一点问题。如果那个是不可以转换为数字的字符串,那我后面的代码(需要baozhiqi这个变量为一个不为零的数),却能正确运行,岂不奇怪?
3 楼
孙瑞 [专家分:590] 发布于 2010-05-02 09:11:00
第二个问题:如果DoEvents和sleep的顺序反了,就起不到延时的作用。你可以试试来证实我的说法。至少我的运行结果是这样的…
4 楼
tanchuhan [专家分:15140] 发布于 2010-05-02 17:42:00
[quote]谢谢谈出汗的指导!但是貌似有一点问题。如果那个是不可以转换为数字的字符串,那我后面的代码(需要baozhiqi这个变量为一个不为零的数),却能正确运行,岂不奇怪?[/quote]
你按F8单步调试就看的到代码执行流程了
[quote]第二个问题:如果DoEvents和sleep的顺序反了,就起不到延时的作用。你可以试试来证实我的说法。至少我的运行结果是这样的…[/quote]
给段简单点的代码我试试,莫非我的逻辑能力减退了,实在理解不了为什么不同.
就你那段代码,互换Doevents和Sleep,label会迟一秒显示,因为设置了caption后还没来得及接收WM_PAINT重画就进入了Sleep挂起来了,但不管如何还是能显示的,也有延时效果.
5 楼
孙瑞 [专家分:590] 发布于 2010-05-02 23:03:00
好吧!这个帖子留在我高考完后再处理……
6 楼
gfan [专家分:60] 发布于 2010-05-05 14:59:00
多年项目开发经验,专业做毕业设计等中小型项目开发,熟悉各种数据库操作(sql server ,access ,mysql等),熟练应用VC, Delphi, VB, ASP, C#等开发语言.若有需要请联系QQ: 383147818 加我请注明: pfan项目
7 楼
孙瑞 [专家分:590] 发布于 2010-08-24 23:21:00
不要发广告了……这里是技术交流论坛……哎
8 楼
孙瑞 [专家分:590] 发布于 2011-01-29 09:54:00
经过实践检验,DoEvents和Sleep的位置,不能调换。否则没有达到我预期的效果。
另外,tanchuhan说的,打开文件,sleep5秒,结果5秒内点击了b。程序就挂掉了。
这个我倒是有一个小的经验解决这种问题。因为一般打开的文件是有限的,可以用一个变量【比如Dim openi As Boolean】。当执行open之前,检查openi的值,若为True,则不open;若为假,则open。对close也同样
9 楼
goodwe [专家分:30] 发布于 2011-02-25 18:47:00
The blog is really informative and i like to share it with my friends we can easily learn more about web designing through this post thanks for post[url=http://www.oilpaintingsuksale.com]painting oil[/url]
[url=http://www.oilpaintingsuksale.com]painting in oil[/url]
[url=http://www.oilpaintingsuksale.com]oil paints[/url]
[url=http://www.oilpaintingsuksale.com]paint oil[/url]
[url=http://www.oilpaintingsuksale.com]oil on canvas[/url]
[url=http://www.oilpaintingsuksale.com]oil canvas[/url]
[url=http://www.oilpaintingsuksale.com]oil and painting[/url]
[url=http://www.ukdress.co.uk]uk evening dresses[/url]
[url=http://www.ukdress.co.uk]prom dresses uk[/url]
[url=http://www.Laserpointeronsale.com]laser pointers[/url]
10 楼
孙瑞 [专家分:590] 发布于 2011-02-25 23:02:00
拜托不要发广告了!
我来回复