Delphi XE4,wParam for TControl.Perform()只接受unsigned int?

时间:2016-06-09 09:17:12

标签: delphi delphi-xe4

在Delphi7中,TControl.Perform()接受wParam参数的负值,这是它应该如何做的,因为例如EM_LINEFROMCHAR winapi消息会期望{{1} } -1

但在Delphi XE4下,wParam的数据类型已更改为wParam,这将不接受负整数。

这是Delphi RTL的一个错误,或者我错误地理解它?感谢。

2 个答案:

答案 0 :(得分:5)

这是Delphi 7标题翻译中的一个缺陷,其中之一就是其中之一。此类型为documented on MSDN,如此:

  

WPARAM

     

消息参数。此类型在WinDef.h中声明如下:

typedef UINT_PTR WPARAM;

反过来,UINT_PTR是无符号整数类型,其大小与平台指针相同。

在引入64位编译器的时候,这个缺陷已得到纠正,并且该类型的Delphi声明变为无符号,以匹配底层平台API。

如果您希望传递负值,则应该投射它。像这样:

WPARAM(-1)

此类强制转换是SendMessage API的必要恶意原因,它为所有消息类型提供了一个通用接口。有时您只需要使消息有效负载与可用类型相匹配。我还要评论lParam参数的类型为LPARAM,这是一个指针大小的有符号整数。这意味着,当决定如何将其他数据与消息一起传递时,您可以选择签名(lParam)和无符号(wParam)类型。当然,如果要传递两个有符号值或两个无符号值,则需要进行强制转换。

如果是EM_LINEFROMCHAR,您可能会发现lParam未被使用。您可能会问为什么设计者没有在签名的lParam参数中传递字符索引而不是unsigned wParam参数。一个可能的原因是-1是一个哨兵值。通过使用无符号参数,字符索引可以是0$ffffffff - 1之间的任何值(假设32位整数)。这意味着字符索引的有效范围是使用签名值的两倍。现在,如果使用了带符号的值,则可以为大于$7fffffff的值再次强制转换,但是仅对特殊的sentinel值进行强制转换才有意义。

答案 1 :(得分:1)

类型是WPARAM,定义为UINT_PTR。如果你想传递负值,你可以通过例如。

WPARAM(-1)

这应该按预期工作。