Entwickler-Ecke
Sonstiges (Delphi) - Tlistbox durchsuchen
mattl - Di 01.08.06 11:59
Titel: Tlistbox durchsuchen
Ich möchte in meinem Programm eine Listbox nach einem String durchsuchen lassen und falls dieser String gefunden das ganze Item(also ich meine die eine zeile der Listbox) in dem der String enthalten ist in einem Label anzeigen lassen auch eine weitersuchen Funktion wäre gut
Kann mir jemand eine mögliche Vorgehensweise/Funktion sagen
zongo-joe - Di 01.08.06 12:11
so ausm Kopf müsste das ungefähr so gehen:
for i:=1 to listbox1.items.count do
if pos(GesuchterString , listbox1.items[i-1]) > 0 then
labelAusgabe.caption:=listbox1.items[i-1];
mattl - Di 01.08.06 12:42
Der Vorgang Funktioniert leider nicht richtig
Ich könnte mir vorstellen dass es mit dem Inhalt der Listbox zusammen hängt, in der Listbox sind mehrer hunderte einträge die dem Schema
1. XXXXX XXXXX
2. VVV VVV VVV
3. hhhh h hhhhh
.
.
.
entsprechen. Kann es sein das die Funktion nicht mit Lehrzeichen zurecht kommt?
Weiters sollte es wie schon erwähnt eine Weitersuchfunktion geben
Ich sage schon mal danke für eure Antworten
crowley - Di 01.08.06 16:15
also folgendes... du musst dir ja für's weitersuchen irgendwie merken, wo du gerade bist..
desweiteren ermöglicht dir SameText das ignorieren von GROSS-/kleinschreibung.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for i := 0 to listbox1.items.count - 1 do if SameText(GesuchterString , listbox1.items[i]) > 0 then begin labelAusgabe.caption := listbox1.items[i]; listbox1.tag := i; end; for i := listbox1.tag to listbox1.items.count - 1 do if SameText(GesuchterString , listbox1.items[i]) > 0 then begin labelAusgabe.caption := listbox1.items[i]; listbox1.tag := i; end; |
mattl - Di 01.08.06 16:48
ich bekomme immer Fehlermeldung: E2008 Inkompatible Typen
bei then begin
jakobwenzel - Di 01.08.06 16:52
Setz mal ein .Text hinter die items[i].
Du hast ne Version <=7, oder?
mattl - Di 01.08.06 19:53
funktioniert leider auch nicht ich habe die 2005 PE Version
wenn ich pos nehme funktioniertes...
da habe ich dann das Problem dass wenn der gesuchte String mehrmals in der Listbox vorkommt immer der letzte gefunden wird.
z.b die einträge in der Listbox sind ja wie schon erwähnt nummeriert. Wenn ich also nach 1 suche wird der Eintrag 351 gefunden (es sind 356 einträge)
Lannes - Di 01.08.06 20:09
Hallo,
Delphi-Quelltext
1:
| function SameText(const S1, S2: string): Boolean; |
also
Delphi-Quelltext
1: 2: 3:
| if SameText(GesuchterString , listbox1.items[i]) then begin |
Der Code von
crowley sind
zwei Funktionen, die muss man getrennt ausführen,
sonst wird halt bis zum letzten weitergesucht.
mattl - Di 01.08.06 20:21
was mach ich jetzt mit der function?
und natürlich habe ich die weitersuch funktion nicht gleichzeitig mit der normalen suche ausführen lassen es wird aber trotzdem immer der letzt mögliche eintrag gefunden
mattl - Mi 02.08.06 07:47
Ich verwende jetzt folgenden Quelltext
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm4.SuchbtnClick(Sender: TObject); var suchw:string; i: integer; begin suchw:=edit1.Text; for i:=1 to listbox1.items.count do if pos(suchw, listbox1.items[i-1]) > 0 then label5.caption:=listbox1.items[i-1]; end; |
Die Suche bei eindeutigen suchbegriffen funktioniert
bei mehrfach vorkommenden such begriffen wird eben nur der letzte gefunden, also bringt auch weitersuchen nichts
und das mit sametext hat auch noch nicht funktioniert
Peinhard - Mi 02.08.06 08:21
Wenn du nicht das letzte, sondern das erste Vorkommen haben willst, mußt du nach dem Treffer 'aussteigen':
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm4.SuchbtnClick(Sender: TObject); var suchw:string; i: integer; begin suchw:=edit1.Text; for i:=1 to listbox1.items.count do if pos(suchw, listbox1.items[i-1]) > 0 then begin label5.caption:=listbox1.items[i-1]; break; end; end; |
Wenn du weitersuchen willst, mußt du dir den ItemIndex des Treffers merken und ab da weitersuchen, also nicht wieder von vorne mit 1.
freak4fun - Mi 02.08.06 08:32
Du kannst aber auch statt break einen Dialog aufgehen lassen in dem Dem Benutzer mitgeteilt wird, dass der EIntrag gefunden wurde. Und er hat dann die Möglichkeit weiter suchen zu lassen. Da kannst du über die Buttons Ja, Nein machen und dann das Ergebnis abfragen. ;)
MfG
freak
mattl - Mi 02.08.06 09:13
So suche und weitersuchen funktioniert... habe herausgefunden das zu i noch 1 addiert werden muss bevor weitergesucht wird sonst funktionierts nicht
Wenn mir jetzt noch jemand eine Lösung für das groß klein Problem sagen könnte wäre es super
freak4fun - Mi 02.08.06 09:36
Ist dir Groß- und Kleinschreibung egal? Wenn ja, kannst du den Text in der Listbox und den Suchstring für die Suche in Kleinbuchstaben umwandeln und dann vergleichen. Ich glaub das geht mit LowerCase();.
MfG
freak
mattl - Mi 02.08.06 09:38
Groß/-kleinschreibung wäre mir schon wichtig
Miri - Mi 02.08.06 09:44
kann man lowercase bzw. uppercase nicht einfach ins pos einbauen?
das säh dann so aus:
Delphi-Quelltext
1:
| if pos(LowerCase(suchw), LowerCase(listbox1.items[i-1])) > 0 then |
freak4fun - Mi 02.08.06 09:48
Aber Pos(); ist doch schon CaseSensitive, also unterscheidet Groß- und Kleinschreibung.
MfG
freak
Miri - Mi 02.08.06 09:53
wenn ich mattl richtig verstanden hab, ist es ihm wichtig,dass die groß- und kleinschreibung in seiner listbox erhalten bleibt, aber dass der suchstring durchaus ne unterschiedliche groß- und kleinschreibung haben können soll als das,was in der listbox steht...
z.b. wenn in der listbox AaBbCc steht, soll's da auch so drin bleiben. es soll aber auch gefunden werden,wenn man nach aAbBcC oder aabbcc oder AABBCC sucht...
ansonsten dürfte es, wie du ja sagtest kein problem geben,was noch gelöst werden müsste ;)
freak4fun - Mi 02.08.06 09:56
Miri hat folgendes geschrieben: |
| wenn ich mattl richtig verstanden hab, ist es ihm wichtig,dass die groß- und kleinschreibung in seiner listbox erhalten bleibt, ... |
Ah! :idea: Daran hab ich gar nicht gedacht. Das in der ListBox nichts verändert wird, stand für mich außer Frage. Danke! :)
MfG
freak
mattl - Mi 02.08.06 10:00
ja ihr habt mich richtig verstanden die Groß&Kleinschreibung in der Listbox soll beibehalten werden... aber die Groß&Kleinschreibung im suchstring soll bei der suche nicht beachtet werden
mir ist die idee gekommen eine kopie der Listbox zu erstellen und die Lowercase ganz kleinzuschreiben und in dieser zu suchen und die gefundene position aus der original listbox anzeigen zu lassen der suchbegriff muss dann eben auch immer kleingeschrieben werden
was haltet ihr von dieser möglichkeit?
Miri - Mi 02.08.06 10:44
ich hatte doch oben gesagt, wie du auch mit pos die groß- kleinschreibung ignorieren kannst...
wozu also noch die listbox kopieren?? kapier ich nich...
mattl - Mi 02.08.06 11:01
ok funktioniert danke @all
noch eine frage wenn ich das suchergenis jetzt in ein label ausgebe gibt es dan die möglichkeit den suchstring im label zukennzeichnen?
Miri - Mi 02.08.06 11:07
neue frage, neues topic... und von zeit zu zeit mal wieder die suche quälen, da findest du bestimmt auch genug dazu ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!