タイマイベントを使うことで、処理時間が長くなった場合のみダイアログを表示。
ダイアログを開いたもしくは閉じた時点でTimerInterval=0とし表示は一度だけ。
配置コントロール
- ListBox1
- btnExec
- btnClose
Option Compare Database
Option Explicit
Private WithEvents cls1 As AsyncClass
Private WithEvents dlg As Form_dialogbusy
Dim cnStatemsg As String
Private Sub ContentsClear()
Set Me.listbox1.Recordset = Nothing
Me.listbox1.Requery
Me.listbox1 = Null
End Sub
Private Sub ContentsSet()
If Not cls1 Is Nothing Then Exit Sub
Set cls1 = New AsyncClass
Call cls1.ConnectionStart
End Sub
Private Function IsNotEnableQuery() As Boolean
If cls1 Is Nothing Then
IsNotEnableQuery = False
Else
IsNotEnableQuery = True
End If
End Function
Private Sub btnClose_Click()
If IsNotEnableQuery Then Exit Sub
DoCmd.Close
End Sub
Private Sub btnExec_Click()
If IsNotEnableQuery Then Exit Sub
ContentsClear
ContentsSet
End Sub
Private Sub cls1_WillConnect()
Debug.Print "WillConnect:" & Now()
Me.TimerInterval = 500
Call DialogUpdate("Connecting...")
End Sub
Private Sub cls1_Connected(cnStatus As ADODB.EventStatusEnum, cnError As ADODB.Error)
Debug.Print "ConnectComplete:" & Now() & " Status:" & cnStatus
Select Case cnStatus
Case adStatusOK
If Not dlg Is Nothing Then
dlg.oCaption = "Executing"
dlg.oLabelCaption = "Executing ."
End If
Call cls1.ExecQuery("SQLstring")
Case adStatusErrorsOccurred
Debug.Print "Error:" & cnError.Description
cls1.ConnectionClose
Case Else
Debug.Print "Connection Error:" & cnError.Description
cls1.ConnectionClose
End Select
End Sub
Private Sub cls1_WillExecute()
Debug.Print "WillExecute:" & Now()
Call DialogUpdate("Executing...")
End Sub
Private Sub cls1_ExecuteComplete(cnStatus As ADODB.EventStatusEnum, ResultRS As ADODB.Recordset, cnError As ADODB.Error)
Debug.Print "ExecuteComplete:" & Now() & " status:" & cnStatus
Select Case cnStatus
Case adStatusOK
Set Me.listbox1.Recordset = ResultRS
Me.listbox1.ColumnCount = ResultRS.Fields.Count
Case Else
Debug.Print "Error:" & cnError.Description
End Select
cls1.ConnectionClose
End Sub
Private Sub cls1_DisConnected()
Debug.Print "DisConnected:" & Now()
DialogClose
Set cls1 = Nothing
End Sub
Private Sub dlg_btnCancelClick()
cls1.ConnectionCancel
End Sub
Private Sub Form_Close()
On Error Resume Next
Set cls1 = Nothing
End Sub
Private Sub Form_Timer()
DialogOpen
End Sub
Private Sub DialogOpen()
If Not dlg Is Nothing Then
Me.TimerInterval = 0
Else
Set dlg = New Form_dialogbusy
dlg.oCaption = cnStatemsg
dlg.oLabelCaption = cnStatemsg
dlg.Visible = True
End If
End Sub
Private Sub DialogClose()
If Not dlg Is Nothing Then
Set dlg = Nothing
End If
Me.TimerInterval = 0
End Sub
Private Sub DialogUpdate(msg As String)
cnStatemsg = msg
If Not dlg Is Nothing Then
dlg.oCaption = cnStatemsg
dlg.oLabelCaption = cnStatemsg
End If
End Sub
0 件のコメント:
コメントを投稿