Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - In Listbox suchen


s4lzh3r1ng - So 04.08.02 19:49
Titel: In Listbox suchen
Hallo zusammen !

Weiß jemand wie ich in einer Listbox suchen kann, ob ein Eintrag
vorhanden ist ?


MrSpock - So 04.08.02 20:51

Hallo s4lzh3r1ng,

bist du beim Eingeben deines Namens von der Tastaur abgerutscht :mrgreen: ?

Zu deiner Frage. Die ListBox hat eine Eigenschaft Items vom Typ TString. Und dort gibt es z.B. die Methode IndexOf:


Quelltext
1:
2:
3:
4:
5:
index :=  ListBox1.Items.IndexOf('suchstr');
if index > -1 then
   ShowMessage('Es handelt sich um den '+IntToStr(index+1)+'-ten Eintrag')
else
  ShowMessage('Eintrag existiert nicht.');


s4lzh3r1ng - So 04.08.02 21:16

Jo, danke erst mal für die Antwort. Das wars was ich suchte.

Das mit demnamen soll natürlich so sein .... :wink:


s4lzh3r1ng - So 04.08.02 21:58

Hmm, ist es auch möglich das nur Teile des Eingegebenen Suchstrings dem Inhalt in der Listbox entsprechen müssen ?
Wie könnte man das programmieren ?
Weiß das jemand ?


LordZero - So 04.08.02 22:43

Also wenn du nur einen Teilstring suchen willst, würde es auf alle fälle mal so gehen. Ob es dazu schon ein vohandene Methode der Komponente gibt weiß ich nicht ...

Aber so gehts wohl:

Quelltext
1:
2:
3:
4:
5:
For Run := 0 to ListBox.ItemCount -1 do
begin
 if  not Pos(Suchstring, ListBox.Items[Run]) = 0 then 
    ShowMessage('Ergebnis an ' + IntToStr(Run) + 'ter Position');
end;

Hoffe das hat dir geholfen ...

Gruß
Werner


Christian S. - So 04.08.02 22:57

Hi!

Wenn Du nur wissen willst, ob die Komponente mindestens einmal vorhanden ist, dann kannst du in obigen Quelltext eigentlich nach dem ersten Vorkommen aufhören.


Quelltext
1:
2:
3:
4:
run:=0;
while (Pos(Suchstring, ListBox.Items[Run]) = 0) and (run<ListBox.ItemCount-1) do inc(run)
if not Pos(Suchstring, ListBox.Items[Run]) = 0 then 
ShowMessage('Ergebnis an ' + IntToStr(Run) + 'ter Position');


MfG,
Peter


LordZero - So 04.08.02 23:11

Nochmal ne idee - eigentlich nur um zu zeigen dass meine Methode genau so gut ist wie die vom Peter Lustig - fals man wirklich will dass man beim ersten Ergebnis schon aufhört! ;)

Code:

Quelltext
1:
2:
3:
4:
5:
6:
For Run := 0 to ListBox.ItemCount -1 do
  if not Pos(Suchstring, ListBox.Items[Run]) = 0 then
  begin
    ShowMessage('Ergebnis an ' + IntToStr(Run) + 'ter Position');
    Break; // Unterbricht die For-Schleife
   end;


@Peter Lustig:
Sorry will dich nicht kritisieren - is nur für mein Ego! ;)


Christian S. - So 04.08.02 23:24

Hi!

@LordZero
LordZero hat folgendes geschrieben:
@Peter Lustig:
Sorry will dich nicht kritisieren

Auch das wäre kein Grund, sich zu entschuldigen!!!!

Zu Deinem Code:
Macht genau das gleiche wie meiner, ist aber kürzer und übersichtlicher :arrow: besser.

MfG,
Peter


LordZero - Mo 05.08.02 15:31

@Peter Lustig

Ich denke eigentlich das mein Code übersichtlicher ist als Deiner. Ist nicht so ne große while Schleife - aber das ist dann wohl Geschmackssache! ;)

Das er das selbe mach war mir schon auch irgendwie klar!!!


s4lzh3r1ng - Mo 05.08.02 16:31

vielen Dank ihr beiden !

werd's mal ausprobieren . . .


s4lzh3r1ng - Mo 05.08.02 17:11

äh, nichts für ungut aber wenn ich euren Code verwende tut sich überhaupt nichts mehr, er findet den Suchstring nicht mal dann wenn ich ihn in voller Länge eingebe . . .

Quelltext
1:
2:
3:
4:
5:
For Run := 0 to form1.ListBox1.Items.Count -1 do
begin
if  not Pos(edit1.Text, form1.ListBox1.Items[Run]) = 0 then
    ShowMessage('Ergebnis an ' + IntToStr(Run) + 'ter Position');
end;


Den Aufruf Listbox1.itemcount gabs auch nich,also musste ich Item.Count verwenden . Woran liegts das das nicht funktioniert ???


Christian S. - Mo 05.08.02 17:59

@LordZero:
Zitat:
Ich denke eigentlich das mein Code übersichtlicher ist als Deiner. Ist nicht so ne große while Schleife - aber das ist dann wohl Geschmackssache!

Das meinte ich doch!!! Keiner versteht mich !!!!! :?

@s4lzh3r1ng:
Ich habe den Code aus Deinem letzten Posting mal in ein Projekt kopiert und er funktioniert tadellos! (Du hast das "break;" vergessen oder willst es nicht haben)

MfG,
Peter

P.S.: Soll ich Dir das Projekt (1 Editfeld, 1ListBox, 1Button) mal zuschicken?


Christian S. - Mo 05.08.02 18:00

Habe vergessen: es sollte vielleicht besser heißen IntToStr(run+1), damit er mit der 1. und nicht mit der 0. Position beginnt!


s4lzh3r1ng - Mo 05.08.02 18:29

(verstehdieweltnichtmehr) :x
Es klappt bei mir nicht . . .

@Peter Lustig: Wär schon schön wenn du es mir mal zuschicken könntest.
Anscheinend bekomme ich das nicht hin . . .


MrSpock - Mo 05.08.02 19:34

Hallo s4lzh3r1ng,
die Funktion Pos sucht casesensitiv, unterscheidet also Groß- und Kleinschreibung. Könnte das der Grund sein, warum es bei dir nicht funktioniert?


s4lzh3r1ng - Mo 05.08.02 20:41

Keine Ahnung ob es daran gelegen hat,
Aber als mir Peter Lustig sein Programm zugemailt hat, lief es, naja
also vielen Dank Peter Lustig.
Aber die Option auch zwischen Groß und Kleinschreibung nicht zu unterschieden ist schön, wäre so etwas auch machbar ?


Christian S. - Mo 05.08.02 20:55

Hi!

Du kannst mit zwei temporären Strings arbeiten, die

a.) den Inhalt von edit1.text in Großbuchstaben
b.) den Inhalt von form1.ListBox1.Items[Run] in Großbuchstaben

enthalten.

Diese Strings erzeugst du z.B. so:

Quelltext
1:
2:
edit_temp:='';
for i:=1 TO Length(edit1.text) DO edit_temp:=edit_temp+UpCase(edit1.text[i]);


Das gleiche machst Du dann jedesmal mit form1.ListBox1.Items[Run]. Dann suchst Du in b.) nach a.). Da beide nur noch Großbuchstaben enthalten, ist das ganze nicht mehr case-sensitive.

Am Besten erstellst Du Dir eine Funktion "UpCaseAll(st : String) : String",
die Dir den "großen" String erstellt!

MfG,
Peter


s4lzh3r1ng - Mo 05.08.02 21:19

Ja, das ist es !!!

Ich danke allen Beteiligten für Ihren zahlreichen Beiträge,
jetzt ist mein Programm fertig !!

Vielen Dank und bis demnächst :wink:


Buggi - Di 06.08.02 15:19
Titel: keine GROß / klein - Unterscheidung
Hi,

zur Groß/klein-Unterscheidung muß ich mal was anmerken.
Wenn ich nicht ganz falsch liege gibt es schon eine passende Routine, die
einen string komplett umwandelt: "AnsiLowerCase"
Der obige Code würde demnach so aussehen:

Quelltext
1:
2:
3:
4:
5:
For Run := 0 to form1.ListBox1.Items.Count -1 do 
begin 
if  not Pos(AnsiLowerCase(edit1.Text), AnsiLowerCase(form1.ListBox1.Items[Run])) = 0 then 
    ShowMessage('Ergebnis an ' + IntToStr(Run) + 'ter Position'); 
end;


Gruß Buggi


Christian S. - Di 06.08.02 16:47

Hey, stimmt! Die Funktion kannte ich noch nicht.

Um jetzt mal den überpeniblen Korinthenkacker zu spielen: hier müsste es AnsiUpperCase() heißen, damit alles groß wird. Aber für das eigentliche Problem ist es natürlich absolut egal.


MfG,
Peter