我在使用VB 的过程中发现我使用以下方式编写代码时,程序不能完全退出:
Private sub test_Load()
do while true
Doevents
loop
end sub
即使我关闭了窗口,但是因为有个死循环始终在执行,所以一直不能完全关闭。增加Doevents的目的是使得我能关闭窗口。我在实际使用过程中,需要使用到无限期等待,所以发现了这个问题,没办法解决,请教高手指点。谢谢!
Private sub test_Load()
do while true
Doevents
loop
end sub
即使我关闭了窗口,但是因为有个死循环始终在执行,所以一直不能完全关闭。增加Doevents的目的是使得我能关闭窗口。我在实际使用过程中,需要使用到无限期等待,所以发现了这个问题,没办法解决,请教高手指点。谢谢!
或者这样Option Explicit
Dim blnExit As BooleanPrivate Sub Command1_Click()
'单击这个按钮就退出
blnExit = True
Unload Me
End SubPrivate Sub Form_Load()
Me.Show
Do While blnExit = False
DoEvents
Loop
End Sub
End
End Sub
End
End Sub
End
End Sub
Dim IsExit As Boolean
Private Sub Command1_Click()
Dim L As Long
IsExit = False
Do While DoEvents
If IsExit = True Then Exit Do
L = L + 1
Loop
End Sub
Private Sub form_unload()''或者在form_unload模块中等等
IsExit = True
End Sub
其中 isexit是全局变量
有些人喜欢用end语句来结束程序,小程序固然可以,但当太大,或者调用了某些特殊的api函数后可能导致预想不到的错误,如果装载了许多东西在程序结束时不处理将卸载很慢,而且这种做法也极不符合正规软件的要求...总之end语句毛病很多,此不详谈,建议少使用甚至不使用
End 停止执行。不是必要的,可以放在过程中的任何位置关闭代码执行、关闭以 Open 语句打开的文件并清除变量。
End Function 必要的,用于结束一个 Function 语句。
End If 必要的,用于结束一个If…Then…Else 语句块。
End Property 必要的,用于结束一个Property Let、Property Get、或 Property Set 过程。
End Select 必要的,用于结束一个 Select Case 语句。
End Sub 必要的,用于结束一个 Sub 语句。
End Type 必要的,用于结束一个用户定义类型的定义(Type 语句)。
End With 必要的,用于结束一个 With 语句。
说明在执行时,End 语句会重置所有模块级别变量和所有模块的静态局部变量。若要保留这些变量的值,改为使用 Stop 语句,则可以在保留这些变量值的基础上恢复执行。注意 End 语句不调用 Unload、QueryUnload、或 Terminate 事件或任何其它 Visual Basic 代码,只是生硬地终止代码执行。窗体和类模块中的 Unload、QueryUnload、和 Terminate 事件代码未被执行。类模块创建的对象被破坏,由 Open 语句打开的文件被关闭,并且释放程序所占用的内存。其它程序的对象引用无效。End 语句提供了一种强迫中止程序的方法。Visual Basic 程序正常结束应该卸载所有的窗体。只要没有其它程序引用该程序公共类模块创建的对象并无代码执行,程序将立即关闭。
通过试验发现,ceagle(无知者无畏) 提出来的“end困惑”的确存在,当我的form中调用了某些API函数或者其他某些第三方控件时,程序并不能依赖end而完全退出,还有一些资源依旧被占用。51365133(渊海)的解释应该是比较合理的。
再次谢谢大家!
unload me
'退出系统函数声明
Private Sub UnloadPrj()
Dim frm As Form
For Each frm In VB.Forms
If frm.Name <> "Main" Then
Unload frm
End If
Next
End
End Sub'调用
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("确定退出系统?", vbYesNo + vbQuestion, "提示") = vbYes Then UnloadPrj '卸载程序
Else
Cancel = 1
UnloadMode = 1
End If
End Sub
Private Sub UnloadPrj()
Dim frm As Form
For Each frm In VB.Forms
Unload frm
Next
End
End Sub
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Const GW_OWNER = 4
Public Const WM_CLOSE = &H10
SC_CLOSE = &HF060&Public Function GetIDEmode() As Boolean
Dim strfileName As String
Dim lngCount As Long
strfileName = String(255, 0)
lngCount = GetModuleFileName(App.hInstance, strfileName, 255)
strfileName = Left(strfileName, lngCount)
If UCase(Right(strfileName, 7)) <> "VB6.EXE" Then
GetIDEmode = False '否
Else
GetIDEmode = True '是
End If
'//也可以获取VB的版本等信息
End Function
然后弄个Timer出来
在里面写 If GetIDEmode = False Then '开发环境
Dim lhWndTop As Long
Dim lhWnd As Long
lhWnd = Me.hwnd
lhWndTop = lhWnd
Do While Not (lhWnd = 0)
lhWnd = GetWindow(lhWnd, GW_OWNER)
If Not (lhWnd = 0) Then
lhWndTop = lhWnd
End If
SendMessage lhWndTop, WM_CLOSE, SC_CLOSE, SC_CLOSE '这是关闭的特殊方法
Loop
Else
End
End If
或者unload me