5

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 が何度も停止しました。Lazarus は、このブレークポイントで停止することはありませんでした。Lazarus の WM_COMMAND で何かが壊れていると思いますが、何かわからないことがあります。何か案が?

WinXP で FPC 2.2.4 を搭載した Lazarus 0.9.28.2 ベータ版を使用しています。

編集:

Winspector を使用して、MainMenu が WM_COMMAND を生成することを確認しました。

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

Lazarus/FPC の WM_COMMAND メッセージ メソッドの処理にバグがあると思い、報告しました: http://bugs.freepascal.org/view.php?id=15521

4

1 に答える 1

2

LCL アプリケーションには、次のレイヤーがあります。

  • 応用
  • LCL
  • ウィジェット セット インターフェイス (例: win32/win64、qt、gtk2、carbon)
  • ウィジェットセット

WM_COMMAND は、widgetset Layer から Widget Set インターフェイス レイヤへの winapi メッセージです。これらのメッセージは、移植性を念頭に置いて上位層に渡されません。他のウィジェット セットはそのようなメッセージを生成しません。

メッセージを取得したい場合は、移植性のないウィジェット セット固有のコード (この場合は winapi コード) を記述する必要があります。setwindowlong で windowproc をオーバーライドできます。例については、 Lazarus wikiを参照してください。

于 2010-01-15T12:36:38.420 に答える