Delphi-PRAXiS
Seite 2 von 3     12 3      

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 1. Apr 2007 10:20

Re: Suche in ListBoxes
 
:oops: war gerade mit so vielen dingen beschäftigt DANKE

Loni 1. Apr 2007 11:01

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 =).

bitsetter 1. Apr 2007 12:58

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.

Loni 1. Apr 2007 18:52

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.

bitsetter 1. Apr 2007 19:48

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:

Loni 1. Apr 2007 21:13

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:

Hagbart 22. Apr 2007 21:18

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.

Hawkeye219 22. Apr 2007 21:53

Re: Suche in ListBoxes
 
Hallo Hagbart,

hast du die Eigenschaft Delphi-Referenz durchsuchenTListBox.TopIndex noch nicht entdeckt?

Gruß Hawkeye

bitsetter 22. Apr 2007 22:22

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.

Hagbart 23. Apr 2007 15:14

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.
Seite 2 von 3     12 3      

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