Farbschema: Hell
Sie befinden sich hier: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Forms Object Library » Anwendung und Verbindungen » WklTimerList » Liste durchsuchen, während der Benutzer tippt

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 tblKunde mit den Feldern ID (Zahl, Primärschlüssel) und Name (Kurzer Text) und einigen Datensätzen; eine Tabelle tblSitzung mit ID (Zahl, Primärschlüssel) und Offen (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

de/wiki/msaccess/comctl/application-and-connections/timer-list/tutorial.txt · Zuletzt geändert: von Wolfgang van der Stille