![]() |
Re: Suche in ListBoxes
:oops: war gerade mit so vielen dingen beschäftigt DANKE
|
Re: Suche in ListBoxes
und wie stelle ich es an das er wenn ich auf einen button weitersuchen klicke den nächsten passenden Eintrag zeigt
z.B. Suchwort: 'ist' und das gibts dann 20 mal oder so und dannn soll der bei Suchen den ersten passenden eintrag aneigen und auf weitersuchen immer wieder den darauf folgenden . oder kann das dein quellcode auch und ich habs schn wieder nicht gemerkt Blackheart ^^. wenn mir jemand dafür noch nen lösungs ansatz gibt dann wäre ich wunschlos glücklich =). |
Re: Suche in ListBoxes
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich habe dir ein Testprogramm angehängt, wo die gesuchten Worte und dazu noch die Position in der Listbox farblich hervorgehoben werden. |
Re: Suche in ListBoxes
Liste der Anhänge anzeigen (Anzahl: 1)
irgendwie klappt es bei mir nicht :gruebel: kann es daran liegen das bei mir vorher abgefragt wird welches Item in einer anderen ListBox markiert ist um dann auch im passenden Text zu suchen.
Bild mit näheren Infos habe ich drangehängt um es dir bildlicher zu machen.
Delphi-Quellcode:
Unit Unit4;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, TabNotBk, Buttons, ExtCtrls; type TSuche = record Text: AnsiString; ItemPos: integer; StrPos: integer; end; type TForm4 = class(TForm) TNInhalt: TTabbedNotebook; LaHilfeSatz1: TLabel; LaHilfeSatz2: TLabel; ListBox1: TListBox; BtHilfeOffnen: TButton; BtHilfeAbbrechen: TButton; PaLoni: TPanel; ImLoni: TImage; PaSuche: TPanel; LaInXSuchen: TLabel; EdSuchen: TEdit; BitBtnSuche: TBitBtn; LaCopyright: TLabel; MeInformationen: TMemo; ImAnimation: TImage; procedure BtHilfeAbbrechenClick(Sender: TObject); procedure BtHilfeOffnenClick(Sender: TObject); procedure BitBtnSucheClick(Sender: TObject); procedure ListBox1Click(Sender: TObject); private Suche: TSuche; public { Public-Deklarationen } end; var Form4: TForm4; implementation uses Unit5, Unit6, Math; {$R *.dfm} procedure TForm4.BtHilfeAbbrechenClick(Sender: TObject); begin Form4.Visible :=false; end; procedure TForm4.BtHilfeOffnenClick(Sender: TObject); begin if ListBox1.ItemIndex=0 then begin Form6.Visible:=true; Form6.Caption:='Allgemeine Hilfe'; Form6.ListBoxHilfeAllgemein.Visible:=true; Form6.ListBoxHilfeAnwendungen.Visible:=false; end else if ListBox1.ItemIndex=1 then begin Form6.Visible:=true; Form6.Caption:='MiniPaint Anwendungen'; Form6.ListBoxHilfeAllgemein.Visible:=false; Form6.ListBoxHilfeAnwendungen.Visible:=true; end; end; procedure TForm4.BitBtnSucheClick(Sender: TObject); var i, NextPos: integer; ItemText: AnsiString; begin if LaInXSuchen.Caption='In // Allgemeine Hilfe' then begin if Suche.ItemPos= -1 then Suche.ItemPos:= 0; Suche.Text:= UpperCase(EdSuchen.Text); for i := Suche.ItemPos to Pred(Form6.ListBoxHilfeAllgemein.Count) do begin ItemText:= UpperCase(Form6.ListBoxHilfeAllgemein.Items.Strings[i]); if Suche.StrPos> 0 then begin NextPos:= pos(Suche.Text, Copy(ItemText, Suche.StrPos+ length(Suche.Text), length(ItemText)- Suche.StrPos)); if NextPos> 0 then Suche.StrPos:= Suche.StrPos+ length(Suche.Text)+ NextPos- 1 else Suche.StrPos:= 0; end else Suche.StrPos:= pos(Suche.Text, ItemText); if Suche.StrPos> 0 then begin Suche.ItemPos:= i; break; end; end; if (Suche.StrPos= 0) and (i= Form6.ListBoxHilfeAllgemein.Count) then Suche.ItemPos:= -1; if Suche.ItemPos = -1 then BitBtnSuche.Caption:= 'Suchen' else BitBtnSuche.Caption:= 'WeiterSuche>>'; Form6.ListBoxHilfeAllgemein.Repaint; end else if LaInXSuchen.Caption='In // MiniPaint Anwendungen' then begin if Suche.ItemPos= -1 then Suche.ItemPos:= 0; Suche.Text:= UpperCase(EdSuchen.Text); for i := Suche.ItemPos to Pred(Form6.ListBoxHilfeAnwendungen.Count) do begin ItemText:= UpperCase(Form6.ListBoxHilfeAnwendungen.Items.Strings[i]); if Suche.StrPos> 0 then begin NextPos:= pos(Suche.Text, Copy(ItemText, Suche.StrPos+ length(Suche.Text), length(ItemText)- Suche.StrPos)); if NextPos> 0 then Suche.StrPos:= Suche.StrPos+ length(Suche.Text)+ NextPos- 1 else Suche.StrPos:= 0; end else Suche.StrPos:= pos(Suche.Text, ItemText); if Suche.StrPos> 0 then begin Suche.ItemPos:= i; break; end; end; if (Suche.StrPos= 0) and (i= Form6.ListBoxHilfeAnwendungen.Count) then Suche.ItemPos:= -1; if Suche.ItemPos = -1 then BitBtnSuche.Caption:= 'Suchen' else BitBtnSuche.Caption:= 'WeiterSuche>>'; Form6.ListBoxHilfeAnwendungen.Repaint; end; end; procedure TForm4.ListBox1Click(Sender: TObject); begin if ListBox1.ItemIndex=0 then begin LaInXSuchen.Caption:='In // Allgemeine Hilfe'; end else if ListBox1.ItemIndex=1 then begin LaInXSuchen.Caption:='In // MiniPaint Anwendungen'; end; end; end.
Delphi-Quellcode:
unit Unit6;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TSuche = record Text: AnsiString; ItemPos: integer; StrPos: integer; end; type TForm6 = class(TForm) ListBoxHilfeAllgemein: TListBox; LaHilfeInformantionen: TLabel; ListBoxHilfeAnwendungen: TListBox; procedure ListBoxHilfeAllgemeinDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ListBoxHilfeAnwendungenDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure FormCreate(Sender: TObject); private Suche: TSuche; public { Public-Deklarationen } end; var Form6: TForm6; implementation {$R *.dfm} procedure TForm6.ListBoxHilfeAllgemeinDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var ListText, SelText: AnsiString; begin with (Control as TListBox).Canvas do begin if not (odFocused in State) then begin if Index = Suche.ItemPos then // markiertes Item begin Brush.Color:= graphics.clYellow;//clRed;//graphics.clHighlight; FillRect(Rect); Font.Color:= graphics.clBlack; ListText:= (Control as TListBox).Items[Index]; TextOut(Rect.Left + 2, Rect.Top, ListText); Font.Color:= graphics.clRed; SelText:= Copy(ListText, Suche.StrPos, length(Suche.Text)); TextOut(Rect.Left + 2+ TextWidth(Copy(ListText, 1, Suche.StrPos- 1)), Rect.Top, SelText); end else begin Brush.Color := (Control as TListBox).Color; Font.Color:= graphics.clBlack; FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]); end; end; end; end; procedure TForm6.ListBoxHilfeAnwendungenDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var ListText, SelText: AnsiString; begin with (Control as TListBox).Canvas do begin if not (odFocused in State) then begin if Index = Suche.ItemPos then // markiertes Item begin Brush.Color:= graphics.clYellow;//clRed;//graphics.clHighlight; FillRect(Rect); Font.Color:= graphics.clBlack; ListText:= (Control as TListBox).Items[Index]; TextOut(Rect.Left + 2, Rect.Top, ListText); Font.Color:= graphics.clRed; SelText:= Copy(ListText, Suche.StrPos, length(Suche.Text)); TextOut(Rect.Left + 2+ TextWidth(Copy(ListText, 1, Suche.StrPos- 1)), Rect.Top, SelText); end else begin Brush.Color := (Control as TListBox).Color; Font.Color:= graphics.clBlack; FillRect(Rect); TextOut(Rect.Left + 2, Rect.Top, (Control as TListBox).Items[Index]); end; end; end; end; procedure TForm6.FormCreate(Sender: TObject); begin begin ZeroMemory(@Suche, SizeOf(TSuche)); Suche.ItemPos:= -1; Form6.ListBoxHilfeAllgemein.Style := lbOwnerDrawFixed; Form6.ListBoxHilfeAnwendungen.Style := lbOwnerDrawFixed; end; end; end. |
Re: Suche in ListBoxes
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
auf jeden Fall liegt es daran, dass du die Variable Suche 2X, in jeder Form hast, dann kann es nicht funktionieren. Ich schreib nachher noch ein kleines Beispiel mit 2 Formularen. Die Variable Suche könnte man als public deklarieren, oder man lagert die Procdedur BitBtnSucheClick(), auf das andere Formular aus. EDIT: ich musste außerdem für jede Listbox eine Variable Suche erstellen siehe Anhang: |
Re: Suche in ListBoxes
ohne scheiß das doch ma Hilfe wie sie im Lehrbuch steht VIELEN VIELEN DANK bitsetter
ich probiers gleich ma aus EDIT::: KLAPT GENAU SO WIE ICH ES DIE GANZE ZEIT WILL DANKE NOCHMALS!!!!!! :cheers::dancer: :bounce2: :hello: :corky: |
Re: Suche in ListBoxes
Sorry das ich diesen Thread wieder ausgrabe, aber ich dachte mir das ist besser als einen neuen zu erstellen, wo erstmal keiner weiß wodrum es geht.
Also ich habe nur eine Listbox und das mit dem Suchen und markieren funktioniert auch schon super. Nur mein Problem ist jetzt, dass diese Listbox sehr viele Einträge hat und nicht automatisch dahin scrollt ww das markierte ist. Das heißt man muss immer erst von oben bis nach unten scrollen bis man die Markierung sieht. Ich hab schon ein paar bescheidene Versuche gemacht, das er automatisch zur Markierung springt, aber funktioniert hat bisher noch nichts. Ich wäre für eure Hilfe wirklich dankbar. |
Re: Suche in ListBoxes
|
Re: Suche in ListBoxes
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
mit ItemIndex wäre es wohl auch gegangen, aber TopIndex ist in diesem Fall wohl noch besser. |
Re: Suche in ListBoxes
Danke, funtkioniert super. Ich habe erst mit ItemIndex gearbeitet, nur ich hatte nicht Suche.ItemPos benutzt. Obwohl man das eigentlich hätte sehen können :wall:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr. |
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