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.