NGLNが報告したようにD7で動作しますが、BDS2006では再現可能です。私はcm_mouseenter
の後で、そしてcm_mouseleave
の前に親を変えることが重要であることを発見しました。問題はコントロールにあります。おそらくバグだと思います。ちょっと遊んで私はあなたがPerform
の場合wm_mouseleave
メッセージを親を変更する前にもう一度大丈夫だと分かった。
私のサンプルコードでは、私はonclickイベントで親を変更します。
TFrame3 = class(TFrame)
procedure FrameClick(Sender: TObject);
private
procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
public
end;
implementation
procedure TFrame3.CMMouseEnter(var msg: TMessage);
begin
inherited;
Color := clRed;
end;
procedure TFrame3.CMMouseLeave(var msg: TMessage);
begin
inherited;
Color := clBlue;
end;
procedure TFrame3.FrameClick(Sender: TObject);
begin
if parent = Form1 then
begin
Perform(WM_MOUSELEAVE, 0, 0);
parent := Form2;
align := alClient;
Form1.Hide;
Form2.Show;
end else
begin
Perform(WM_MOUSELEAVE, 0, 0);
parent := Form1;
align := alClient;
Form2.Hide;
Form1.Show;
end;
end;
私はこの問題はControls.pasでFMouseControlに関連していると思うが、それを適切に検討していません。
他のフォームでKeyPreviewがtrueに設定されていますか? – ertx
'KeyPreview'はマウスイベントに影響を与えるべきではありません。 – jpfollenius
+1私は同じ問題を抱えており、非常に迷惑です。私の場合、CM_MOUSEENTERの後でCM_MOUSELEAVEが起動する前に親を変更しました。たぶんこれも重要です。 – balazs