我正在尝试使用GetTickCount
我正在做以下
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'不是有效的整数值'。
我做错了什么?
答案 0 :(得分:11)
不幸的是,您显示的代码与您报告的错误消息不符。您的实际代码调用StrToInt
而不是IntToStr
。我知道这一点,因为该错误消息是通过调用StrToInt
而不是IntToStr
生成的。
您的代码看起来更像是这样:
UniqueID := StrToInt('2312357250');
请注意StrToInt
返回带符号的32位整数类型。有效值在-2,147,483,648到2,147,483,647的范围内。您的值超出Integer
的有效范围,因此出错。
如果您想要一个简单的方法来解决所有这些范围问题,请使用Int64
代替DWORD
或Integer
,然后致电StrToInt64
。
此外,这些线路很麻烦:
UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;
您对GetTickCount
进行了两次不同的调用。这两个调用可能会产生不同的值。实际上,如果GetTickCount
翻身,那么第二次调用可能会返回一个小于第一个值的值。
GetTickCount + 1000
围绕着更多的麻烦。如果GetTickCount
返回接近上限的值,那么您将遇到整数溢出,这可能会产生您不期望的结果。使用GetTickCount64
来避免陷阱。
但是,我仍然相信系统滴答计数可以是生成唯一ID的好方法。根据您的要求,这可能是您的问题的一个糟糕的解决方案,无论它是什么。从表面上看,您的代码似乎排除了请求一个比您上一次请求时间少一秒的唯一ID。当然,如果不了解您的要求,很难推荐替代方案。
答案 1 :(得分:1)
问题在于2312357250太大了。虽然它作为DWORD有效,但十六进制表示89D3C582相当于一个负数,DWORD无法表示,因此消息。