Einzelnen Beitrag anzeigen

Luzzifus

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

Re: ComboBox - Item Liste bei Tastatureingabe filtern

  Alt 7. Dez 2006, 18: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