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:
  { deine suchfunktion }
  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;
  { deine weitersuchen- funktion }
  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 user profile iconcrowley 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

user profile iconMiri 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 ;)