在Delphi7中,TControl.Perform()
接受wParam
参数的负值,这是它应该如何做的,因为例如EM_LINEFROMCHAR winapi消息会期望{{1} } -1
。
但在Delphi XE4下,wParam
的数据类型已更改为wParam
,这将不接受负整数。
这是Delphi RTL的一个错误,或者我错误地理解它?感谢。
答案 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)
这应该按预期工作。