我使用的是一个旧的Paradox数据库和我继承的一个旧Delphi程序,当我遇到以下语句时,它一直给我一个数字超出范围的错误:
POE_Data.OrdersTaxRate.AsFloat:= StrToFloat(Copy(TaxRateLabel.Caption, 1,1));
TaxRateLabel.Caption
等于7%,因此StrToFloat
只传递7个字符。TaxRate字段在数据库中定义为BCD字段,小数点后两位。我在数据库中没有看到任何最小值或最大值设置,那么为什么这会产生数字超出范围的错误呢?
我在更新旧的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文件添加到您的项目&重建您的项目。
在Delphi XE中有一个AsBcd
属性。您可以将它与StrToBcd函数一起使用,该函数将字符串转换为TBcd
:
POE_Data.OrdersTaxRate.AsBcd:= StrToBcd(Copy(TaxRateLabel.Caption, 1,1));