![]() |
Autovervollständigen in Edit-Feld
Hallo,
folgender Code liegt vor:
Delphi-Quellcode:
Wenn man die Procedure nun mit einem Edit-Feld und einer Stringliste aufruft, verhält sie sich wie man es vom IE mit dem Autovervollständigen gewohnt ist.
procedure 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; Nur irgendwie klappen die Tasten "Entf", "Backtaste" etc. nicht mehr. Weiß einer wieso? Ich rühre diese Tasten doch gar nicht an, oder habe ich einen Fehler in meinem Code, den ich nicht sehe? Beispiel für Aufruf: Edit-Feld auf Form platzieren.
Delphi-Quellcode:
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'); EditAutoComplete(Edit1, Demo); Demo.Free; end; |
Re: Autovervollständigen in Edit-Feld
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. |
Re: Autovervollständigen in Edit-Feld
Hallo,
perfekt! An diesen Umstand (mein Logikfehler) hatte ich nicht gedacht :mrgreen: Ich passe es noch dementsprechend an (mehr Tasten etc.). Was dagegen, wenn ich dann unseren Code für die Code-Library vorschlage? Edit: Danke natürlich! :-D |
Re: Autovervollständigen in Edit-Feld
Huhu,
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz