Delphi GetTickCount不是有效的整数

时间:2017-07-25 14:00:34

标签: delphi delphi-10-seattle

我正在尝试使用GetTickCount

设置唯一ID

我正在做以下

var
UniqueID : DWORD;
LastUniqueID : DWORD;
uniqueString : string;
begin

UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;

uniqueString  := intTostr(LastUniqueID);//or UniqueID 

end;

我在uniqueString := intTostr(LastUniqueID);

上获得了无效的整数值
  

项目project1.exe引发了带有消息的异常类EConvertError   ''2312357250'不是有效的整数值'。

我做错了什么?

2 个答案:

答案 0 :(得分:11)

不幸的是,您显示的代码与您报告的错误消息不符。您的实际代码调用StrToInt而不是IntToStr。我知道这一点,因为该错误消息是通过调用StrToInt而不是IntToStr生成的。

您的代码看起来更像是这样:

UniqueID := StrToInt('2312357250');

请注意StrToInt返回带符号的32位整数类型。有效值在-2,147,483,648到2,147,483,647的范围内。您的值超出Integer的有效范围,因此出错。

如果您想要一个简单的方法来解决所有这些范围问题,请使用Int64代替DWORDInteger,然后致电StrToInt64

此外,这些线路很麻烦:

UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;

您对GetTickCount进行了两次不同的调用。这两个调用可能会产生不同的值。实际上,如果GetTickCount翻身,那么第二次调用可能会返回一个小于第一个值的值。

GetTickCount + 1000围绕着更多的麻烦。如果GetTickCount返回接近上限的值,那么您将遇到整数溢出,这可能会产生您不期望的结果。使用GetTickCount64来避免陷阱。

但是,我仍然相信系统滴答计数可以是生成唯一ID的好方法。根据您的要求,这可能是您的问题的一个糟糕的解决方案,无论它是什么。从表面上看,您的代码似乎排除了请求一个比您上一次请求时间少一秒的唯一ID。当然,如果不了解您的要求,很难推荐替代方案。

答案 1 :(得分:1)

问题在于2312357250太大了。虽然它作为DWORD有效,但十六进制表示89D3C582相当于一个负数,DWORD无法表示,因此消息。