Mic*_*las 5 delphi message freepascal lazarus fpc
我有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;
Run Code Online (Sandbox Code Playgroud)
在MainMenu中我添加了一些项目,当我从菜单中选择这些项目时,我的Memo1充满了:
WMCommand 2
WMCommand 3
WMCommand 3
WMCommand 2
WMCommand 5
...
Run Code Online (Sandbox Code Playgroud)
我将此应用程序移植到FPC/Lazarus,但似乎没有调用WM_COMMAND处理程序!当我TForm1.WMCommand
在Delphi中设置断点时,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
Run Code Online (Sandbox Code Playgroud)
我认为在WM_COMMAND消息方法处理中Lazarus/FPC中存在错误并且我报告了它:http://bugs.freepascal.org/view.php?id = 15521
小智 2
在 LCL 应用程序中,您具有以下层:
WM_COMMAND 是一个从 widgetset 层到 Widget Set 接口层的 winapi 消息。这些消息不会传递到更高层,考虑到可移植性,其他小部件集不会产生此类消息。
如果您想捕获消息,则必须编写不可移植的 widgetset 特定代码(在本例中为 winapi 代码)。您可以使用 setwindowlong 覆盖 windowproc。请参阅Lazarus wiki的示例。
归档时间: |
|
查看次数: |
1168 次 |
最近记录: |