88 Stimmen

Delphi/Lazarus: Nur Zahlen im Edit-Feld erlauben

Tipp von Stefan Trost | Letztes Update am 27.10.2022 | Erstellt am 07.10.2016

Manchmal kann es erforderlich sein, dass man in einem TEdit ausschließlich numerische Zahleneingaben zulassen möchte. Der Nutzer darf zwar die Ziffern 0 bis 9 eingeben, Buchstaben oder andere Zeichen sollen hingegen abgewiesen werden. In diesem Tutorial möchte ich euch zeigen, wie ihr das in Delphi oder Lazarus realisieren könnt.

Die einfachste Lösung nutzt das OnKeyPress-Event des Edit-Feldes und sieht folgendermaßen aus.

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

Dieses Event wird bei jedem Tastendruck im Edit ausgelöst und übergibt in der Variable Key die gedrückte Taste als Char noch bevor der Tastendruck das Edit erreicht. So haben wir innerhalb dieses Events die Möglichkeit, noch Einfluss darauf zu nehmen.

Das machen wir auch und prüfen, ob Key eine Ziffer von 0 bis 9 ist oder nicht. Falls nicht, setzen wir Key auf #0, womit die Eingabe gelöscht wird und nicht mehr stattfindet. Zusätzlich erlauben wir auch noch VK_BACK (die Lösch-Taste) und VK_DELETE (die ENTF-Taste), so dass der Nutzer auch die Gelegenheit bekommt, seine Eingaben zu korrigieren.

Zahlen aus der Zwischenablage

Ein Problem dieser Lösung besteht darin, dass Zahlen oder Nummern auch aus der Zwischenablage eingefügt werden können. Sind Tastenkombinationen wie STRG + V nicht erlaubt, schlägt das Kopieren komplett fehl. Sind sie dagegen erlaubt, kann jeder Nutzer auch beliebigen anderen Text in das Feld hinein kopieren, ohne dass unser OnKeyPress-Ereignis das verhindern könnte.

Eine Lösung, die dies etwas besser macht nutzt das OnChange-Ereignis, das bei jeder Änderung des Edit-Wertes ausgeführt wird.

procedure TForm1.Edit1Change(Sender: TObject);
var
  v: integer;
begin
  if not TryStrToInt(Edit1.Text, v) then begin
     Edit1.Text  := '0';     // Default-Wert
     Edit1.Color := clRed;   // oder Änderung der Farbe
  end else begin
     Edit1.Color := clWindow;
  end;
end;

Ein mögliches Beispiel liefert dieser Code. TryStrToInt gibt TRUE zurück, falls der übergebene String eine Integer-Zahl ist, ansonsten FALSE. In der Variable v steht anschließend der Integer-Wert, falls wir diesen weiterverwenden möchten. So sparen wir uns den Aufruf von StrToInt.

Falls die Eingabe kein Integer ist, wird hier die Textfarbe des Feldes auf Rot gesetzt und der Wert auf 0. Natürlich kann man die Farbgestaltung oder die Änderung des Wertes auch weglassen, je nach dem wie man auf eine falsche Eingabe reagieren möchte.

In jedem Fall sollte man aber zusätzlich trotzdem noch vor der Verarbeitung im Programm per Code überprüfen, ob tatsächlich ein Integer-Wert vorliegt.

Kommazahlen im Edit zulassen

Bis jetzt haben wir uns um ganzzahlige Integer-Zahlen ohne Komma gekümmert. Kommazahlen würden von beiden Beispiel-Codes abgewiesen werden. Im ersten Beispiel müssten wir noch zusätzlich den DecimalSeparator erlauben, damit man Zahlen mit Komma eintragen kann. Der DecimalSeparator ist je nach System und Einstellungen das Zeichen, das für ein Komma verwendet wird (zum Beispiel , im Deutschen oder . im Englischen).

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

Im zweiten Beispiel könnten wir statt TryStrToInt die Funktion TryStrToFloat verwenden und die Variable v auch als extended deklarieren. Dann würde auch dieser Code mit Kommazahlen funktionieren:

procedure TForm1.Edit1Change(Sender: TObject);
var
  v: extended;
begin
  if not TryStrToFloat(Edit1.Text, v) then begin
     Edit1.Text  := '0';     // Default-Wert
     Edit1.Color := clRed;   // oder Änderung der Farbe
  end else begin
     Edit1.Color := clWindow;
  end;
end;

Auch in diesem Fall ist das OnChange-Beispiel die bessere Wahl, da das OnKeyPress-Beispiel nicht überprüft, ob der Dezimaltrenner überhaupt an der richtigen Stelle oder nicht sogar mehrfach eingegeben wurde.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.