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

Edw*_*Yip 1 delphi delphi-xe4

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

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

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

Dav*_*nan 5

这是Delphi 7头文翻译中的一个缺陷,其中之一就是其中之一.这种类型记录在MSDN上,如下所示:

WPARAM

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

typedef UINT_PTR WPARAM;
Run Code Online (Sandbox Code Playgroud)

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

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

如果你希望传递负值,你应该投射它.像这样:

WPARAM(-1)
Run Code Online (Sandbox Code Playgroud)

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

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