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

Delphi 如何仅接受编辑控件中的数字?,delphi,exception-handling,Delphi,Exception Handling,通常,我会执行以下操作将字符串值保存到数据库中 DataModule.tbTableNumber.Value := StrToFloat(edtNumber.text); 现在,当用户输入无法转换为数字的内容时,问题就出现了。我怎样才能防止这种情况?一个人可以使用异常吗?我将如何编写此异常 我使用的是Delphi XE2 您可以通过以下方法捕获异常 try val := StrToFloat(edtNumber.text); except on E: EConvertE

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

DataModule.tbTableNumber.Value := StrToFloat(edtNumber.text);
现在,当用户输入无法转换为数字的内容时,问题就出现了。我怎样才能防止这种情况?一个人可以使用异常吗?我将如何编写此异常


我使用的是Delphi XE2

您可以通过以下方法捕获异常

  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 )
如果您只需要确保convert返回一个有效的数字,那么最好的解决方案(IMHO)是使用
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是特别“干净”的。除了当错误像本例中的情况一样微不足道,事实上,正如预期的那样时。

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

例如,包括几个数字输入控件,基本VCL包括一些可能性,包括用于输入整数值的旋转编辑控件。

我在上找到了解决方案

(链接中的代码)

过程TForm1.Edit1KeyPress(发送方:TObject;变量键:Char);
开始
如果不是(输入[#8,'0'..'9','-',小数分隔符]),则开始
ShowMessage('无效密钥:'+密钥);
键:=#0;
结束
如果((Key=DecimalSeparator)或(Key='-'))和
(位置(键,Edit1.Text)>0)然后开始
ShowMessage('无效密钥:两次'+密钥);
键:=#0;
结束
否则,如果(Key='-')和(Edit1.SelStart 0),则开始
ShowMessage('仅允许在数字的开头:'+键);
键:=#0;
结束;
结束;

StrToFloatDef(edtNumber.text,-1)的确切功能是什么?在这种情况下,如果字符串不代表有效的数字,则返回传入的默认值-1。还有
TryStrToFloat(edtNumber.text,val)
TryStrToFloat功能是什么?doJapster,您似乎在读取时遇到了问题。它本可以告诉您StrToFloatDef和trystToFloat的功能。为什么不使用数据感知控件?与此类似,另一种方法是首先防止用户输入无效数据。您可以使用支持输入掩码的控件,也可以处理
TEdit.OnChange
事件以防止用户输入非数字数据
TEdit
也有一个
NumbersOnly
属性,但它不会阻止用户将无效数据复制和粘贴到字段中。与正常的TEdit相比,数据感知控件会给我带来什么好处许多好处,在这些好处之间,根据字段的类型,会对控件本身进行输入数据验证,因此,如果将TDbEdit绑定到整数或浮点字段,控件只允许输入数值。因此,如果TEdit连接到数字字段,它将拒绝接受任何其他非数字字符?@Japster:字符串到浮点转换的结果保存在
myfloat
中,即
trystrtofolat(S,F)
尝试将字符串
S
转换为浮点数。如果成功,则返回
true
,结果保存在
myfloat
中。如果不是,它将返回
false
@Andreas:完全同意异常应用于异常情况,而不是在非常有可能经常发生的情况下。
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;