掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
MDIChild の Parent について (ID:25207)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
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; 今頃見つかってもらっても困るのだよ。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.