【问题标题】:Delphi XE4, wParam for TControl.Perform() accepts only unsigned int? [duplicate]Delphi XE4,TControl.Perform() 的 wParam 只接受无符号整数? [复制]
【发布时间】:2016-06-09 09:17:12
【问题描述】:

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

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

这是 Delphi RTL 的错误,还是我理解错误?谢谢。

【问题讨论】:

  • 您可以转换负值。 TControl.Perform(..,WPARAM(-1),...)

标签: delphi delphi-xe4


【解决方案1】:

这是 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 参数中传递字符索引,而不是在无符号的wParam 参数中传递。一个可能的原因是-1 是一个标记值。通过使用无符号参数,字符索引可以是0$ffffffff - 1 之间的任何值(假设为32 位整数)。这意味着字符索引的有效范围是使用有符号值的两倍。现在,如果使用了带符号的值,则可以将其再次转换为大于$7fffffff 的值,但只要求转换特殊的哨兵值是有意义的。

【讨论】:

    【解决方案2】:

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

    WPARAM(-1)
    

    这应该可以按预期工作。

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多