Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListView: erweitertes suchen (https://www.delphipraxis.net/42852-tlistview-erweitertes-suchen.html)

100nF 24. Mär 2005 17:29


TListView: erweitertes suchen
 
Guten Tag zusammen,

ich habe ein problem...
...und zwar möchte ich bei einer sortierten listview, dass wenn ich einen buchstabe (oder mehrere hintereinander) eingebe, dass das erste item markiert wird, das mit diesem/diesen buchstaben beginnt.
ich habe 4 sichtbare spalten. ich kann jede einzeln auf oder ablaufend sortieren lassen (mit diesem code)
vieleicht habt ihr ja winamp oder musicmatch installiert, da funktioniert es genau so wie ich meine. man sortiert, gibt einen/mehrere buchstaben ein, und die erste zeile die mit den eingegebenen buchstaben beginnt, wird markiert.

nun aber noch was. die listview hat sowas schon eingebaut. wenn man einen buchstaben eingibt, wird aber immer nur in der ersten spalte gesucht, egal ob sortiert oder nicht. kann man das auch irgendwie abschalten, denn das könnte noch störend wirken...?

ich hoffe, ich habe mich klar genug ausgedrückt...

sniper_w 24. Mär 2005 20:53

Re: TListView: erweitertes suchen
 
Das habe ich mit einer ListBox gemacht, aber sonst sollte es nicht so schwer sein mit einer Listview zu implementieren.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Edit1: TEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
    function BinarySearch(_low_, _high_ :integer):boolean;
  end;

var
  Form1: TForm1;
  size : integer = 0;
  Index : integer = -1;
  ToFind : string;
  SearchedTimes : integer=0;

implementation

{$R *.dfm}

function FillRandomStr(const n:integer):string;
 var i:integer;
begin
 SetLength(Result,n);
 for i:=1 to n do Result[i] := Chr(97 + Random(122-97));
end;

procedure TForm1.FormCreate(Sender: TObject);
 var i:integer;
begin
 Randomize();
 Edit1.Text := '';
 Label1.Caption := '';
 ListBox1.Sorted := True;
 ListBox1.Align := alBottom;
 for i:=0 to 5000 do ListBox1.Items.Add(FillRandomStr(4+Random(15)));
end;

function TForm1.BinarySearch(_low_, _high_ :integer):boolean;
 var half : integer;
begin
 if _high_-_low_ <= 1 then Result := False
 else
 begin
  Inc(SearchedTimes);
  Half := (_low_ + _high_) div 2;

  ToFind := Copy(ListBox1.Items[half],1,Size);

  if ToFind = Edit1.Text then
  begin
   Index := half;
   Result := True;
  end
         else
  if ToFind > Edit1.Text then
     Result := BinarySearch(_low_,half)
         else
     Result := BinarySearch(Half,_high_);
 end;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 size := length(Edit1.Text);
 Index := -1;
 if size > 0 then
 begin
  SearchedTimes := 0;
  BinarySearch(0,ListBox1.Count-1);
  ListBox1.ItemIndex := Index;
  if Index <>-1 then
  begin
   ListBox1.TopIndex := Index;
   Label1.Caption :='Found ' + ListBox1.Items[index] + ' at '+inttostr(index)+' position. - '+inttostr(SearchedTimes)+'-queries.';
  end
   else   Label1.Caption :='Nothing found.';
 end;
end;

end.

100nF 25. Mär 2005 08:03

Re: TListView: erweitertes suchen
 
vielen dank sniper_w!
ich werde gleich mal schauen ob ich es umbasteln kann...

100nF 25. Mär 2005 08:28

Re: TListView: erweitertes suchen
 
habs leider nicht so hingekriegt wie es sein soll. es wird nicht die erste spalte markiert, die mit (edit1.text) beginnt, sondern irgend ein anderer...

naja, werde mal ein bisschen weiterbasteln...

ach ja, kann man das automatische suchen in der listview auch ausschalten? das macht nämlich, dass ich in den anderen spalten nicht suchen kann mit der procedure

procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);

, es geht nur wenn man den suchtext in einem edit eingibt, was ich aber nicht will, weil wenn gesucht wird, hat die listview den focus, und ich muss erst wieder ins edit klicken um weiter zu schreiben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 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