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.
Über den Autor
Software 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
PHP: Strings mit Ctype-Funktionen auf Zeichenklassen überprüfen
Artikel | 0 Kommentare
PHP: Nur bestimmte Buchstaben, Zahlen und Zeichen in einem String zulassen
Tipp | 10 Kommentare
Mehrere Texte gleichzeitig ersetzen
Tutorial | 0 Kommentare
PHP: Formular-Eingaben als Array an PHP Skript schicken
Tipp | 0 Kommentare
Delphi/Lazarus: Passwort Edit
Tipp | 0 Kommentare
Text nur in bestimmten Zeilen ersetzen
Tutorial | 0 Kommentare
Delphi/Lazarus: STRG+C in Memo oder Edit abfangen und Zwischenablage manipulieren
Tutorial | 0 Kommentare
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.