2017-08-31 100 views
0

我有一個自定義彈出窗口,只要活動需要一秒多的時間就可以打電話。例如:自定義等待彈出等待直到活動完成MS Access 2010 - 2016

PopupMsg("Getting records") 

它使一個漂亮的盒子,只是表示事情正在發生的用戶,然後悄悄地在活動完成後消失。

它適用於任何只需要大約3秒的任何事情,但除此之外,它會消失,然後用戶留下活動完成的印象。我想盡可能長時間保持它的活動狀態,但是我從未成功確定這一點。我想確保在彈出消失之前完成所有屏幕計算。

以下是我實現我PopupMsg常規

Public Function PopUpMsg(strMsg As String, Optional strTitle As String) 
Dim frmWait As New Form_Wait 

If strTitle <> "" Then 
    frmWait.OpenForm strMsg & "...", strTitle 
Else 
    frmWait.OpenForm strMsg & "..." 
End If 

End Function 

等待(稱爲「等待」的表格包含以下代碼)

Option Compare Database 
Option Explicit 

Public Property Let Message(ByVal MessageText As String) 
    Me.MessageLabel.Caption = MessageText 
    Me.Repaint 
End Property 
Public Property Get Message() As String 
    Message = Me.MessageLabel.Caption 
End Property 

Public Property Let Title(ByVal TitleText As String) 
    Me.Caption = TitleText 
End Property 
Public Property Get Title() As String 
    Title = Me.Caption 
End Property 

Public Function OpenForm(Optional MessageText As Variant, _ 
     Optional TitleText As Variant) As Boolean 
    If Not IsMissing(MessageText) Then Me.MessageLabel.Caption = MessageText 
    If Not IsMissing(TitleText) Then Me.Caption = TitleText 
    Me.Visible = True 
    Me.Repaint 
    OpenForm = True 
End Function 

回答

0

當你通過一個類的實例打開窗體,它實際上並沒有持續存在,只要Access決定進行垃圾收集並且看到沒有對錶單的引用就會被刪除。如果您希望仍然存在,直到代碼執行完成一種形式,最好的辦法是回傳這種形式:

Public Function PopUpMsg(strMsg As String, Optional strTitle As String) As Object 
    Set PopUpMsg = New Form_Wait 
    If strTitle <> "" Then 
     PopUpMsg.OpenForm strMsg & "...", strTitle 
    Else 
     PopUpMsg.OpenForm strMsg & "..." 
    End If 
End Sub 

你的代碼的其餘部分仍然有效

你可以這樣調用:

Dim WaitForm As Object 
Set WaitForm = PopupMsg("Getting records") 

這樣,您仍然依賴垃圾回收來移除表單,但只要調用它的函數完成,它就會關閉。

您也可以通過DoCmd.OpenForm "Wait"打開表單,通過Forms集合引用它,並在函數結束時使用DoCmd.Close acForm, "Wait"關閉它,但是您必須主動關閉它。該方法的完整代碼:

Public Function PopUpMsg(strMsg As String, Optional strTitle As String) 
    DoCmd.OpenForm "Wait" 
    Dim frmWait As Form 
    Set frmWait = Forms!Wait 
    If strTitle <> "" Then 
     frmWait.OpenForm strMsg & "...", strTitle 
    Else 
     frmWait.OpenForm strMsg & "..." 
    End If 
End Sub 

叫它:PopupMsg("Getting records")

關閉它在執行結束:DoCmd.Close acForm, "Wait"

如果你沒有調用代碼DoEvents,還有另一種選擇: 打開使用DoCmd.OpenForm "Wait"形式,設置它的TimerInterval1,並添加DoCmd.Close acForm, Me.Name到它的Form_Close事件

+0

ç你給我一個新的實現的「調用」例子。我這樣做:1,公共職能PopUpMsg(strMsg作爲字符串,可選strTitle作爲字符串)作爲對象 集PopUpMsg =新Form_Wait並把它稱爲這樣 暗淡WaitForm爲對象 設置WaitForm = PopupMsg(「計算」) 的DoCmd。打開WaitForm (導致一個錯誤 - 我該怎麼修復) – monty327

+0

這聽起來像你使用所有不同的方法一半,同時。我會用更多的代碼重寫它。 「你也可以......「因爲這是一個完全不同的方法(所以沒有'DoCmd',只是前兩行,並使用現有的表單代碼) –

+0

謝謝。仍然渴望看到你寫的,只是因爲我已經習慣了調用我的PopUpMsg知道它只能處理小任務,不過,我可以通過調用窗體並關閉它來獲得它的功能,這對PopUpMsg來說很好,它可以調用DoCmd.OpenForm的「Wait」 – monty327