2017-07-25 178 views
-3

我想设置使用GetTickCount德尔福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'不是有效的整数值'。

我做错了什么?

+4

我日后敦促您确保您发布的代码与您报告的错误相匹配。你没有设法在这里做到这一点。请养成张贴你已验证的[mcve]的习惯。您发布的代码与错误消息不符的事实表明缺乏清晰的思想,这是您进步和发展的根本障碍。当你遇到问题时,慢下来思考。在跳到结论之前清楚你的事实。改善你的思维模式将带来收益。 –

+2

如果你需要一个唯一的ID,为什么不使用['CreatGUID'](http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.CreateGUID)? –

+0

@DavidHeffernan电力被切断。我忘了补充一点,我再次将uniquestring转换为整数。你的答案清除使用int64帮助我感谢你。 –

回答

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。当然,如果不知道您的要求,很难推荐替代品。

+0

我不确定这是否是错误的原因,尤其是因为我无法在这里重现它。对IntToStr的调用使用Int64重载,因此在提供DWord值时不会因EConvertError而失败。 –

+0

@Uwe你是对的。事实上,我被提问者提供的与错误消息不匹配的代码欺骗了。他们实际上正在调用'StrToInt'。谢谢。 –

+0

通过在'UInt64'中使用['GetTickCount64()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724411.aspx),可以避免溢出问题。 –

1

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

+2

作为DWORD有效但DWORD无法表示?这些答案感觉不对。 – Fritzw

+1

没有负的DWORD,十六进制表示可能是负数的整数,而不是DWORD。 –