【问题标题】:OnMessage event-handler differs from Documentation - why?OnMessage 事件处理程序与文档不同 - 为什么?
【发布时间】:2020-08-11 20:17:24
【问题描述】:

Delphi documentationTApplication.OnMessage Event 定义为TMessageEvent,即procedure (var Msg: TMsg; var Handled: Boolean) of object;

但是,在 Delphi 10.4 中,我在对象检查器中双击 ApplicationEvents1OnMessage 字段以插入 OnMessage 事件处理程序,然后我得到以下代码:

procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  
end;

您注意到TMsgtagMSG 之间的区别了吗?这是BUG吗?

【问题讨论】:

  • TMsg = tagMSG,它们是同一类型。对象检查器依赖于 RTTI,它不区分声明的别名与它们所别名的类型。在这种情况下,TMessageEvent 的声明确实使用了TMsg 别名,但它所指的实际类型是tagMSG,这是 RTTI 看到的。
  • 它们完全一样。如果您在上面的 sn-p 中按住 ctrl-单击 tagMSG,您将被带到 Windows.pas,其中定义了 tagMSG 记录类型。在下面的行中,您会找到TMsg = tagMSG。所以它们完全一样。
  • 那么为什么会有两种不同的面额?
  • @user1580348: tagMSG 可以匹配the Win API declarationTMsg 之所以存在,是因为它听起来更像帕斯卡。
  • @RemyLebeau 不要责怪 Delphi 自 1996 年以来一直试图对齐事物并使它们更加有序。相比之下,我对以小写字母开头的标识符(如 tagMSG)可以也按类型。

标签: delphi eventhandler delphi-10.4-sydney


【解决方案1】:

在过去(大约 1996 年),Delphi 曾经与 WIN32.HLP 一起提供,当时文件大小约为 20 MiB 和 参考用于查找内容。但是所有的解释、定义和示例都是用 C++ 编写的,这给 Pascal 开发人员增加了另一层负担。如果现在的事情让你感到恼火,你可能在 20 多年前就已经迷失了 - 为相同的类型混合不同的名称在当时已经是一件事情了。

http://laurencejackson.com/win32/ 有一个带有截图的 CHM 版本;当您长时间离线时,它仍然是一个有价值的文件。

【讨论】:

  • 干得好!我会发现非常有用:现代 Delphi 的实用 WinAPI 示例的广泛集合!不知道有没有这样的书?我愿意为这样一本书付出合理的代价!
  • 自 2002 年以来,我不再使用书籍进行编程,而且几乎不存在离线文档,尤其是 MSDN。我的策略是复制像 theroadtodelphi.com/category/winapi-2 这样的单个网站,以便同时提供许多示例供以后阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多