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 ComboBox - Item Liste bei Tastatureingabe filtern (https://www.delphipraxis.net/82044-combobox-item-liste-bei-tastatureingabe-filtern.html)

Luzzifus 7. Dez 2006 09:56


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.

Luzzifus 7. Dez 2006 18:32

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:
  • In der Datenstruktur ESDB steht die eigentliche Liste aller möglichen Einträge, diese Liste muss vorsortiert sein.
  • Damit das Ganze funktioniert, müssen "AutoComplete" und "AutoDropDown" der ComboBox auf "false" gesetzt werden.
Wenn es Verbesserungsvorschläge gibt oder vielleicht doch noch eine Idee kommt, wie es einfacher geht -> sagt's mir bitte. ^^
Delphi-Quellcode:
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;
so long,
luzzi.


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