如何只接受编辑控件中的数字?

时间:2012-04-02 16:10:10

标签: delphi exception-handling

通常我会执行以下操作将字符串值保存到数据库中

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

现在问题出现在用户输入无法转换为数字的内容时。我怎么能阻止这个?一个人可以使用异常吗?我将如何编写此异常?

我正在使用Delphi XE2。

4 个答案:

答案 0 :(得分:13)

最佳解决方案(恕我直言)是使用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并且实际上正如预期的那样使用{{1}}并不是特别“干净”。就像在这种情况下一样。

答案 1 :(得分:5)

您可以使用以下

捕获异常
  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 )

如果您只需要确保转换返回有效数字

答案 2 :(得分:1)

有许多控件可以被告知只接受数字输入,这比你接受的答案有一些好处。

jedi JVCL library例如包括几个数字输入控件,基本VCL包含一些可能性,包括用于输入整数值的Spin Edit控件。

答案 3 :(得分:0)

我找到了解决方案 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;