主题:[原创]浅谈编程注意要点
很多人在初学编程的时候会遇到这样那样的问题,我也是一样。在这些问题的探索中,我们会慢慢的了解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函数的延时效果。
大家自己思考一下原因!谢谢~!
在我最近开发的一款小型使用软件中,有这样一段代码:
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函数的延时效果。
大家自己思考一下原因!谢谢~!