![]() |
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 ![]() 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... |
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. |
Re: TListView: erweitertes suchen
vielen dank sniper_w!
ich werde gleich mal schauen ob ich es umbasteln kann... |
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 02:29 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