Delphi XE4,TControl.Perform()的wParam只接受无符号int?

Delphi XE4,TControl.Perform()的wParam只接受无符号int?,delphi,delphi-xe4,Delphi,Delphi Xe4,在Delphi7中,TControl.Perform()接受wParam参数的负值,这就是它应该做的,因为例如,winapi消息期望wParam的-1 但是在Delphi XE4下,wParam的数据类型已更改为NativeUInt,它将不接受负整数 这是Delphi RTL的一个bug,还是我理解错了?谢谢。类型为WPARAM,定义为UINT\u PTR。如果仍要传递负值,可以传递,例如 WPARAM(-1) 这应该可以按预期工作。类型是WPARAM,定义为UINT\u PTR。如果仍要传递

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

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


这是Delphi RTL的一个bug,还是我理解错了?谢谢。

类型为WPARAM,定义为UINT\u PTR。如果仍要传递负值,可以传递,例如

WPARAM(-1)

这应该可以按预期工作。

类型是WPARAM,定义为UINT\u PTR。如果仍要传递负值,可以传递,例如

WPARAM(-1)

这是Delphi 7标题翻译中的一个缺陷,是众多标题翻译中的一个。这种类型是这样的:

WPARAM

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

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

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

如果希望传递负值,则应将其强制转换。像这样:

WPARAM(-1)
此类强制转换是
SendMessage
API造成的一个必要的恶果,它为所有消息类型提供了一个公共接口。有时,您只需要使消息负载适合可用的类型。我还要指出,
lParam
参数的类型是指针大小的有符号整数。这意味着,在决定如何在消息旁边传递附加数据时,您可以在有符号(
lParam
)和无符号(
wParam
)类型之间进行选择。当然,如果要传递两个有符号值,或者两个无符号值,则需要强制转换


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

这是Delphi 7标题翻译中的一个缺陷,是众多翻译之一。这种类型是这样的:

WPARAM

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

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

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

如果希望传递负值,则应将其强制转换。像这样:

WPARAM(-1)
此类强制转换是
SendMessage
API造成的一个必要的恶果,它为所有消息类型提供了一个公共接口。有时,您只需要使消息负载适合可用的类型。我还要指出,
lParam
参数的类型是指针大小的有符号整数。这意味着,在决定如何在消息旁边传递附加数据时,您可以在有符号(
lParam
)和无符号(
wParam
)类型之间进行选择。当然,如果要传递两个有符号值,或者两个无符号值,则需要强制转换


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

可以强制转换负值。TControl.Perform(..,WPARAM(-1),…)您可以强制转换负值。t控制。执行(..,WPARAM(-1),…)