Как правильно форматировать и проверять контроль редактирования, чтобы принимать только значения с плавающей запятой или валюту - PullRequest
1 голос
/ 17 февраля 2011

У меня есть приложение, которое должно принимать значения с плавающей запятой или валюту в режиме редактирования.Мой вопрос заключается в том, что мне нужно сделать, чтобы отформатировать и проверить ввод элементов управления редактирования, чтобы он принимал только цифры, запятую или точку (запятая или точка зависит от локали системы).И форматирование ##. ## (45.21).Я хочу сделать один метод, который может управлять всеми элементами управления редактированием, где используется форматирование и проверка с плавающей точкой.

Прямо сейчас у меня есть код в событии OnChange, который использует метод TryStrToFloat, но иногда я получаю «» не является плавающей точкойчисло "ошибки.

Может быть, вы, ребята, сделали это больше, чем я, и есть несколько замечательных примеров, как это сделать правильно.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Если вы хотите продолжить использовать тот же подход проверки, просто улучшите свой алгоритм, чтобы учесть крайние случаи (и как вы хотите управлять этим).

Например, вы можете рассмотреть возможность принятия пустой строки какдопустимый ввод и просто не выбрасывайте исключение, или нет.Вы также должны подумать, как вы хотите выполнить взаимодействие с пользователем в случае неправильного ввода.Например, если пользователь вводит недопустимое число, вы хотите запретить пользователю вводить значения в ту же миллисекунду ... или вы можете использовать более естественный подход (например, проверку, пока пользователь не решит, что все правильно).

Вы также можете управлять проверкой, просто уведомив пользователя непрерывным способом во время ввода, просто создав видимый эффект над полями с ошибками и стоп-сигнал (например, с помощью сообщения).окно), если пользователь пытается сохранить данные.

Простая функция проверки может выглядеть следующим образом:

function IsEditValidFloat(Sender: TEdit; const AcceptBlank: Boolean = True): Boolean;
var
  sValue: string;
  Temp: Extended;
begin
  sValue := Trim(Sender.Text);
  if (sValue.Text = '') then
    Result := AcceptBlank
  else
    Result := TryStrToFloat(sValue, Temp);
end;

//you might call this on the OnChangeEvent:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  if IsEditValidFloat(Sender as TEdit) then
    ChangeDisplayState(Sender, dsValid)
  else
    ChangeDisplayState(Sender, dsError);
end;
1 голос
/ 18 февраля 2011

Просто получите JVCL и используйте компонент TJvValidateEdit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...