Post by Peter DoeringWas hast du denn fuer Code in Form_Close oder Form_UnLoad? Vielleicht
gibt's an der Vorgehensweise was zu verbessern.
Post by Christian RohrbachKann man eigentlich das Formular per VBA schließen und die weitere
Ausführung des Quelltextes verhindern? Exit Sub schließt nur die Sub, es
wird aber, falls die Sub von irgendwo aufgerufen wurde an der Stelle
weitergemacht, auch wenn das Formular geschlossen ist (unter Access 97 war
das noch nicht so, da wurde auch der Code beendet)
Nicht ganz richtig. Die aktuelle Prozedur wurde beendet, wie in allen
anderen Versionen auch. Die weitere Events treten genauso ein, es sei denn,
du cancelst ein Event durch Cancel = True (wo erlaubt) oder CancelEvent
(<F1>CancelEvent Action). Die Reihenfolge der Events findest du unter
(Form) Open - Load - Resize - Activate - Current - (Control) Enter -
GotFocus
(Control) Exit - LostFocus - (Form) Unload - Deactivate - Close.
Private Sub Form_Unload(Cancel As Integer)
If MyCriteria = True Then
Cancel = True
Exit Sub
End If
End Sub
In diesem Fall werden die weiteren Events nicht getriggert.
Das aktuelle Formular kann man per
DoCmd.Close
schliessen.
Hallo Peter,
die Eventereignisse Unload usw. machen mir keine Schwierigkeiten. Ich habe
einen Timer, der alle 10 Sekunden prüft, ob der aktuelle DS gelöscht ist.
kurze Formularbeschreibung:
es existiert auf einem Formular eine Listbox, welche beim Öffnen des
Formulars entsprechend einer Query mit Daten gefüllt wird. Der Inhalt ist
eine (gemäß Query) ausgwählte Auswahl an Primärschlüsselinhalten der dem
Formular zugrunde liegenden Tabelle. Ziel ist es bei Auswahl eines Eintrags
(der Listbox) mittels Filter den DS zu filtern, welcher dem Eintag in der
Listbox entspricht.
Erschwerende Problematik:
Es können andere User DS aus der Datenbank zwischenzeitlich löschen. Es soll
sichergestellt werden, dass niemals der Filter auf einen DS gesetzt wird,
der nicht mehr existiert. Außerdem soll die Listbox beim Feststellen einer
Manipulation der DS durch andere User aktualisiert wird (nur bei Löschungen)
etwas Pseudocode
Private Form_Timer() Aufruf erfolgt alle 10 Sekunden
'Prüfung erfolgt um zu testen, ob ein anderer User den aktuellen DS gelöscht
hat und nun in der Anzeige #gelöscht steht
wenn not isDate(Steuerelement, welches eigentlich ein Datum enthält) dann
mache ein Requery auf die Listbox
weiterer DS vorhanden?
ja: setze Filter auf den ersten DS der Listbox (ist sicher vorhanden
aufgrund des vorher stattgefundenen Requery)
nein: DoCmd.Close + Exit Sub
End sub
bis hierher kein Problem......
nun die Listbox, in welcher man durch Anklicken eines Eintrags den Filter
des Formulars neu setzt.
Listbox_after_Update()
Rufe Form_Timer (Prüfung, ob der aktuelle DS noch gültig ist)
Prüfe mittels DLookup, ob der in der Listbox ausgewählten Eintag in der DB
wirklich (noch) existiert (muß sein, könnte ja zwischenzeitlich gelöscht
sein)
ja: setze Filter auf neuen DS um (gemäß Eintag in der Listbox)
nein:
mache Requery auf Listbox (vielleicht gibt es ja noch einen....)
falls Listbox Elemente enthält: setze Filter auf den ersten
Eintag der Listbox
falls Listbox nun leer: DoCmdClose
end sub
Problematisch ist es nun, wenn die Listbox_after_Update die Form_Timer nun
aufruft und diese das Formular schließt. Denn nach dem Exit sub in
Form_Timer kommt er zur aufrufenden Prozedur zurück, in welcher dann code
steht, welcher sich auf nicht mehr existierende Steuerelemente bezieht......
Daher ist eine Abfrage hinter "Rufe Form_Timer", ob denn das Formular noch
existiert unausweichlich, ansonsten geht es auf die Bretter ((Deine Lösung
funktioniert dies bezüglich, denn Abfragen auf Steuerelemente sind nicht
mehr möglich, zumindest nicht mit isnull oder so)
Hast Du eine bessere Lösung für meinen Code?
Gruß, Christian