Thema: Delphi Suche in ListBoxes

Einzelnen Beitrag anzeigen

Loni

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

Re: Suche in ListBoxes

  Alt 1. Apr 2007, 19:52
irgendwie klappt es bei mir nicht 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 Hilfethen
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 Anwendungenthen
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.
Miniaturansicht angehängter Grafiken
anhang_452.png  
  Mit Zitat antworten Zitat