MDIChild の Parent について


orz  2007-03-08 04:56:18  No: 25207

MDIChildフォームのParent は、MDIMainに設定していますか?

MDIChildでのマウスホイールも含め、全てメインフォームで処理してましたが
なぜか Shift が ssCtrl ->  ssShift , ssShift -> ssLeft と変化して
届くことに気が付き調査した結果、MDIChildフォーム.Parent = nil と
していました。

マウスのホイールをクリクリしたとき、MDIChild で WM_〜WHEELメッセージを
受け取り、VCLメッセージのCM_〜WHEELを処理していますが、
MDIChild.Parent = nil のため、メインフォームに届かず、
Message.Result = 0(未処理)となる。

そのため、メインフォームに改めてWM_〜WHEELが届けられる。

ここで問題になるのが、WM_〜WHEELを受け取ると、CM_〜WHEELで処理するため
Shift状態の値を変換しているところ。

> TCMMouseWheel(Message).ShiftState := KeysToShiftState(Message.Keys);

この変換結果が、MDIChild側で未処理になったため、そのままメインフォームに
WM_〜WHEELで届けられてしまうため、再度変換されてしまう。
その結果、ssCtrl ->  ssShift , ssShift -> ssLeft のような不思議な
シフト状態でホイールイベントが発生してしまっていたのです。

長い間 Child.Parent = nil で鍛え上げられてきたアプリで、かつ
かなり肥大化しており、「Child.Parent = メインフォーム」 とすると、
挙動不審に・・・。

とりあえず、こんな感じで誤魔化した。
procedure THogeChild.CMMouseWheel(var Message: TCMMouseWheel);
begin
  inherited;
  if (Message.Result = 0) and (Parent = nil) then begin
    Application.MainForm.Perform(CM_MOUSEWHEEL,
      TMessage(Message).WParam, TMessage(Message).LParam);
  end;
end;

今頃見つかってもらっても困るのだよ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加