Einzelnen Beitrag anzeigen

s-off
(Gast)

n/a Beiträge
 

Re: Autovervollständigen in Edit-Feld

  Alt 10. Mai 2006, 15:10
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.
  Mit Zitat antworten Zitat