2017-08-31 155 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