Delphi GetTickCount 不是有效整数
Delphi GetTickCount is not a valid integer
我正在尝试使用 GetTickCount
设置唯一 ID
我正在做以下事情
var
UniqueID : DWORD;
LastUniqueID : DWORD;
uniqueString : string;
begin
UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;
uniqueString := intTostr(LastUniqueID);//or UniqueID
end;
我在 uniqueString := intTostr(LastUniqueID);
上得到了无效的整数值
Project project1.exe raised exception class EConvertError with message
''2312357250' is not a valid integer value'.
我做错了什么?
问题是2312357250太大了。尽管它作为 DWORD 是有效的,但十六进制表示形式 89D3C582 相当于一个 DWORD 无法表示的负数,因此出现了消息。
很遗憾,您显示的代码与您报告的错误消息不匹配。您的实际代码调用 StrToInt
而不是 IntToStr
。我知道这是因为该错误消息是由调用 StrToInt
而不是 IntToStr
.
产生的
您的代码看起来更像这样:
UniqueID := StrToInt('2312357250');
注意 StrToInt
return 是一个带符号的 32 位整数类型。有效值在 -2,147,483,648 到 2,147,483,647 范围内。您的值超出 Integer
的有效范围,因此出现错误。
如果您想要一种简单的方法来解决所有这些范围问题,请使用 Int64
而不是 DWORD
或 Integer
,然后调用 StrToInt64
.
另外,这几行比较麻烦:
UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;
您对 GetTickCount
进行了两次不同的调用。这两个调用可能会产生不同的值。事实上,如果 GetTickCount
翻滚,那么第二次调用可能 return 一个小于第一个的值。
更多的麻烦围绕着GetTickCount + 1000
。如果GetTickCount
return是一个接近上限的值,那么就会遇到整数溢出,可能会出现意想不到的结果。使用 GetTickCount64
来避免这个陷阱。
但是,我仍然相信系统滴答计数是生成唯一 ID 的好方法。根据您的要求,无论问题是什么,这都可能是一个糟糕的解决方案。从表面上看,您的代码似乎阻止了请求唯一 ID 的时间比您上次请求的时间晚不到一秒。当然,在不知道您的要求的情况下,很难推荐替代方案。
我正在尝试使用 GetTickCount
我正在做以下事情
var
UniqueID : DWORD;
LastUniqueID : DWORD;
uniqueString : string;
begin
UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;
uniqueString := intTostr(LastUniqueID);//or UniqueID
end;
我在 uniqueString := intTostr(LastUniqueID);
Project project1.exe raised exception class EConvertError with message ''2312357250' is not a valid integer value'.
我做错了什么?
问题是2312357250太大了。尽管它作为 DWORD 是有效的,但十六进制表示形式 89D3C582 相当于一个 DWORD 无法表示的负数,因此出现了消息。
很遗憾,您显示的代码与您报告的错误消息不匹配。您的实际代码调用 StrToInt
而不是 IntToStr
。我知道这是因为该错误消息是由调用 StrToInt
而不是 IntToStr
.
您的代码看起来更像这样:
UniqueID := StrToInt('2312357250');
注意 StrToInt
return 是一个带符号的 32 位整数类型。有效值在 -2,147,483,648 到 2,147,483,647 范围内。您的值超出 Integer
的有效范围,因此出现错误。
如果您想要一种简单的方法来解决所有这些范围问题,请使用 Int64
而不是 DWORD
或 Integer
,然后调用 StrToInt64
.
另外,这几行比较麻烦:
UniqueID := GetTickCount;
LastUniqueID := GetTickCount + 1000;
您对 GetTickCount
进行了两次不同的调用。这两个调用可能会产生不同的值。事实上,如果 GetTickCount
翻滚,那么第二次调用可能 return 一个小于第一个的值。
更多的麻烦围绕着GetTickCount + 1000
。如果GetTickCount
return是一个接近上限的值,那么就会遇到整数溢出,可能会出现意想不到的结果。使用 GetTickCount64
来避免这个陷阱。
但是,我仍然相信系统滴答计数是生成唯一 ID 的好方法。根据您的要求,无论问题是什么,这都可能是一个糟糕的解决方案。从表面上看,您的代码似乎阻止了请求唯一 ID 的时间比您上次请求的时间晚不到一秒。当然,在不知道您的要求的情况下,很难推荐替代方案。