Hi,
in Deinem Code befindet sich kein Fehler, aber in der Logik
Das Problem ist, dass der beim Druck der [BACKSPACE]-Taste auch das OnChange-Ereignis des Edits ausgelöst wird.
Tippe ich nun also 'ku', so wird automatisch 'kuchen' gesetzt, wobei das 'chen' selected ist.
Drücke ich nun [BACKSPACE], so wird das 'chen' gelöscht, anschliessend wird das OnChange-Ereignis registriert und der noch vorhandene Teil 'ku' wieder mittels der AutoComplete-Routine zu 'kuchen' vervollständigt.
Es passiert also was, Du siehst es nur nicht ;o)
Edit: sollte vielleicht auch eine Lösung anbieten *g*
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure EditAutoComplete(Edit: TEdit; Items: TStringList);
procedure Edit1Change(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private-Deklarationen }
bAutoComplete: Boolean; //auto-vervollständigen oder nicht?
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
const
NAC : Set of Char = [#008]; //bei diesen Tasten nicht auto-vervollständigen
implementation
{$R *.dfm}
procedure TForm1.EditAutoComplete(Edit: TEdit; Items: TStringList);
var
I, StartPos: Integer;
begin
for I := 0 to Items.Count - 1 do
begin
with Edit do
begin
if (Text = '') or (LowerCase(Items[I]) = LowerCase(Text)) then
Exit;
if StrLComp(PChar(LowerCase(Items[I])), PChar(LowerCase(Text)),
Length(Text)) = 0 then
begin
StartPos := Length(Text);
Text := Text + Copy(Items[I], StartPos + 1, Length(Items[I]));
SelStart := StartPos;
SelLength := Length(Text) - StartPos;
Exit;
end;
end;
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
Demo: TStringList;
begin
Demo := TStringList.Create;
Demo.Add('brot');
Demo.Add('brötchen');
Demo.Add('kuchen');
Demo.Add('kaffee');
if bAutoComplete then begin //soll ich?
EditAutoComplete(Edit1, Demo);
end;
Demo.Free;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in NAC then bAutoComplete := False
else bAutoComplete := True;
end;
end.