Liste durchsuchen, während der Benutzer tippt
Sie bauen ein Formular, dessen Kundenliste sich 400 ms nach dem letzten Tastendruck selbst filtert und dessen Zähler
offener Sitzungen alle 30 Sekunden aktualisiert wird. Beides läuft auf einer einzigen WklTimerList; weder eine
DoEvents-Schleife noch ein Formularzeitgeber ist nötig.
Voraussetzungen
- Microsoft 365 Access oder Access Runtime, in 32 oder 64 Bit, mit der WKL Forms Object Library 1.60 oder höher, installiert und für den aktuellen Windows-Benutzer registriert (Freigegebenes Paket installieren).
- Eine Tabelle
tblKundemit den FeldernID(Zahl, Primärschlüssel) undName(Kurzer Text) und einigen Datensätzen; eine TabelletblSitzungmitID(Zahl, Primärschlüssel) undOffen(Ja/Nein).
Schritte
1. Steuerelemente einfügen
Legen Sie in der Entwurfsansicht ein Formular frmSuche an mit:
- einem Textfeld
txtSuche, - einem Listenfeld
lstKunden(Herkunftstyp Tabelle/Abfrage, zwei Spalten, Breite der ersten Spalte 0), - einem Textfeld
txtOffen, - der Zeitgeberliste: Formularentwurf › Steuerelemente › ActiveX-Steuerelemente, WKL Timer List, mit dem Namen
Timer1. Sie zeigt in der Entwurfsansicht ihren Namen und ist in der Formularansicht unsichtbar.
2. Die beiden Aufgaben festlegen
Die Aufgaben werden mit dem Formular gespeichert. Legen Sie sie einmal per Code in der Entwurfsansicht fest: Fügen Sie
die Prozedur in ein Standardmodul ein und führen Sie sie im Direktbereich aus (SetupSearchTasks). Der Designer des
Steuerelements (Eigenschaftenblatt, Registerkarte Andere, Zeile Benutzerdefiniert, [...], Seite Tasks)
enthält dieselben Einstellungen in einer Tabelle.
Public Sub SetupSearchTasks()
Dim t As Object
On Error GoTo ErrorHandler
DoCmd.OpenForm "frmSuche", acDesign
Set t = Forms("frmSuche").Controls("Timer1").Object
t.Tasks.Clear
t.Tasks.Add "search"
t.Tasks("search").Delay = 400 ' 400 ms after the last Restart
t.Tasks.Add "count"
t.Tasks("count").Interval = 30000 ' every 30 seconds
DoCmd.Close acForm, "frmSuche", acSaveYes
FinalHandler:
Set t = Nothing
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbExclamation
Resume FinalHandler
End Sub
3. Ereignisprozeduren schreiben
Öffnen Sie das Modul von frmSuche und fügen Sie Folgendes hinzu:
Option Compare Database
Option Explicit
Private Sub Form_Load()
On Error GoTo ErrorHandler
ShowCustomers ""
Me!Timer1.Object.Tasks("count").Start
Me!Timer1.Object.Tasks("count").Trigger ' count once at once, then every 30 seconds
FinalHandler:
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbExclamation
Resume FinalHandler
End Sub
Private Sub txtSuche_Change()
On Error GoTo ErrorHandler
' Every key press starts the 400 ms again; only the last one leads to a search.
Me!Timer1.Object.Tasks("search").Tag = Me!txtSuche.Text
Me!Timer1.Object.Tasks("search").Restart
FinalHandler:
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbExclamation
Resume FinalHandler
End Sub
Private Sub Timer1_TaskDue(ByVal Key As String, ByVal RunId As Long, ByVal Tag As Variant, Cancel As Integer)
On Error GoTo ErrorHandler
Select Case Key
Case "search": ShowCustomers Nz(Tag, "")
Case "count": Me!txtOffen = DCount("*", "tblSitzung", "Offen = True")
End Select
FinalHandler:
Exit Sub
ErrorHandler:
' A repeating event: note the error instead of showing a dialog every 30 seconds.
Me!txtOffen = "?"
Resume FinalHandler
End Sub
Private Sub ShowCustomers(ByVal text As String)
Me!lstKunden.RowSource = "SELECT ID, Name FROM tblKunde WHERE Name LIKE '" & Replace(text, "'", "''") & "*' ORDER BY Name"
End Sub
4. Ausprobieren
Öffnen Sie frmSuche in der Formularansicht und tippen Sie zügig einen Namen in txtSuche: Die Liste ändert sich
während des Tippens nicht und filtert einmal, 400 ms nach Ihrem letzten Tastendruck. Setzen Sie in tblSitzung eine
Sitzung auf Ja und warten Sie: txtOffen zeigt die neue Anzahl innerhalb von 30 Sekunden.
Erwartetes Ergebnis
Die Liste filtert einmal je Tipppause, und der Zähler wird alle 30 Sekunden aktualisiert, auch während ein Meldungsfenster des Formulars geöffnet ist (der nächste Lauf wartet, bis die Prozedur beendet ist; er geht nicht verloren). Wenn sich das Formular schließt, enden beide Aufgaben; danach trifft kein Ereignis mehr ein.
Nächste Schritte
- WklTimerList: alle Regeln für Verzögerungen, Intervalle, Überschneidungen und Wiederholungsversuche.