Вот написал с Case, но так хуже работает: когда не ввёл цифру можно ввести запятую, не придумал как это устранить.
Код:
Case Key Of
'0'..'9':;
#8:;
',', '.':
If (Key=DecimalSeparator) Then
If (AnsiPos(DecimalSeparator, Edit1.Text)<>0)
And (Edit1.Text<>'') Then
Key:=#0
Else
Else Key:=#0;
End;
Я же ещё ссылки выложил: там пример для Lazarus, но и для Делфей пойдёт.