Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - listbox nach string durchsuchen


110022 - Mi 19.12.07 17:46
Titel: listbox nach string durchsuchen
ich möchte dass mein prgramm einen string aus nem editfeld in einer listbox such.
wenn es gefunden wurde wir es markiert, aber wie ??


Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 19.12.2007 um 16:48


Christian S. - Mi 19.12.07 17:51

Hallo!

Schaue Dir mal die ListBox.Items.IndexOf-Methode an. Außerdem kannst Du über ListBox.Selected[idx] := true den Eintrag mit dem Index "idx" markieren.

Grüße
Christian


Kroko - Mi 19.12.07 17:51

Wie viele Thread brauchst Du zum gleichen Thema?
siehe hier [http://www.delphi-forum.de/viewtopic.php?t=79224]


Silas - Mi 19.12.07 17:52

Wenn du jeweils nur ein Item markieren möchtest, geht das über ListBox.ItemIndex.


110022 - Mi 19.12.07 17:59

wie würde das denn aussehen?
in etwa so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button10Click(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
listbox1.itemindex;
end;
end;


end.

aber ich bin mir sehr sicher dass alles falsch ist


Marc. - Mi 19.12.07 18:02

Hast Du dir user profile iconChristian S. Beitrag durchgelesen? :roll:
Die Zählung bei der Listbox beginnt übrigens bei 0, d.h. Deine Schleifen läuft wenn überhaupt nur bis count - 1.

//edit: Ich empfehle Dir zudem dringenst(!) Dir unbekannte Funktionen in der DOH nachzuschlagen. (Markieren + F1)

Grüße
Marc


110022 - Mi 19.12.07 18:10

hilft mir grade nich weiter.
wie gehts richtig?
muss morgen das info projekt fertig haben.


Marc. - Mi 19.12.07 18:18

Wie wäre es mit etwas Eigenständigkeit?
Du benötigst weder eine Schleife noch POS!
Was du brauchst sind lediglich:
• Listbox.Items.IndexOf();
• Listbox.ItemIndex

Das solltest Du nun aber verknüpfen können. ;)

cu
Marc


110022 - Mi 19.12.07 18:21

sry aber leider nich


Yogu - Mi 19.12.07 18:23

user profile iconMarc. hat folgendes geschrieben:
Die Zählung bei der Listbox beginnt übrigens bei 0, d.h. Deine Schleifen läuft wenn überhaupt nur bis count - 1.

Er hat doch alles richtig gemacht, nur etwas umständlicher. Siehe hier:

user profile icon110022 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
for i:=1 to listbox1.items.count do
if pos(suchw, listbox1.items[i-1]) > 0 then {...}


Er zieht doch von der Index-Variable 1 ab.


Marc. - Mi 19.12.07 18:23

Zeig uns doch mal Deinen Ansatz. Wo hakt es denn? Was funktioniert nicht?
Zitat:
sry aber leider nich

Sagt leider nicht allzu viel aus. :nixweiss:

edit: Yogu, das habe ich schlichtweg ich überlesen. ;)

cu
Marc


110022 - Mi 19.12.07 18:28

Also:
ich habe das hier

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button10Click(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
listbox1.itemindex;
end;
end;


end.

und will das der text aus einem edit feld in der listbox gesucht und markiert wird.
wenn er nicht gefunden wird kommt ne kleine meldung.


Marc. - Mi 19.12.07 18:33

Den Code hast Du doch bereits gepostet und die Begriffe hast Du dir auch noch nicht angeschaut. :?

Delphi-Quelltext
1:
2:
3:
4:
  suchw:=edit1.Text;
  for i:=1 to listbox1.items.count do
   if pos(suchw, listbox1.items[i-1]) > 0 then
     Listbox1.itemindex := i - 1;

Nun wird jeweils das letzte gefundende Element markiert!
Ich denke, das sollte als Denkanstoß reichen. :)

Grüße
Marc


Yogu - Mi 19.12.07 18:37

Folgender Code reicht doch vollkommen aus:


Delphi-Quelltext
1:
2:
if ListBox.IndexOf(String) >= 0 then
  ListBox.ItemIndex := ListBox.IndexOf(String);

Alle anderen Lösungen sind eigentlich unnötig kompliziert.

Bitte beachtet, dass ich aus Sicherheitsgründen meinen Code verbessert habe. Durch diesen kleinen Bug entstand folgendes Missverständnis.


Marc. - Mi 19.12.07 18:38

Vielleicht soll er es aber mit einer For-Schleife lösen.
Es soll Lehrer geben, die auf nicht bereits fertige Funktionen stehen - sprich auf Selbst-Geschriebenes, bei dem auch noch der Ablauf erkannbar ist. :)

cu
Marc


Yogu - Mi 19.12.07 18:45

Ich denke nicht, dass das selektieren eines Eintrags in einer Liste das Hauptthema des Projekts ist. Da würd man doch wohl solche Funktionen benutzen dürfen. Man kann natürlich auch das ganze in Assembler schreiben, am besten noch dazu ein OS, auf dem man das Programm zum Laufen bringt. Dann hat man alles selber gemacht :P


Christian S. - Mi 19.12.07 18:49

Die Methode über IndexOf ist nicht das Gleiche wie die Methode über Schleife+Pos. Bei letzterem wird auch ein Eintrag gefunden, der den gesuchten String nur enthält aber nicht identisch ist.


110022 - Do 20.12.07 15:35

---hier stand nichts brauchbares von mir :wink: ---
---diesen eintrag nicht beachten ---


Christian S. - Do 20.12.07 15:43

Zeige mir das Wort "IndexOf" in Deinem Quelltext :roll:

Und beschäftige Dich mal mit Grundlagen!


110022 - Do 20.12.07 15:45

ich meine nur wie das hier richtig geht

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
w:string;
begin
w:=edit1.text;
if ListBox1.ItemIndex(w) >= 0 then
  ListBox1.ItemIndex := ListBox1.ItemIndex(w);
end;


FEHLER

[Fehler] Unit1.pas(33): Operator oder Semikolon fehlt
[Fehler] Unit1.pas(34): Operator oder Semikolon fehlt


Christian S. - Do 20.12.07 15:46

Mit listBox1.Items.IndexOf(deinString) den passenden Index suchen. Diesen Index der listBox1.ItemIndex-Eigenschaft zuweisen.


LorenzS - Do 20.12.07 15:54

Zitat:
dann kommen aber 2 fehler

Delphi-Quelltext
1:
2:
3:
  
[Fehler] Unit1.pas(33): Operator oder Semikolon fehlt
[Fehler] Unit1.pas(34): Operator oder Semikolon fehlt

wie is das richtig?


Es wäre noch praktisch wenn uns zeile 33 und 34 explizit kopierst!


110022 - Do 20.12.07 16:08

zeile 33 =if ListBox1.ItemIndex(w) >= 0 then
zeile 34 =ListBox1.ItemIndex := ListBox1.ItemIndex(w);
die meldungen kennt ihrt ja schon


Marc. - Do 20.12.07 17:04

...
Was ist "w" ? Verwechselst du ItemIndex eventuell mit IndexOf ?
Schau dir doch nun endlich mal die Beschreibung zu diesen Befehlen an!! Markieren + F1.

cu
Marc


LorenzS - Do 20.12.07 17:27

user profile iconYogu Verfasst am: Mi 19.12.07 17:37 hat folgendes geschrieben:
Folgender Code reicht doch vollkommen aus:


Delphi-Quelltext
1:
2:
if ListBox.ItemIndex(String) >= 0 then
  ListBox.ItemIndex := ListBox.ItemIndex(String);

Alle anderen Lösungen sind eigentlich unnötig kompliziert.

Da hat er es her!

1. Exacte Suche

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button10Click(Sender: TObject);
begin
 if ListBox1.Items.IndexOf(trim(Edit1.text))>=0 then //ListBox interne Suchsunktion IndexOf
                                                     //Trim ist nicht unbedingt nötig lösche aber hinten und vorne alle Leerzeichen
  ListBox1.ItemIndex:=ListBox1.Items.IndexOf(trim(Edit1.text));
end;

2. Ungenaue Suche (im EditFeld reicht schon ein Teil um die Einträge in der ListBox zufinden)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button10Click(Sender: TObject);
 var i:integer
begin
 for i:=0 to listbox1.items.count-1 do
  if pos(edit1.Text, listbox1.items[i]) > 0 then
   listbox1.itemindex:=i; 
end;

3. Kombi aus beidem, wenn er das Exacte nicht findet, versucht er es ungenau

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button10Click(Sender: TObject);
 var i:integer
begin
 if ListBox1.Items.IndexOf(trim(Edit1.text))>=0 then //ListBox interne Suchsunktion IndexOf
                                                     //Trim ist nicht unbedingt nötig lösche aber hinten und vorne alle Leerzeichen
  ListBox1.ItemIndex:=ListBox1.Items.IndexOf(trim(Edit1.text))
 else
  for i:=0 to listbox1.items.count-1 do
   if pos(edit1.Text, listbox1.items[i]) > 0 then
    listbox1.itemindex:=i; 
end;


Yogu - Do 20.12.07 17:37

user profile iconYogu am Mi 19.12.07 17:37 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
if ListBox.ItemIndex(String) >= 0 then
  ListBox.ItemIndex := ListBox.ItemIndex(String);

Oh, großes Sorry! Da habe ich wohl etwas durch einander gebracht. :oops: So müsste es eigentlich heißen:

Delphi-Quelltext
1:
2:
if ListBox.IndexOf(String) >= 0 then
  ListBox.ItemIndex := ListBox.IndexOf(String);


:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: