AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suche in ListBoxes

Ein Thema von Loni · begonnen am 31. Mär 2007 · letzter Beitrag vom 15. Sep 2007
Antwort Antwort
Seite 1 von 3  1 23      
Loni

Registriert seit: 31. Mär 2007
77 Beiträge
 
#1

Suche in ListBoxes

  Alt 31. Mär 2007, 16:51
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 . 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 .

[Wenn ich statt den 2 Listboxes RichEdits nehmen muss dann bitte auch erklären wie ich da das scrollen einstellen kann BIG THX]
Miniaturansicht angehängter Grafiken
paintu_128.png  
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Suche in ListBoxes

  Alt 31. Mär 2007, 17:46
Hi und erstmal Herzlich Willkommen in der DP

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
  Mit Zitat antworten Zitat
Loni

Registriert seit: 31. Mär 2007
77 Beiträge
 
#3

Re: Suche in ListBoxes

  Alt 31. Mär 2007, 22:58
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 Hilfethen
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
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Suche in ListBoxes

  Alt 31. Mär 2007, 23:42
Hi,

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 Hilfethen
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 Form6.ListBoxHilfeAllgemein.ItemIndex := Form6.ListBoxHilfeAllgemein.items[i-1]; die Zeile markieren.
Angehängte Dateien
Dateityp: zip listboxrot_178.zip (7,0 KB, 16x aufgerufen)
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Loni

Registriert seit: 31. Mär 2007
77 Beiträge
 
#5

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 00:19
Vielen Dank !!!!! endlich mal was womit ich etwas anfangen kann =) so stell ich mir das vor
  Mit Zitat antworten Zitat
Loni

Registriert seit: 31. Mär 2007
77 Beiträge
 
#6

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 00:51
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 Hilfethen
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;
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 08:38
Moin,

ja stimmt, das müsste wohl eher so gehen:
Form6.ListBoxHilfeAllgemein.Tag := i;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 10:51
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;
Blackheart
  Mit Zitat antworten Zitat
Loni

Registriert seit: 31. Mär 2007
77 Beiträge
 
#9

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 11:06
EDIT : Danke das werde ich auch mit einbauen

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
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 Hilfethen
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 Anwendungenthen
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;
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 11:11
Was Denkst Du was der Code macht, mal ausprobiert.
Blackheart
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz