初学者遇到一个对我来说很困惑的问题, 请高人指点

zgznn 2008-03-18 12:01:31
是这样,我写的一段试验小程序 就一个窗口 上面两个按钮 和一个定时器。 一个按钮的名字是“开始”(也就是启动定时器),另一个按钮是“停止”(中止停时器)
我的定时器定的是500ms(这个值经我试验比较合适)。我那个定时器里干的事是监督正在运行本程序以外的其它程序的用途,比如说“记事本”或者“计算器”等等。 现在有一个问题,程序开始运行。我按下开始按钮,启动定时器,但是这个时候我发现 那个“停止”的钮无法按下去,好象有点闪,我得按好几次才能把它按下去中止。 我要移动我这个程序的窗口的标题栏想把他变换一个屏幕的位置也不行。偶尔可以移动一点我想可能也是刚从定时器中跳出来,移一点马上又进入定时器执行去了,所以无法响应。 定时器里的程序也不复杂。 大概的结构是这样:先是几行赋值语句 以后是 一个小循环 次数我知道60次左右。如(for i=1 to 60), 接下来是一个判断语句
if AAAA then BBBB 个AAAA的信息从前面那60次的小循环里得到,BBBB 也是执行循环60次 后面就没有什么了,有几个小判断,if CCC then DDD 等等。如果AAAA不成立就退出timer了。 就这是么简单的结构。
我的定时间隔我以为定得太频繁了,后来我改成半秒一次还是不行。这个值不能再大了,目前是正好的。我只是想在启动定时器的时候在本程序中还能进行其它操作,如果按“停止”钮和移动标题栏等操作。 后来我听了某人的说法,说是应该使用DoEvents, 但我不知道如何应用于本例。我在网上找到的DoEvents 用法好象都不适用我啊。我不知道我这个程序结构里在哪里加上这一句话。
我是一个初学者,这个问题困扰我一个星期了,我实在想不出来了,想各位前辈请教,谢谢!
...全文
106 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
forbearORfolie 2008-03-18
加在你的循环的next前面,判断的外边,另外,可能是时间间隔太短了
回复
cbm6666 2008-03-18
窗口的标题栏我还是拖不动 ?

'*****************************************移动窗体API
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
'*****************************************************
Dim i&, j&, aa&, bb&, MousX%, MousY%, ForceStop As Boolean, MoveScreen As Boolean

Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = False
Command1.Caption = "开 始"
Command2.Caption = "停 止"
End Sub

Private Sub Command1_Click()
Randomize
ForceStop = False
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
ForceStop = True
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
Me.Cls
For i = 1 To 60
aa = Int(Rnd * 100)
For j = 1 To aa
bb = Int(Rnd * 100)
'DoEvents
Print CStr(aa) & " " & CStr(bb)
If ForceStop Then
Timer1.Enabled = False
Me.Cls
MsgBox "强迫停止"
Exit Sub
End If
Next j
Next i
Timer1.Enabled = True
End Sub

Private Sub command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
MoveScreen = True
MousX = X: MousY = Y
End If
End Sub

Private Sub command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MoveScreen Then
CurrX = Command1.Left - MousX + X
CurrY = Command1.Top - MousY + Y
Command1.Move CurrX, CurrY
End If
End Sub

Private Sub command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
MoveScreen = False
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Call ReleaseCapture
Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub


回复
zgznn 2008-03-18
非常感谢 几位高人的解答,新手昨天刚注册第一次提问,没想到这里的人这么热心。 在循环里加 DoEvents我试过了,不管用。
cbm666 给出的示例很好, 我试过了。 在他的指导下,现在那个stop钮可以按下了, 但是窗口的标题栏我还是拖不动,不过比以前强很多,以前是一点都移不动,现在至少可以移动个5CM,然后马上又回到原位置,呵呵。 不管怎么说比以前是有进步, 可能问题还在我,我再找找吧,再一次谢谢几位老师,尤其是cbm666。
回复
qiu5208 2008-03-18

For i = 1 To 60
'加一句
if i mod 20 =0 then DoEvents
'你的代码
。。。。。。。。。。

Next i
回复
cbm6666 2008-03-18
因为你的这个For...Next才60 很短,所以我不加DoEvents,加上DoEvents会降低事件处理速度,如果你的这循环很大

便应该加上 DoEvents

For i = 1 To 60
aa = Int(Rnd * 100)
For j = 1 To aa
bb = Int(Rnd * 100)
'DoEvents
Print CStr(aa) & " " & CStr(bb)
If ForceStop Then
Timer1.Enabled = False
Me.Cls
MsgBox "强迫停止"
Exit Sub
End If
Next j
Next i
回复
cbm6666 2008-03-18
在你的Timer事件中一进入, 开始处理事件前应先将Timer1.enabled=False 完事后再True

在Timer1事件里面如有For..Next 或 Do...Loop 要在循环里面加个退出FLAG 例如我的ForceStop

'添加 Command1 Command2 Timer1

Dim i&, j&, aa&, bb&, MousX%, MousY%, ForceStop As Boolean, MoveScreen As Boolean

Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = False
Command1.Caption = "开 始"
Command2.Caption = "停 止"
End Sub

Private Sub Command1_Click()
Randomize
ForceStop = False
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
ForceStop = True
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
Me.Cls
For i = 1 To 60
aa = Int(Rnd * 100)
For j = 1 To aa
bb = Int(Rnd * 100)
Print CStr(aa) & " " & CStr(bb)
If ForceStop Then
Timer1.Enabled = False
Me.Cls
MsgBox "强迫停止"
Exit Sub
End If
Next j
Next i
Timer1.Enabled = True
End Sub

Private Sub command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
MoveScreen = True
MousX = X: MousY = Y
End If
End Sub

Private Sub command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MoveScreen Then
CurrX = Command1.Left - MousX + X
CurrY = Command1.Top - MousY + Y
Command1.Move CurrX, CurrY
End If
End Sub

Private Sub command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
MoveScreen = False
End Sub


回复
[Quote=引用楼主 zgznn 的帖子:]
定时器里干的事是监督正在运行本程序以外的其它程序的用途,比如说“记事本”或者“计算器”等等
[/Quote]

原来群里那个人是你呀.

你这功能何必搞得这么复杂.

把DoEvents放在你的循环里面试一下.
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7489

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-03-18 12:01
社区公告
暂无公告