![]() |
ComboBox - Item Liste bei Tastatureingabe filtern
Hallo,
eine ComboBox bietet ja die Funktionalität des Auto-Vervollständigens. Ich hätte das aber gerne so erweitert, dass es so ähnlich funktioniert wie die Auto-Code-Completion in Delphi. Sprich, ich beginne zu tippen, die ComboBox klappt automatisch auf und zeigt mir nur die Items an, die auf der Grundlage des schon getippten noch möglich sind. Das automatische Aufklappen ist nicht das Problem, ich grübele aber zur Zeit noch beim Filtern der DropDown-Liste herum. Ich würde da spontan so herangehen, dass ich die Liste auslagere, bei jedem Tastendruck den getippten String mit der Liste abgleiche und die passenden Einträge wieder neu in die Item-Liste der ComboBox schreibe. Das würde aber glaube ich recht langsam sein, es geht um eine Liste mit 300-1000+ Einträgen. Gibt es da eine einfachere Möglichkeit, das zu erreichen? Vielen Dank im Voraus, Luzzifus. |
Re: ComboBox - Item Liste bei Tastatureingabe filtern
Da niemand eine bessere Idee zu haben scheint, hab ich's nun auf folgende Art gelöst.
Anmerkungen zum Code:
Delphi-Quellcode:
so long,
procedure TForm4.ComboBox2KeyPress(Sender: TObject; var Key: Char);
var first,last, i,max : Integer; tS : String; begin // Steuerzeichen außer Backspace und Enter werden nicht bearbeitet: if (ORD(Key) <= 32) and not (ORD(Key) in [8,13]) then exit; ComboBox2.DroppedDown := true; max := High(ESDB); first := -1; last := max; // Markierten Text löschen (außer wenn Key = Enter), das passiert // nicht von allein wenn dieser Eventhandler durchlaufen wird: if ORD(Key) <> 13 then Combobox2.DeleteSelected; // Suchstring vorbereiten: // (im Normalfall Key dazu, bei Backspace String verkürzen) tS := ComboBox2.Text; if ORD(Key) <> 8 then tS := tS + Key else tS := LeftStr(tS, Length(tS)-1); tS := LowerCase(tS); // Wenn Key = Enter, soll wieder die ganze Liste drin stehen: if ORD(Key) <> 13 then begin // erstes und letztes Auftreten des bisher eingegebenen Strings // in den Namen der ESDB finden: for i := 0 to max do if AnsiPos(tS, LowerCase(ESDB[i].N)) = 1 then begin first := i; break; end; if first >= 0 then for i := first+1 to max do if (AnsiPos(tS, LowerCase(ESDB[i].N)) <> 1) then begin last := i-1; break; end; end else first := 0; // Wenn nix drin steht, soll auch wieder alles angezeigt werden: if Length(Trim(tS)) = 0 then first := 0; // Items in die Itemliste der ComboBox eintragen: with ComboBox2.Items do begin BeginUpdate; Clear; if first >= 0 then for i := first to last do Add(ESDB[i].N); EndUpdate; end; // Cursor an's Ende vom Text setzen: ComboBox2.SelStart := Length(ComboBox2.Text); end; luzzi. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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 by Thomas Breitkreuz