Home » Tipps & Tricks » Komponenten » TRichEdit/TMemo/TEdit » Nur Zahleneingaben zulassen

Nur Zahleneingaben zulassen

In bestimmten Fällen kann es sinnvoll sein, in einem Edit-Feld nur numerische Angaben zu erlauben. Es gibt unterschiedliche Ansatzpunkte.Häufig sieht man folgende Lösung, die in OnKeyPress-Ereignis des TEdits geschrieben wird und nur Zahlen zwischen 0 und 9 inkl. der Backspace-Taste zulässt:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', Char(VK_BACK)]) then
    Key := #0;
end;

Es ist allerdings immer noch möglich über die Zwischenablage (Kontextmenü) nicht-numerische Zeichen einzugeben.Je nach Bedarf können der Menge auch noch andere Zeichen hinzugefügt werden, wie z.B. ein Tausendertrennzeichen oder einem Dezimaltrenner (Zeichen zwischen dem ganzzahligen und fraktionalen Teil einer Zahl):

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', DecimalSeparator, ThousandSeparator, Char(VK_BACK)]) then
    Key := #0;
end;

Dabei ist auch nicht garantiert, ob der Anwender das Dezimaltrennzeichen mehrmals oder an falscher Stelle einsetzt.Alternativ können Sie den Windows-Style des Edit-Feldes neu setzen, so dass es nur noch Zahlen zulässt. Die o.g. Probleme sind allerdings ähnlich:

procedure TForm1.Button1Click(Sender: TObject);
var
  Style: DWord;
begin
  Style := GetWindowLong(Edit1.Handle, GWL_STYLE);
  SetWindowLong(Edit1.Handle, GWL_STYLE, Style or ES_NUMBER);
end;

Bei heutiger Rechnerleistung stellt es auch kein Problem mehr dar, bei jeder Eingabe den kompletten Inhalt des Feldes zu prüfen und dem Anwender beispielsweise durch Signalfarben deutlich zu machen, dass er noch keinen eindeutigen Wert angegeben hat. Hier ist das OnChange-Ereignis der richtige Ansatzpunkt:

procedure TForm1.Edit1Change(Sender: TObject);
var
  Error: Integer;
  Dummy: Integer;
begin
  val(Trim(Edit1.Text), Dummy, Error);
  if Error <> 0 then
    Edit1.Color:=clRed
  else
    Edit1.Color:=clWindow;
end;

Letztendlich sollte der Wert, bevor mit ihm weitergearbeitet wird, nochmals vom Programmierer verifiziert werden, um sicherzustellen, dass ein richtiger Wert eingegeben wurde.

2 Gedanken zu „Nur Zahleneingaben zulassen“

  1.  
    if Error0 then
    Edit1.Color:=clRed
    else
    Edit1.Color:=clWindow;
    

    Es müsste Error=0 sein und If-Block müsste mit dem Else-Block getauscht werden, wenn das Edit bei allem anderen als Zahlen rot sein soll, so wie ich das sehe.

    1. Vielen Dank für den Hinweis.
      Vor einiger Zeit sind bei einer Konvertierung ‚>‘ und ‚<' teilweise verschwunden. Hier fehlte also eine Überprüfung auf ungleich. Ich habe es korrigiert.

Kommentare sind geschlossen.