AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ComboBox - Item Liste bei Tastatureingabe filtern
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox - Item Liste bei Tastatureingabe filtern

Ein Thema von Luzzifus · begonnen am 7. Dez 2006 · letzter Beitrag vom 7. Dez 2006
Antwort Antwort
Luzzifus

Registriert seit: 11. Jun 2006
14 Beiträge
 
Delphi 6 Professional
 
#1

ComboBox - Item Liste bei Tastatureingabe filtern

  Alt 7. Dez 2006, 10:56
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.
  Mit Zitat antworten Zitat
Luzzifus

Registriert seit: 11. Jun 2006
14 Beiträge
 
Delphi 6 Professional
 
#2

Re: ComboBox - Item Liste bei Tastatureingabe filtern

  Alt 7. Dez 2006, 19:32
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 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