Kann man den Punkt nur am Ende eingeben?
Also Grundsätzlich ist es einfacher "Ungültiges" garnicht erst ins Edit reinkommen zu lassen.
-> Wenn Key='.' und ein Punkt bereits vorhanden, dann Key:=0; (eventuell das Ganze bereits im OnKeyDown, anstatt im OnKeyPress)
PS: Sobald das Edit nicht ReadOnly/Disabled ist und die Eingaben ausschließlich durch deinen Code in der Anzeige landen:
Im Notpade den Text "....." mit Strg+C abholen
und dann via Strg+V, Shift+Einfg, Kontextmenü oder sonstwie in dein Edit rein.
Schon hast du viele Punkte und dein "bei . prüfen ob schon vorhanden" hat nix mitbekommen.
Im OnChange könnte man sowas zusätzlich/sichrer prüfen und dann das "Böse" rauslöschen.
Alternativ im OnChange nur Prüfen und das Edit nur "rot" malen, und eine Fehlermeldung/
Exception erst bei anschließender Verarbeitung, um den Eingabefluss nicht zu stören.
Ach ja, statt RegEx hier eher ein
TStringHelper.CountChar
oder die "billige" alte Variante ala
Anzahl := Length(myValueString) - Length(ReplaceStr(myValueString, '.', ''));