Iskanje po seznamu med tipkanjem
Zgradite obrazec, katerega seznam strank se filtrira 400 ms po zadnjem pritisku tipke, števec odprtih sej pa se
osveži vsakih 30 sekund. Oboje teče na enem kontrolniku WklTimerList; zanka DoEvents in časovnik obrazca nista
potrebna.
Predpogoji
- Microsoft 365 Access ali okolje Access Runtime, v 32- ali 64-bitni različici, s knjižnico WKL Forms Object Library 1.60 ali novejšo različico, nameščeno in registrirano za trenutnega uporabnika sistema Windows (Namestitev izdanega paketa).
- Tabela
tblStrankes poljemaID(Število, primarni ključ) inName(Kratko besedilo) ter nekaj zapisov; tabelatblSejes poljemaID(Število, primarni ključ) inOdprta(Da/Ne).
Koraki
1. Vstavite kontrolnike
V pogledu načrta ustvarite obrazec frmIskanje z naslednjimi kontrolniki:
- polje z besedilom
txtIskanje, - polje s seznamom
lstStranke(vrsta vira vrstic Tabela/poizvedba, dva stolpca, širina prvega stolpca 0), - polje z besedilom
txtOdprte, - seznam časovnikov: Načrt obrazca › Kontrolniki › Kontrolniki ActiveX, WKL Timer List, z imenom
Timer1. V pogledu načrta prikazuje svoje ime, v pogledu obrazca pa je neviden.
2. Določite obe nalogi
Naloge se shranijo z obrazcem. Enkrat jih določite s kodo v pogledu načrta: proceduro prilepite v standardni modul
in jo zaženite iz okna Immediate (SetupSearchTasks). Oblikovalnik kontrolnika (list z lastnostmi, zavihek
Drugo, vrstica Po meri, [...], stran Naloge) vsebuje iste nastavitve v tabeli.
Public Sub SetupSearchTasks()
Dim t As Object
On Error GoTo ErrorHandler
DoCmd.OpenForm "frmIskanje", acDesign
Set t = Forms("frmIskanje").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, "frmIskanje", acSaveYes
FinalHandler:
Set t = Nothing
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbExclamation
Resume FinalHandler
End Sub
3. Napišite dogodkovne procedure
Odprite modul obrazca frmIskanje in dodajte:
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 txtIskanje_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!txtIskanje.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!txtOdprte = DCount("*", "tblSeje", "Odprta = True")
End Select
FinalHandler:
Exit Sub
ErrorHandler:
' A repeating event: note the error instead of showing a dialog every 30 seconds.
Me!txtOdprte = "?"
Resume FinalHandler
End Sub
Private Sub ShowCustomers(ByVal text As String)
Me!lstStranke.RowSource = "SELECT ID, Name FROM tblStranke WHERE Name LIKE '" & Replace(text, "'", "''") & "*' ORDER BY Name"
End Sub
4. Preizkusite
Odprite frmIskanje v pogledu obrazca in v txtIskanje hitro vnesite ime: seznam se med tipkanjem ne spreminja in se
filtrira enkrat, 400 ms po vašem zadnjem pritisku tipke. V tblSeje nastavite odprto sejo na Da in
počakajte: txtOdprte v 30 sekundah prikaže novo število.
Pričakovani rezultat
Seznam se filtrira enkrat ob vsakem premoru v tipkanju, števec pa se osveži vsakih 30 sekund, tudi kadar je odprto okno s sporočilom obrazca (naslednja izvedba počaka, da se procedura konča; ne izgubi se). Ko se obrazec zapre, se obe nalogi končata; noben dogodek ne pride več.
Naslednji koraki
- WklTimerList: vsa pravila za zakasnitve, intervale, prekrivanja in ponovne poskuse.