Как я могу принять только цифры из элемента управления редактирования? - PullRequest
7 голосов
/ 02 апреля 2012

Обычно я делал бы следующее, чтобы сохранить строковое значение в базе данных

DataModule.tbTableNumber.Value := StrToFloat(edtNumber.text);

Теперь проблема возникает, когда пользователь вводит что-то, что не может быть преобразовано в число.Как я смогу предотвратить это?Может ли человек использовать исключение, и как бы я написал это исключение?

Я использую Delphi XE2.

Ответы [ 4 ]

13 голосов
/ 02 апреля 2012

Лучшее решение (ИМХО) - использовать TryStrToFloat:

procedure TForm1.Button1Click(Sender: TObject);
var
  myfloat: double;
begin
  if TryStrToFloat(Edit1.Text, myfloat) then
    DataModule.tbTableNumber.Value := myfloat
  else
    ShowMessage('Incorrect value.');
end;

Я не думаю, что особенно «чисто» использовать try..except, когда ошибка столь же тривиальна и, фактически, как и ожидалось, как в этом случае.

5 голосов
/ 02 апреля 2012

Вы можете поймать исключение со следующим

  try
    val := StrToFloat(edtNumber.text);
  except
    on E: EConvertError do
    begin
      ShowMessage( 'Entered Data is not a valid Floating Point number' );
    end;
  end;

Вы также можете посмотреть на

StrToFloatDef( edtNumber.text, -1 )

Если вам просто нужно убедиться, что конвертация возвращает действительное число

1 голос
/ 03 апреля 2012

Существует много элементов управления, которым можно сказать, что они принимают только числовой ввод, и это имеет некоторые преимущества по сравнению с подходом, принятым вами в качестве ответа.

Например, библиотека JVCL jedi включаетнесколько элементов управления числовым вводом, а базовый VCL включает несколько возможностей, включая элемент управления Spin Edit, предназначенный для ввода целочисленных значений.

0 голосов
/ 29 марта 2016

Я нашел решение на http://www.festra.com/eng/snip05.htm

(код по ссылке)

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in [#8, '0'..'9', '-', DecimalSeparator]) then begin
    ShowMessage('Invalid key: ' + Key);
    Key := #0;
  end
  else if ((Key = DecimalSeparator) or (Key = '-')) and 
      (Pos(Key, Edit1.Text) > 0) then begin
    ShowMessage('Invalid Key: twice ' + Key);
    Key := #0; 
  end
  else if (Key = '-') and (Edit1.SelStart <> 0) then begin
    ShowMessage('Only allowed at beginning of number: ' + Key);
    Key := #0;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...