2016-06-23 5 views
1

Ich versuche, die DB zu schließen, nachdem 2 Minuten vergangen sind (zu Testzwecken mache ich gerade eine MsgBox erscheinen nach den 2 Minuten). Um dies zu tun, habe ich ein Hauptformular namens DTForm und eine versteckte Form namens Timer. Beide Formulare öffnen beim Öffnen des DB, aber Timer öffnet sich im versteckten Modus.Access VBA: Form Timer zeigt MsgBox zur geplanten Zeit

AutoExec Macro:

1. Open DTForm (the main form) 
2. Open Timer (the hidden form) 

Modul 1:

Option Compare Database 
Option Explicit 

Public timer_start As Date 
Public timer_end As Date 
Public timer_diff As Integer 

DTFORM (Benutzer nur dieses Formular sehen)

Option Compare Database 
Option Explicit 

Public Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 

    timer_start = Time 

    timer_end = DateAdd("n", 2, timer_start) 

End Sub 

Timer (die versteckte Form):

Option Compare Database 
Option Explicit 

Public Sub Form_Open(Cancel As Integer) 

    timer_start = Time 
    timer_end = DateAdd("n", 2, Time) 

End Sub 

Public Sub Form_Load() 

    timer_start = Time 
    timer_end = DateAdd("n", 2, Time) 

End Sub 

Public Sub Form_Timer() 

    timer_diff = DateDiff("n", timer_end, Time) 

    If timer_diff >= 0 Then 

     'Application.Quit 
     MsgBox "timer reached 0" 
     timer_start = Time 
     timer_end = DateAdd("n", 2, Time) 

    End If 

End Sub 

Update - das Problem: So, jetzt das Problem ist die Maus. Es sieht so aus, als würde nur die Maus um das Formular bewegt werden. Allerdings, bewegt die Maus aus dem Navigationsbereich in das Formular und zurück (rein und raus) löst die Mausbewegung aus. Das erscheint wirklich kontraintuitiv - warum nicht alle Mausbewegungen berücksichtigen?

Anmerkungen: Hinzugefügt Option Explicit zu den Oberseiten beider Formen und reparierte einige fehlende variable Deklarationen.

+0

application.OnTime könnte besser für Sie arbeiten? Oder konnten Sie die DB-Verbindung nicht nach 2 Minuten ohne Zeitüberschreitung einrichten? –

+0

Wie lautet die Timer-Eigenschaft Ihres Formulars? Was ist timer_start? Du hast es nirgendwo definiert. Fügen Sie oben die Option Explicit hinzu - deklarieren Sie dann alle von Ihnen verwendeten Variablen. Wenn Sie einen Variablenwert über Ereignisse hinweg verfolgen wollen, müssen Sie ihn oben deklarieren - vor allem Subs – dbmitch

+0

@CodyG. Ich brauche die ganze DB um zu schließen. – whatwhatwhat

Antwort

1

hinzufügen, werden Wenn Sie mit ihm durchgehen wollen, die Form_MouseMove Ereignis in jede Form sein muss, weil nur die aktive Form der Move erhält Veranstaltung.

Hinweis: Sie brauchen die Variable timer_start überhaupt nicht.Sie können es entfernen und halten nur:

Public Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 

    timer_end = DateAdd("n", 2, Time) 

End Sub 

Oder etwas sauberer:

Public Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 

    Call UpdateTimer() 

End Sub 

und in Ihrem Module1:

Public Sub UpdateTimer() 

    timer_end = DateAdd("n", 2, Time) 

End Sub 

, falls Sie sich entscheiden, das Zeitintervall zu ändern ...

Hinweis:
timer_diff sollte ein Ort sein l Variable in Timer.Form_Timer(), da es nur dort verwendet wird.

+0

Benutze ich auch das richtige Event wenn ich' Form_MouseMove' benutze ?? Ich habe die Frage bearbeitet, um sie zu erklären. Das Bewegen des Mauszeigers über das Formular löst das Ereignis grundsätzlich nicht aus. Ich dachte es wäre ... – whatwhatwhat

+0

@whatwhatwhat: Oh, interessant. Dieses Ereignis wird nur selten ausgelöst, wenn ich es teste. Sie müssen ein ** Rechteck ** im Hintergrund des Formulars erstellen (es darf nicht transparent sein) und das Ereignis '.MouseMove' anstelle des Formulars verwenden. – Andre

+0

Oh, das hat funktioniert! Das Rechteck im Hintergrund war eine tolle Idee! Vielen Dank! – whatwhatwhat

2

Dies scheint mir ein Problem mit einem variablen Bereich zu sein. Standardmäßig sind Ihre Variablen lokal.

Wenn timer_end nicht als globale oder öffentliche Variable deklariert ist, liegt sie außerhalb des Gültigkeitsbereichs, sobald Sie das Sub verlassen, wo es definiert ist. Das timer_end in Form_timer ist also eine völlig andere Variable als die in Ihrem MouseMove-Ereignis (obwohl sie den gleichen Namen haben).

Dies ist ein Grund, warum viele Leute "Option explizit" am Anfang ihres Codes setzen, da es Sie zwingt, Ihre Variablen zu deklarieren.

Sie auch eine Designstrategie verfolgen könnte, wo Sie die Variable als Parameter es global oder öffentlich zu machen, anstatt passieren

+0

Das Problem mit dem Variablenbereich wurde behoben, aber jetzt gibt es ein neues Problem: Die Datenbank wird nach 2 Minuten geschlossen, egal was passiert. Siehe bearbeitete Frage. – whatwhatwhat

+0

Der Mauszeiger wird nur ausgelöst, wenn sich die Mausbewegung innerhalb der Grenzen des Formulars befindet. Sobald sich der Fokus auf ein anderes Formular oder eine Anwendung ändert, wird das mouse move-Ereignis nicht mehr ausgelöst. –

+0

Etwas ist immer noch seltsam - so habe ich es getestet. Ich weiß, dass die MsgBox erscheint (ich habe die Application.Quit auskommentiert und zur MsgBox gewechselt) nach 2 Minuten oder? Also beginnt der Countdown. Dann, nach ** 1 Minute ** ging ich zurück zum Formular (aus einer anderen Anwendung) und klickte einige Steuerelemente an, tippte einige Dinge ein und bewegte die Maus im Allgemeinen sehr. Das sollte den Timer richtig eingestellt haben? Nein, es gab immer noch die MsgBox direkt auf dem 2-Minuten-Cue. Der Timer wird also bei Mausbewegungen nicht zurückgesetzt. – whatwhatwhat

1

DateDiff("s", timer_end, Time) einen negativen Wert, bis die 10 Sekunden der Inaktivität zurück, dann muss der Zustand geändert werden >= und das Zeitintervall bis 1000 (1 Sekunde) 1 Millisekunde ist zu schnell.

auch die Variablen, um sicherzustellen, ok option explicit Klausel

Option Compare Database 
Option Explicit 
Dim timer_start as Variant 
Dim timer_end as Variant 

Public Sub Form_Open(Cancel As Integer) 
    timer_start = Time 
End Sub 

Public Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 
    timer_start = Time 
    timer_end = DateAdd("s", 10, timer_start) 

    Me.Label6.Caption = timer_start 
    Me.Label8.Caption = timer_end 
End Sub 

Public Sub Form_Timer() 
    If DateDiff("s", timer_end, Time) >= 0 Then 
     MsgBox "timer reached 0" 
    End If 
End Sub 
+0

Der Variablenbereich wurde korrigiert, aber jetzt gibt es ein neues Problem (siehe bearbeitete Frage). – whatwhatwhat

+0

@whatwhatwash ist der 'Timer Interval' Wert gleich 1000 * 60 * 2? –

+0

@whatwhatwhat und Form_MouseMove muss zu jedem Formular in Ihrem DB hinzugefügt werden ... überprüfen Sie auch Ihre Timer-Intervall in versteckter Form –

Verwandte Themen