Я знаю, что вы сказали user can enter any char but at the time of validation
.
Однако я хотел бы предложить альтернативу, потому что кажется очень глупым разрешать пользователю вводить значения, только чтобы пожаловаться пользователю через 1 минуту; это просто пахнет хорошо ... не приятно.
Я бы запретил вводить что-либо, кроме цифр.
Если у вас есть целые числа, это особенно просто:
Заполните событие OnKeyPress для поля ввода.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
begin
if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;
Это отбросит все, что не является числом.
Если вы разрешите отрицательные числа, вам потребуется дополнительная проверка, чтобы убедиться, что -
не был введен ранее.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
var
Edit1Text: string;
begin
if (Key = '-') and Pos('-',Edit1.Text) = 0 then begin
Edit1.Text:= '-' + Edit1.Text; //Force the '-' to be in the front.
end
else if (Key = '-') and Pos('-',Edit1.Text) <> 0 then begin //else flip the sign
Edit1Text:= Edit1.Text;
Edit1.Text:= StringReplace(Edit1Text, '-', '',[]);
end;
if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;
Поскольку пользователь также может вставлять данные в поле редактирования, вам все равно придется проверять данные при изменении текста в редактировании.
Поскольку в событии ONKeyPress это происходит довольно сложно, я использую пользовательский компонент редактирования, который выполняет такую проверку и не позволяет пользователю вводить вводимые данные в поле ввода.
Лично я не верю, чтобы когда-либо выдавалось сообщение об ошибке, вы всегда должны стремиться не допустить, чтобы пользователь вводил неверные данные.