我正在使用一个旧的Paradox数据库以及我继承的旧Delphi程序,当我点击此声明时,它一直给我一个数字超出范围错误:
POE_Data.OrdersTaxRate.AsFloat:= StrToFloat(Copy(TaxRateLabel.Caption, 1,1));
TaxRateLabel.Caption
等于7%,因此StrToFloat
只传递7个字符。 TaxRate字段在数据库中定义为具有2个小数位的BCD字段。我没有看到数据库中设置了任何最小值或最大值,那么为什么会产生超出范围的数字错误?
答案 0 :(得分:1)
更新旧的C ++ Builder项目时遇到了类似的问题。解决方案是将Source \ data \ Data.DB.pas文件复制到项目的代码文件夹,然后进行以下代码更改:
procedure TBCDField.SetAsCurrency(Value: Currency);
begin
if FCheckRange and ((Value < FMinValue) or (Value > FMaxValue)) then
RangeError(Value, FMinValue, FMaxValue);
// if FIOBuffer <> nil then
// TDBBitConverter.UnsafeFrom<System.Currency>(Value, FIOBuffer);
// SetData(FIOBuffer, False);
SetData(@Value, False); // replaces the lines above
end; // so can TField.AsBCD
然后将修改后的Data.DB.pas文件添加到您的项目&amp;重建你的项目。
答案 1 :(得分:0)
在Delphi XE中有一个AsBcd
属性。您可以将它与StrToBcd函数一起使用,该函数将字符串转换为TBcd
:
POE_Data.OrdersTaxRate.AsBcd:= StrToBcd(Copy(TaxRateLabel.Caption, 1,1));