回 帖 发 新 帖 刷新版面

主题:[原创]浅谈编程注意要点

很多人在初学编程的时候会遇到这样那样的问题,我也是一样。在这些问题的探索中,我们会慢慢的了解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个回复)

沙发

[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互换有不同?

板凳

谢谢谈出汗的指导!但是貌似有一点问题。如果那个是不可以转换为数字的字符串,那我后面的代码(需要baozhiqi这个变量为一个不为零的数),却能正确运行,岂不奇怪?

3 楼

第二个问题:如果DoEvents和sleep的顺序反了,就起不到延时的作用。你可以试试来证实我的说法。至少我的运行结果是这样的…

4 楼

[quote]谢谢谈出汗的指导!但是貌似有一点问题。如果那个是不可以转换为数字的字符串,那我后面的代码(需要baozhiqi这个变量为一个不为零的数),却能正确运行,岂不奇怪?[/quote]
你按F8单步调试就看的到代码执行流程了

[quote]第二个问题:如果DoEvents和sleep的顺序反了,就起不到延时的作用。你可以试试来证实我的说法。至少我的运行结果是这样的…[/quote]
给段简单点的代码我试试,莫非我的逻辑能力减退了,实在理解不了为什么不同.
就你那段代码,互换Doevents和Sleep,label会迟一秒显示,因为设置了caption后还没来得及接收WM_PAINT重画就进入了Sleep挂起来了,但不管如何还是能显示的,也有延时效果.

5 楼

好吧!这个帖子留在我高考完后再处理……

6 楼

多年项目开发经验,专业做毕业设计等中小型项目开发,熟悉各种数据库操作(sql server ,access ,mysql等),熟练应用VC, Delphi, VB, ASP, C#等开发语言.若有需要请联系QQ: 383147818 加我请注明: pfan项目

7 楼

不要发广告了……这里是技术交流论坛……哎

8 楼

经过实践检验,DoEvents和Sleep的位置,不能调换。否则没有达到我预期的效果。
另外,tanchuhan说的,打开文件,sleep5秒,结果5秒内点击了b。程序就挂掉了。
这个我倒是有一个小的经验解决这种问题。因为一般打开的文件是有限的,可以用一个变量【比如Dim openi As Boolean】。当执行open之前,检查openi的值,若为True,则不open;若为假,则open。对close也同样

9 楼

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 楼


拜托不要发广告了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册