Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Eingabefeld mit automatik gesucht (https://www.delphipraxis.net/171446-eingabefeld-mit-automatik-gesucht.html)

Marco Steinebach 7. Nov 2012 06:04

Eingabefeld mit automatik gesucht
 
Hallo Zusammen,
es gibt doch in manchen Programmen solche Eingabefelder, die sich anfangen selbst auszufüllen, wen man Text eingibt - ich hoffe, daß war jetzt nicht zu blöd erklärt.
Gibt's sowas als Komponente, oder wie heißen die überhaupt, damit ich mal was vernünftiges finde? ;-)
Vielleicht versuch ich's nochmal mit der Erklärung was ich suche. Wenn ich in ein Feld bereits
Bern
Berlin
Besum
eingegeben habe, möchte ich, daß bei eingabe von "Be" zunächst der Rest des Feldes mit, sagen wir, "Bern" ausgefüllt wird, und wenn ich dann bis zum "Berl" weiterschreibe, wird "Berlin" drauß.
Wo ich die Werte hernehme, ist nicht mein Problem, aber ich scheitere daran, den, vorgeschlagenen, Rest zu markieren, und zwar so, daß trotzdem noch alle anderen Tasten wie "Backspace" und co. korrekt funktionieren.

Für 'nen Tipp wäre ich sehr dankbar.

Freundliche Grüße
Marco

Morphie 7. Nov 2012 06:14

AW: Eingabefeld mit automatik gesucht
 
"MRU Edit" bzw. "MRU Combobox" nennt sich sowas...

DeddyH 7. Nov 2012 06:59

AW: Eingabefeld mit automatik gesucht
 
Etwas zum Fertigbasteln: http://forum.delphi-treff.de/showthr...l=1#post231958

himitsu 7. Nov 2012 09:09

AW: Eingabefeld mit automatik gesucht
 
Zitat:

Zitat von DeddyH (Beitrag 1190088)
Etwas zum Fertigbasteln:

Wobei wird dafür uch selber was in der DP rumschwirren haben. (wüßte jetzt nur mal jemand suchen)

Marco Steinebach 7. Nov 2012 09:31

AW: Eingabefeld mit automatik gesucht
 
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.

Popov 7. Nov 2012 09:46

AW: Eingabefeld mit automatik gesucht
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1190084)
Wenn ich in ein Feld bereits
Bern
Berlin
Besum
eingegeben habe, möchte ich, daß bei eingabe von "Be" zunächst der Rest des Feldes mit, sagen wir, "Bern" ausgefüllt wird

Gibt es, nennt sich TComboBox.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.AutoComplete := True; //ist ja sowieso default
  ComboBox1.Items.Add('Bern');
  ComboBox1.Items.Add('Berlin');
  ComboBox1.Items.Add('Besum');
end;
Jetzt starten und in die Combobox ein B eingeben.

Oder brauchst du es für TEdit?

Darlo 7. Nov 2012 10:02

AW: Eingabefeld mit automatik gesucht
 
Ich packe alle möglichen Ergebnisse in eine StringList. Beim Edit onKeyUp

Delphi-Quellcode:
  {$IFDEF MsWindows}
  TEdit(sender).Text := UpperCase(Copy(TEdit(sender).Text,1,1))+LowerCase(Copy(TEdit(sender).Text,2,Length(TEdit(sender).Text)));
  if bAutoComplete then
   for I := 0 to slNationalitaet.Count - 1 do
   begin
    with TEdit(sender) do
    begin
      if (Text = '') or (LowerCase(slNationalitaet[I]) = LowerCase(Text)) then
        Exit;
      if StrLComp(PChar(LowerCase(slNationalitaet[I])), PChar(LowerCase(Text)),
        Length(Text)) = 0 then
      begin
        StartPos := Length(Text);
        Text := Text + Copy(slNationalitaet[I], StartPos + 1, Length(slNationalitaet[I]));
        SelStart := StartPos;
        SelLength := Length(Text) - StartPos;
        Exit;
      end;
    end;
   end;
   {$ENDIF}
Und im onKeyDown

Delphi-Quellcode:

  {$IFDEF MsWindows}
  if Key = vk_Back then bAutoComplete := false else bAutoComplete := true;
  {$ENDIF}


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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