2010-11-25 3 views
0

Ich frage mich nur, wenn ich einige grafische Ereignisse/Animationen auf einem Splash-Screen habe, kann ich das Timer-Ereignis verwenden, um die Routine für eine kleine Zeit zu unterbrechen.MS Access: Form Timer control ... kann ich damit eine Zeitlücke in einer Routine setzen?

im Grunde mag:

-some action events 
DoEvents 
'some timer interval 
-more action code 
+0

Verwenden Timer-Ereignisse mit Vorsicht, insbesondere bei der Entwicklung, da die Ergebnisse unvorhersehbar sein können. Ich würde alles außer einem Timer verwenden, wenn es eine Alternative gibt. –

+0

Ich habe eine Formular-Fade-Routine zu meiner Antwort hinzugefügt. – Fionnuala

Antwort

1

Verwenden Sie die Windows-API zum Einschließen eine Pause zwischen den Code-Abschnitten. Siehe die sSleep() Prozedur auf dieser Seite: Make code go to Sleep

Const clngMilliSeconds As Long = 10000 '(10 seconds) ' 
'some action events ' 
DoEvents 
'some timer interval ' 
Call sSleep(clngMilliSeconds) 
'more action code ' 
+0

Das funktioniert sehr gut für die Frage, die ich gestellt habe. Ich bekomme aber immer noch nicht, was ich brauche. Ich versuche, eine Animation zu verwenden und eine Form (wie ein Splash) zu erstellen, die ein- und ausblendet. Vielleicht ist das nur mehr Mühe als es wert ist. Ich wollte nur sehen, ob ich es schaffen könnte. :) Vielen Dank! – Justin

+1

Ich würde mit "mehr Ärger als es wert ist" gehen. –

1

In diesem Fall denke ich, es wäre besser, Ihre eigenen Timer zu erstellen, indem Sie beim Start Now() zu einer Variablen zu speichern, und die Überprüfung für die Intervalle Sie wollen mit DateDiff oder sogar direkte Subtraktion, wenn Daten als Zahlen gespeichert werden.

Formular Fade

Dug aus einer sehr alten Bibliothek und nicht vor kurzem getestet. Form:

Option Compare Database 
Dim gintC 

Private Sub Form_Load() 
Me.TimerInterval = 2 
FadeForm Me, Fadezero, 1, 5 
End Sub 

Private Sub Form_Timer() 
If IsEmpty(gintC) Then 
    FadeForm Me, Fadein, 1, 15 
End If 
gintC = 1 
Me.TimerInterval = 0 
End Sub 

Modul:

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ 
(ByVal hWnd As Long, ByVal nIndex As Long) As Long 

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ 
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 

Public Declare Function SetLayeredWindowAttributes Lib "user32" _ 
(ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long 

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Public Const GWL_EXSTYLE = (-20) 

Public Const WS_EX_LAYERED = &H80000 

Public Const WS_EX_TRANSPARENT = &H20& 

Public Const LWA_ALPHA = &H2& 

'Enum for determining the direction of the fade. 

Public Enum FadeDirection 

    Fadein = -1 

    Fadeout = 0 

    Fadezero = 1 

    SetOpacity = 1 

End Enum 

Public Sub FadeForm(frm As Form, Optional Direction As FadeDirection = FadeDirection.Fadein, _ 
Optional iDelay As Integer = 0, Optional StartOpacity As Long = 5) 

    Dim lOriginalStyle As Long 
    Dim iCtr As Integer 
    'You can only set a form's opacity if it's Popup property = True. 
    If (frm.PopUp = True) Then 
     'Get the form window’s handle, and remember its original style. 
     lOriginalStyle = GetWindowLong(frm.hWnd, GWL_EXSTYLE) 
     SetWindowLong frm.hWnd, GWL_EXSTYLE, lOriginalStyle Or WS_EX_LAYERED 
     'If the form’s original style = 0, it hasn’t been faded since it was opened. 
     'To get fading to work, we have to set its style to something other than zero. 
     If (lOriginalStyle = 0) And (Direction <> FadeDirection.SetOpacity) Then 
      'Recursively call this same procedure to set the value. 
      FadeForm frm, SetOpacity, , StartOpacity 
     End If 
     'Depending on the direction of the fade... 
     Select Case Direction 
      Case FadeDirection.Fadezero 
       iCtr = StartOpacity 
       SetLayeredWindowAttributes frm.hWnd, 0, CByte(iCtr), LWA_ALPHA 
      Case FadeDirection.Fadein 
       'Just in case. 
       If StartOpacity < 1 Then StartOpacity = 1 
       'Fade the form in by varying its opacity 
       'from the value supplied in 'StartOpacity' 
       'to 255 (completely opaque). 
       For iCtr = StartOpacity To 255 Step 1 
       SetLayeredWindowAttributes frm.hWnd, 0, CByte(iCtr), LWA_ALPHA 
       'Process any outstanding events. 
       DoEvents 
       'Wait a while, so the user can see the effect. 
       Sleep iDelay 
       Next 
      Case FadeDirection.Fadeout 
       'Just in case. 
       If StartOpacity < 6 Then StartOpacity = 255 
       'Fade the form out by varying its opacity 
       'from 255 to 1 (almost transparent). 
       For iCtr = StartOpacity To 1 Step -1 
       SetLayeredWindowAttributes frm.hWnd, 0, CByte(iCtr), LWA_ALPHA 
       'Process any outstanding events. 
       DoEvents 
       'Wait a while, so the user can see the effect. 
       Sleep iDelay 
       Next 
      Case Else 'FadeDirection.SetOpacity. 
       'Just in case. 
       Select Case StartOpacity 
       Case Is < 1: StartOpacity = 1 
       Case Is > 255: StartOpacity = 255 
       End Select 
       'Set the form's opacity to a specific value. 
       SetLayeredWindowAttributes frm.hWnd, 0, CByte(StartOpacity), LWA_ALPHA 
       'Process any outstanding events. 
       DoEvents 
       'Wait a while, so the user can see the effect. 
       Sleep iDelay 
     End Select 
    Else 
     'The form’s Popup property MUST = True 
     DoCmd.Beep 
     MsgBox "The form's Popup property must be set to True.", vbOKOnly & vbInformation, "Cannot fade form" 
    End If 

End Sub 
1

Sie eine Formularebene kombinieren könnte variable Dim iStep as integer die automatisch statisch sein wird, und in Ihrem On Timer proc, so etwas wie:

Select Case iStep 
    Case 1 
     'do something' 
    Case 2 
     'do something else' 
    Case 3 
     'etc...' 
End Select 
iStep = iStep + 1 
Verwandte Themen