Einzelnen Beitrag anzeigen

Marco Steinebach

Registriert seit: 4. Aug 2006
494 Beiträge
 
Delphi 5 Enterprise
 
#5

AW: Eingabefeld mit automatik gesucht

  Alt 7. Nov 2012, 09:31
Hallo zusammen,
Erstmal herzlichen Dank. Meine Güte, heute morgen galt für mich: warum einfach, wenn's auch umständlich geht. Es ist erstaunlich, auf welche Sachen man manchmal nicht kommt - na ja, dafür hab ich ja euch!
Die Lösung häng ich unten an, sie tut für mich genau, was sie soll.

Viele Grüße
Marco

Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
    eingabe: string; // was bisher wirklich eingegeben wurde...
    vorschlaege: TStringList;
    // ist natürlich nur für's Demo. Die Liste enthält die Vorschläge, die eingefügt werden können.
    function wortvorschlag (s: string): string;
    // sucht aus der Vorschlagsliste den wortvorschlag raus.
    procedure ErstelleVorschlag (var key: char; e: TEdit);
    // die Keypress-funktionalität ausgelagert, damit's für mehrere Felder verwendet werden kann.
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.wortvorschlag (s: string): string;
var
  i: integer;
begin
  result := ''; // initial
  s := UpperCase (s); // auf Groß-/Kleinschreibung wird nicht geprüft
  i := 0;
  while (i < vorschlaege.count) and
        (pos (s, UpperCase (vorschlaege[i])) <> 1) do
    i := i + 1;
  if i < vorschlaege.count then // Übereinstimmung gefunden
    result := vorschlaege [i];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  eingabe := '';
  vorschlaege := TStringList.Create;
  with vorschlaege do
  begin
    Add ('Besum');
    Add ('Bern');
    Add ('Berlin');
  end;
end;

procedure TForm1.ErstelleVorschlag (var key: char; e: TEdit);
var
  v: string;
begin
  case key of
    #8: // Backspace
    begin
      if length (eingabe) > 0 then
        eingabe := copy (eingabe, 1, length(eingabe)-1); // letztes Zeichen weg!
      edit1.Text := eingabe;
      edit1.selStart := length (edit1.text); // Cursor ans Ende
      edit1.selLength := 0;
    end
    else // alle anderen Zeichen
    begin
      eingabe := eingabe + key;
      v := wortvorschlag (eingabe);
      if v <> 'then // Wortvorschlag gefunden, bei dem der Anfang von Eingabe und Vorschlag übereinstimmen
      begin
        edit1.text := v;
        edit1.SelStart := length (eingabe); // Markierung beginnt hinter der eigentlichen Eingabe
        edit1.selLength := length (edit1.text) - length (eingabe); // der vorgeschlagene Rest wird markiert
      end
      else
      begin
        edit1.text := eingabe;
        edit1.selStart := length (edit1.text);
        edit1.selLength := 0;
      end;
    end;
  end;
  key := #0; // die Taste soll ja nicht doppelt genommen werden
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ErstelleVorschlag (key, (sender as TEdit));
end;

end.
Marco Steinebach
  Mit Zitat antworten Zitat