Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Autovervollständigen in Edit-Feld (https://www.delphipraxis.net/69121-autovervollstaendigen-edit-feld.html)

Catbytes 10. Mai 2006 14:22


Autovervollständigen in Edit-Feld
 
Hallo,

folgender Code liegt vor:

Delphi-Quellcode:
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;
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.

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;

s-off 10. Mai 2006 15:10

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.

Catbytes 10. Mai 2006 22:45

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

s-off 11. Mai 2006 08:13

Re: Autovervollständigen in Edit-Feld
 
Huhu,

Zitat:

[...]perfekt![...]
freut mich, wenn ich helfen konnte ;)

Zitat:

[...]Was dagegen, wenn ich dann unseren Code für die Code-Library vorschlage?[...]
Nein, nichts dagegen.


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