Eine neue Zuweisung an Edit.Text setzt aber den Cursor zurück. Wäre also für Prüfung nach der Eingabe OK.
Für die Prüfung bei der Eingabe hatte ich für ein Gewichtsfeld auch mal was gebastelt:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
EditKeys = #13#8#9;
Ciphers = '0123456789';
MaxFrac = 2;
var
i : Integer;
aText : String;
begin
aText := TEdit(Sender).Text;
i := Pos(DecimalSeparator, aText);
if i > 0 then
if (Length(aText) -i) < MaxFrac then
aText := Ciphers + Editkeys
else
aText := EditKeys
else
aText := Ciphers + EditKeys + DecimalSeparator;
if Pos(Key, aText) <= 0 then Key := #0
end;
€: Für Währung müsste man noch das Minus-Zeichen in Ciphers aufnehmen und eigentlich auch auf 1x vorhanden Testen (war bei Gewicht aber nicht nötig)
Also so in etwa:
Delphi-Quellcode:
procedure SetValidFloatKey(var aKey : Char; const CurrText : String; OnlyAbs : Boolean; MaxFrac : Integer = 2);
const
EditKeys = #13#8#9;
Ciphers = '-0123456789';
var
i : Integer;
aText : String;
begin
aText := CurrText;
if (aKey = '-') and ((Length(aText) > 0) or (OnlyAbs)) then
aKey := #0
else
i := Pos(DecimalSeparator, aText);
if i > 0 then
if (Length(aText) -i) < MaxFrac then
aText := Ciphers + Editkeys
else
aText := EditKeys
else
aText := Ciphers + EditKeys + DecimalSeparator;
if Pos(aKey, aText) <= 0 then aKey := #0
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
SetValidFloatKey(Key, TEdit(Sender).Text, False, 2);
end;
€: Universeller gestaltet.
Ein Schönheitsfehler hat es noch... Minus wird nur bei leerem Edit erlaubt. Da müsste man nachbessern.