加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – Lazarus / FPC上的WM_COMMAND问题

发布时间:2020-12-15 09:46:39 所属栏目:大数据 来源:网络整理
导读:我有MainMenu的表单,我想在用户从菜单中选择一个命令项时拦截. 这适用于Delphi: type TForm1 = class(TForm) ... // Memo and MainMenu created protected procedure WMCommand(var Info: TWMCommand); message WM_COMMAND; end;procedure TForm1.WMCommand
我有MainMenu的表单,我想在用户从菜单中选择一个命令项时拦截.
这适用于Delphi:

type
  TForm1 = class(TForm)
    ... // Memo and MainMenu created
  protected
    procedure WMCommand(var Info: TWMCommand); message WM_COMMAND;
  end;


procedure TForm1.WMCommand(var Info: TWMCommand);
begin
  if (Info.ItemID < 10) then
    Memo1.Lines.Add('WMCommand ' + IntToStr(Info.ItemID));
end;

在MainMenu中我添加了一些项目,当我从菜单中选择那些项目时
我的Memo1充满了:

WMCommand 2
WMCommand 3
WMCommand 3
WMCommand 2
WMCommand 5
...

我将此应用程序移植到FPC / Lazarus,但似乎WM_COMMAND
处理程序未被调用!当我在Delphi中的TForm1.WMCommand中设置断点然后是Delphi
在主要形式出现之前停止了很多次.拉撒路从未停止过
在这个断点上.我觉得WM_COMMAND打破了一些东西
在拉撒路,但也许我不知道什么.任何的想法?

我在WinXP上使用Lazarus 0.9.28.2 beta和FPC 2.2.4.

编辑:

使用Winspector我检查了MainMenu生成WM_COMMAND:

WM_COMMAND
    Code: 0
    Control ID: 2
    Control HWND: 0x00000000
    Message Posted
    Time: 09:37:14.0968

我认为在WM_COMMAND消息方法处理中Lazarus / FPC中存在错误,我报告了它:http://bugs.freepascal.org/view.php?id=15521

解决方法

在LCL应用程序中,您有以下图层:

>申请
> LCL
>小部件设置界面(例如win32 / win64,qt,gtk2,carbon)
>小工具集

WM_COMMAND是从widgetset Layer到Widget Set接口层的winapi消息.这些消息不会传递给更高层,考虑到可移植性,其他窗口小部件集不会产生此类消息.

如果要捕获消息,则必须编写非可移植的widgetset特定代码(在本例中为winapi代码).您可以使用setwindowlong覆盖windowproc.有关示例,请参见Lazarus wiki.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读