Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Suche in ListBoxes (https://www.delphipraxis.net/89465-suche-listboxes.html)

Loni 31. Mär 2007 15:51


Suche in ListBoxes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen ich bin neu hier und auch noch nicht ganz so vertaut mit Delphi und falls das hier die falsche rubrik ist dann bitte verschieben.

Also ich möchte gerne (am besten über den Finddialog) 2 ListBoxes nach einem eingegeben Wort durchsuchen lassen und dieses dann
markieren lassen (z.B. in clred) nun habe ich schon unzählige Beiträge in diesem Forum gelesen aber noch nicht mal annähernd etwas gefunden das ich hätte verstehen können oder in mein Programm einbauen können :oops: . Ich habe gelesen das der FindDialog nur mit
RichEdits funktioniert und hoffe das dem nicht so ist.

Also ich habe eine ListBox in der mann in der mann zwischen 2 "Hilfebüchern"(auch ListBoxes aber in einer andern Form) wählen kann und in der selben Form ein FindDialog der das gerade ausgewählte "Buch" nach einem eingegebnen Wort wie "Farben" durchsuchen soll und dann halt wie erwähnt markieren soll.

Delphi-Quellcode:
procedure TForm4.BtHilfeOffnenClick(Sender: TObject);//Öffnen button um die einzelnen hifen zu öffnen
begin
if ListBox1.ItemIndex=0 then //wenn auf Allgemeine Hilfe(ItemIndex=0) gecklickt wird öffnet sich eineneu ListBox "Allgemeine Hilfe"
begin
Form6.Visible:=true;//Form auf der die beiden ListBoxes sind
Form6.Caption:='Allgemeine Hilfe';
Form6.ListBoxHilfeAllgemein.Visible:=true;
Form6.ListBoxHilfeAnwendungen.Visible:=false;
end
else
if ListBox1.ItemIndex=1 then //wenn auf MiniPaint Anwendungen(ItemIndex=1) gecklickt wird öffnet sich eineneu ListBox "Anwendungen Hilfe"
begin
Form6.Visible:=true;
Form6.Caption:='MiniPaint Anwendungen';
Form6.ListBoxHilfeAllgemein.Visible:=false;
Form6.ListBoxHilfeAnwendungen.Visible:=true;
end;
end;


procedure TForm4.BitBtnSucheClick(Sender: TObject);
begin
FindDialog1.Execute;
end;

procedure TForm4.FindDialog1Find(Sender: TObject);
begin
//Wenn "Hilfe Allgemein" angeklickt dann öffne "Form6.ListBoxHilfeAllgemein" suche das Suchwort dort und markiere es
//Wenn "Hilfe Anwendungen" angeklickt dann öffne "Form6.ListBoxHilfeAnwendungen" suche das Suchwort dort und markiere es
end.
Hoffe ihr durschaut das Chaos und könnt mir helfen und danke im vorraus(ich habe halt absolut keinen plan weil wir das noch nicht im untericht hatten und da in NRW gerade ferien sind kann ich nur euch auf die nerven gehen ^^).Ich finde das Forum hier klasse :thumb:.

[Wenn ich statt den 2 Listboxes RichEdits nehmen muss dann bitte auch erklären wie ich da das scrollen einstellen kann BIG THX]

Der_Unwissende 31. Mär 2007 16:46

Re: Suche in ListBoxes
 
Hi und erstmal Herzlich Willkommen in der DP :dp:

Zitat:

Zitat von Loni
Also ich möchte gerne (am besten über den Finddialog) 2 ListBoxes nach einem eingegeben Wort durchsuchen lassen und dieses dann
markieren lassen (z.B. in clred).

Hier wäre die erste Frage, wie weit Du soweit gekommen bist. Wie würdest Du das ganze denn ganz naiv (unabhängig von Delphi) machen. Lass einfach mal eine sehr spezielle Funktion (wie FindDialog) außen vor und schreib das auf, alles was Du dann tun musst ist schauen, wie Du das gleiche in Delphi umsetzen kannst.

Eine ListBox ist ja erstmal nicht viel mehr als eine Liste von Zeichenketten/Strings, die angezeigt werden (und natürlich kann man auch scrollen). Wenn ich Dir eine Liste von Sätzen gebe und Du einen Bestimmten finden sollst, wie machst Du das?
Ich denke mal auch Du würdest den einfach Zeile für Zeile durchgehen und nach einem String suchen.

Anhaltspunkt wäre hier also Hier im Forum suchenString suchen (ohne dass ich jetzt weiß ob Du schon das passende findest! Was noch fehlt ist, dass Du das für jede Zeile machen musst. So etwas wie "Für alle" oder "Von ... bis" spricht immer für eine Schleife. Du musst also die Schleife über alle Zeilen laufen lassen und in dieser Schleife für die jeweilige Zeile schauen ob der String vorhanden ist, ggf. diese Zeile markieren (was ich mal außen vor lasse).
Bleibt erstmal die Frage, wie Du raus bekommst, wieviele Zeilen eine Listbox gerade hat und was in welcher Zeile steht. Und der einfachste Weg so etwas raus zu bekommen ist immer der Blick in die Online Hilfe (OH). Such einfach mal in der Hilfe nach TListBox. Da findest Du dann eine Klasse. Oben stehen dann Dinge wie Ereignisse, Methoden (Prozeduren und Funktionen) sowie Eigenschaften. Diese Namen halten immer was sie versprechen, Ereignisse sind wirklich Ereignisse, die eintreten können, über die Du informiert werden kannst.
Und so etwas die Anzahl der Zeilen ist ganz klar eine Eigenschaft. Mit etwas englisch-Kenntnissen findest Du sehr schnell die richtige Eigenschaft, zudem steht in der aktuellen Hilfe (z.B. Turbo Delphi Explorer) auch immer eine kleine Erklärung zu jeder Eigenschaft. Schau einfach mal nach und sag bescheid / bzw. frag weiter nach, wenn Du etwas nicht verstehst und/oder irgendwo nicht weiter kommst.

Gruß Der Unwissende

Loni 31. Mär 2007 21:58

Re: Suche in ListBoxes
 
Delphi-Quellcode:
var
  Form4: TForm4;
  Suchwort: String;
  i: Integer;
  l: Char;

procedure TForm4.BitBtnSucheClick(Sender: TObject);
begin
Suchwort:=EdSuchen.Text;
l:='';
if LaInXSuchen.Caption='In // Allgemeine Hilfe' then
begin
for i:=1 to Form6.ListBoxHilfeAllgemein.items.count-1 do
if pos(l+Suchwort+l, Form6.ListBoxHilfeAllgemein.items[i-1]) > 0 then
Label1.caption:=Form6.ListBoxHilfeAllgemein.items[i-1];
end;
end;
EDIT:OK das war mein Fehler -->(ich habs jetzt so gemach aber der findet dann nur was wenn die eingabe im Editfeld einen Buchstaben beträgt trotz STRING )geht jezt

nun möchte ich die gefundene zeile aber nicht in ein Label übernehmen sondern die zeile direkt in der ListBox zB Rot markiert haben
villt kannst du mir ja mit nem Ansatz helfen (wenigstens nem stückchen quellcode) =) danke

bitsetter 31. Mär 2007 22:42

Re: Suche in ListBoxes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Zitat:

Zitat von Loni
nun möchte ich die gefundene zeile aber nicht in ein Label übernehmen sondern die zeile direkt in der ListBox zB Rot markiert haben

ich habe dir ein Beispiel angehängt wo du mit Hilfe von Listbox.Tag eine Zeile rot markieren kannst. Dein Code würde ich dann so abbändern:
Delphi-Quellcode:
procedure TForm4.BitBtnSucheClick(Sender: TObject);
begin
Suchwort:=EdSuchen.Text;
l:='';
if LaInXSuchen.Caption='In // Allgemeine Hilfe' then
begin
for i:=1 to Form6.ListBoxHilfeAllgemein.items.count-1 do
if pos(l+Suchwort+l, Form6.ListBoxHilfeAllgemein.items[i-1]) > 0 then
Form6.ListBoxHilfeAllgemein.Tag := Form6.ListBoxHilfeAllgemein.items[i-1];//<--
end;
end;
Oder ansonsten einfach mit
Delphi-Quellcode:
Form6.ListBoxHilfeAllgemein.ItemIndex := Form6.ListBoxHilfeAllgemein.items[i-1];
die Zeile markieren.

Loni 31. Mär 2007 23:19

Re: Suche in ListBoxes
 
Vielen Dank !!!!! endlich mal was womit ich etwas anfangen kann =) so stell ich mir das vor :zwinker:

Loni 31. Mär 2007 23:51

Re: Suche in ListBoxes
 
och neee leider zu früh gefreut denn wenn ich den quelltext gemau so einfüge steht auf der linken seite ein INTEGER und aud der rechten seite ein STRING ok ganz dumm bin ich auch nicht ich habe also einfach StrToInt (IntToStr geht nciht da sonst der linken seite nichts zugewiesen werden kann ) dann läüft da progi auch aber sobald ich auf suchen klicke steht da : "die zeile die ich markiert haben will" ist kein gültiger ineger wert also so -> : 'Option: Hier können Sie zusätzliche Einstellungen tätigen ' ist kein gültiger integer wert . Aber wenn ich nach zahlen suche klappt "nur" der zeilensprung zur markierten zeile leider

Delphi-Quellcode:
procedure TForm4.BitBtnSucheClick(Sender: TObject);
begin
Suchwort:=EdSuchen.Text;
if LaInXSuchen.Caption='In // Allgemeine Hilfe' then
begin
for i:=1 to Form6.ListBoxHilfeAllgemein.items.count-1 do
if pos(Suchwort, Form6.ListBoxHilfeAllgemein.items[i-1]) > 0 then
Form6.ListBoxHilfeAllgemein.ItemIndex := StrToInt(Form6.ListBoxHilfeAllgemein.items[i-1]);
Form6.ListBoxHilfeAllgemein.Tag := StrToInt(Form6.ListBoxHilfeAllgemein.items[i-1]);
Form6.ListBoxHilfeAllgemein.Visible:=true;
Form6.Visible:=true;
end;
end;

bitsetter 1. Apr 2007 07:38

Re: Suche in ListBoxes
 
Moin,

ja stimmt, das müsste wohl eher so gehen:
Delphi-Quellcode:
Form6.ListBoxHilfeAllgemein.Tag := i;

Blackheart 1. Apr 2007 09:51

Re: Suche in ListBoxes
 
Hallo
Hier kannst Du zusätzlich auch mit * Suchen zb. bei Hello *el
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
with (Control as TListbox) do
 begin
   if OdSelected in State then //Prüft, ob ein Item markiert ist
   Canvas.Brush.Color := clRed; //Canvas-Hintergrundfarbe auf Rot setzen
   Canvas.FillRect(Rect); // Hintergrund malen
   Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]); // Text ausgeben
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Style:= lbOwnerDrawFixed;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var SuchString : string;
    i : Integer;
begin
    SuchString := Edit1.Text;
    if Copy(SuchString,1,1) = '*' then begin         // * als Platzhalter vorn
        SuchString := Copy(SuchString, 2, Length(SuchString) - 1);
        for i := 0 To ListBox1.Items.Count - 1 do
        if Pos(SuchString, Listbox1.Items[i]) <> 0 then
        begin
           Listbox1.ItemIndex := i;        // Eintrag markieren
           Exit
        end
    end else begin                         // sonst
        for i := 0 to ListBox1.Items.Count - 1 do
        if UpperCase(SuchString) = UpperCase(Copy(Listbox1.Items[i],1, Length(SuchString))) then
        begin
          ListBox1.ItemIndex := i;         // Eintrag markieren
          Exit;
        end;
    end;
end;

Loni 1. Apr 2007 10:06

Re: Suche in ListBoxes
 
EDIT : Danke das werde ich auch mit einbauen :-D

ok jetzt alles (Farbiges unterlegen und Zeilensprung zum gesuchten Wort) aber der ist immer noch zu case sensitive weil der fast nichts findet was ich eingebe auser ich tippe es genau so ein und wenn das Wort oder der Buchstabe mehrmals auftauchen zeigt der nur den lezten Eintrag an deswegen wäre ne weiter suchfunktion auch ganz cool :-D
ich weiß ich gehe euch bestimmt schon auf die nerven aber VIELEN DANK

quellcode bis jetzt

Delphi-Quellcode:
procedure TForm6.ListBoxHilfeAllgemeinDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TListBox).Canvas do
  begin
    if not (odFocused in State) then
    begin
      if Index = Form6.ListBoxHilfeAllgemein.Tag then // markiertes Item
      begin
        Brush.Color:= clRed;//graphics.clHighlight;
        //Font.Color:= graphics.clHighlightText;
      end else
      begin
        Brush.Color := (Control as TListBox).Color;
        Font.Color:= graphics.clBlack;
      end;
      FillRect(Rect);
      TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]);
    end;
  end;
end;

procedure TForm6.ListBoxHilfeAnwendungenDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TListBox).Canvas do
  begin
    if not (odFocused in State) then
    begin
      if Index = Form6.ListBoxHilfeAllgemein.Tag then // markiertes Item
      begin
        Brush.Color:= clRed;//graphics.clHighlight;
        //Font.Color:= graphics.clHighlightText;
      end else
      begin
        Brush.Color := (Control as TListBox).Color;
        Font.Color:= graphics.clBlack;
      end;
      FillRect(Rect);
      TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]);
    end;
  end;
end;


procedure TForm6.FormCreate(Sender: TObject);
begin

  ListBoxHilfeAllgemein.Tag:= -1;
  ListBoxHilfeAllgemein.Style := lbOwnerDrawFixed;
  ListBoxHilfeAnwendungen.Tag:= -1;
  ListBoxHilfeAnwendungen.Style := lbOwnerDrawFixed;
end;
und
Delphi-Quellcode:
procedure TForm4.BitBtnSucheClick(Sender: TObject);
begin
Suchwort:=EdSuchen.Text;
if LaInXSuchen.Caption='In // Allgemeine Hilfe' then
begin
for i:=1 to Form6.ListBoxHilfeAllgemein.items.count-1 do
if pos(Suchwort, Form6.ListBoxHilfeAllgemein.items[i-1]) > 0 then
begin
Form6.ListBoxHilfeAllgemein.ItemIndex := (i-1);
Form6.ListBoxHilfeAllgemein.Tag := (i-1);
Form6.ListBoxHilfeAllgemein.Visible:=true;
Form6.ListBoxHilfeAnwendungen.Visible:=false;
Form6.Visible:=true;
end;
end
else
if LaInXSuchen.Caption='In // MiniPaint Anwendungen' then
begin
for i:=1 to Form6.ListBoxHilfeAnwendungen.items.count-1 do
if pos(Suchwort, Form6.ListBoxHilfeAnwendungen.items[i-1]) > 0 then
Form6.ListBoxHilfeAnwendungen.ItemIndex := (i-1);
Form6.ListBoxHilfeAnwendungen.Tag := (i-1);
Form6.ListBoxHilfeAnwendungen.Visible:=true;
Form6.ListBoxHilfeAllgemein.Visible:=false;
Form6.Visible:=true;
end;
end;

Blackheart 1. Apr 2007 10:11

Re: Suche in ListBoxes
 
Was Denkst Du was der Code macht, mal ausprobiert. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz