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;
今頃見つかってもらっても困るのだよ。
ツイート | ![]() |