26. november 2002 - 13:50Der er
16 kommentarer og 1 løsning
Søgning i listbox?
I mit program har jeg to listboxe (en hvori alle dataerne findes, og en hvori søgningsresultaterne tilføjes) samt en textbox (hvori søgnings-kriteriet står)
Nu er problemet at jeg ikke kan få den til at søge i midten af en linje i listboxen.
Den eneste søge-måde jeg har fundet, er en måde, hvor den kun sørger fra begyndelsen af de ting der er i listen (dvs, vis jeg søger "t", så finder den kun dem som begynder med "t", hvilket er noget upraktisk
Her er koden jeg har brugt:
Private Function SearchList() intPlacement = Len(txtSearchTerm) strFind = UCase(txtSearchTerm.Text) LstSearchResults.Clear txtSearchTerm.SetFocus For intResult = 0 To lstMovieList.ListCount - 1 intSearchResult = InStr(UCase(Left(lstMovieList.List(intResult), intPlacement)), strFind) If intSearchResult > 0 Then '(7) LstSearchResults.AddItem lstMovieList.List(intResult) Else End If Next intResult
Kommandoen InStr vil da normalt søge efter forekomster inde i en streng, men jeg synes dit kodeeksempel ser unødvendig kompliceret ud.
If InStr(list1.text, sogekrit)> 0 then MsgBox("Forekomst i streng")
hvis Instr-udtrykket returnerer 1, betyder der at søgekriteriet indleder strengen. Der retuneres simpelthen en integer for hvor i strengen, den søgte streng begynder.
Prøv at lav et nyt project, med en form hvorpå du smider en 2 listboxe (List1 og List2), en knap (command1) og et testfelt (Text1)
Smid nedenstående kode ind, kør programmet, og det virker vist som du øsnker:
Private Sub Command1_Click() Dim i As Integer List2.Clear For i = 0 To List1.ListCount - 1 If InStr(List1.List(i), Text1.Text) > 0 Then List2.AddItem List1.List(i) Next i End Sub
Private Sub Form_Load() Command1.Caption = "Find tekst" List1.AddItem "Første linie" List1.AddItem "Anden linie" List1.AddItem "Tredie linie" List1.AddItem "Fjerde linie" Text1.Text = "de" '<- Det der søges efter - skriv hvad du vil End Sub
Tak, det ser ud til at være det, dog desværre ser det ud til at være case sensitive. Er det muligt at ændre det, til at det ikke er, da specielt brugevenligt er det ikke, at brugeren nu skal huske om han/hun skrev med stort eller ej...
Martin har gennemskuet at jeg ikke anvender variabelnavne over 8 tegn. Ellers regnede jeg med at 'adg' selv havde strikket koden sammen, - men det er måske noget fra et downloadet eksempel. Så det med at løbe listen igennem anså jeg for velkendt.
Jeg har ikke kigget om 'Like' understøttes i min VB5 (sikkert ikke), selv sætter jeg altid både streng og søgekriterie til LowerCase: If InStr(lcase(list1.text), lcase(sogekrit))> 0 then MsgBox("Forekomst i streng")
I det oprindelige eksempel anvendes UpperCase, men det er vel hip som hap.
I øvrigt anvender jeg ikke 2 lister når jeg laver søgefunktioner til lister, men kun én. Ved indlæsning i listen opretter jeg samtidg alle poster i et array, og så søger jeg i array'et for hver tegns indtastning i søgefeltet. Listen vil så løbende kun indeholde de poster der matcher søgekriteriet. Når søgefeltet blankes vises påny alle poster i listen. Når listen evt. kun indeholder én post får denne focus, hvilket udløser at postens øvrige data indlæses fra selve datafilen til en række felter.
Listen indeholder poster der er basens unikke nøgle - eller det felt brugeren har valgt at søge på som nøgle.
Private Sub txtsogund_Change() lstunder.Clear For X = 0 To Y If InStr(LCase(undgrp(X)), LCase(txtsogund.Text)) > 0 Then If chkordaf.Value = 0 Then lstunder.AddItem undgrp(X) Else lstunder.AddItem Mid$(undgrp(X), 5) & " " & Left(undgrp(X), 3) End If End If Next X If lstunder.ListCount = 1 Then lstunder.ListIndex = 0 End If End Sub
Eksemplet er fra et projekt. Variablen Y indeholder Ubound(undgrp).
Min kode, der er ændret, så den ikke er case-sensitive - det eneste jeg har gjort er at tilføje 2 stk. LCase():
Private Sub Command1_Click() Dim i As Integer List2.Clear For i = 0 To List1.ListCount - 1 If InStr(lcase(List1.List(i)), lcase(Text1.Text)) > 0 Then List2.AddItem List1.List(i) Next i End Sub
Private Sub Form_Load() Command1.Caption = "Find tekst" List1.AddItem "Første linie" List1.AddItem "Anden linie" List1.AddItem "Tredie linie" List1.AddItem "Fjerde linie" Text1.Text = "de" '<- Det der søges efter - skriv hvad du vil End Sub
Jeg undrer mig over, at du ikke SELV kan finde ud af at smide en Lcase ind - når du endda selv bruger Lcase (eller UCase) i dit eget eksempel. Du har tydeligvis ikke selv kodet den kode du har brugt, og til det kan jeg kommentere, at du lærer 1000 gange mere ved selv at kode tingene end bare at snuppe andres (måske tvivlsomme) kode...
Ja, jeg ved man lærer mere vis man selv koder, men jeg har ikke kunnet findet nogle gode toturals, så derfor prøver jeg at lære fra andres koder, men i dette tilfælde kunne jeg ikke finde nogen forståelig kode.
Inden du går alt for voldsomt i krig med dit program, så køb en bog om VB6 (f.eks. af Peter Wright, Beginning Visual Basic 6), så du kan lære det helt grundlæggende først. Feks. forskellen på en function og en procedure (Sub) *), hvordan man opbygger en it-then-else sætning, hvad en "event" er osv. Du vil spare dig selv for en masse bøvl!!!
*) du bruger en Function, men returnerer ikke noget i funktionsnavnet. Altså burde du nok bruge en Sub i stedet for :o)
Fik du hvad du skulle bruge, så accepter, ellers spørg videre...
Ok, så må jeg hellere skrive en sådan bog på ønskelisten. Kender i en god dansk bog, som jeg kan begynde med, eller skal jeg starte et nyt spørgsmål for det?
Men ellers, ang. problemet her, så har jeg fået svar på hvad jeg ønskede
Hej adg. Bare klø på! Jeg kender et lille Gruk, du ved de små digte af Piet Hein.
Lovet være den lykke at livet er gjort så vist og viljer og vanskeligheder er afvejet så præcist at ingenting er umuligt og intet for svært at ta' men visse ting yder en modstand som sigter idioterne fra.
Det gælder jo mest for livets store anliggender, men jeg nævner det for at advare imod at finde det laveste sted på hegnet, oftest får man mere ud at at klatre over, derfra hvor man står.
Brug evt. søgefunktionen i Eksperten til at gå på opdagelse, også indenfor spørgsmål du måske ikke lige skal bruge nu.
Og ja, jeg kan nogen gange godt finde på at finde det laveste sted på hegnet, og ved godt det ikke er det smarteste... Men tak for de vise ord :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.