2012-02-09 5 views
2

フレームをあるフォームから別のフォームに移動するために、フレームの親をランタイムに変更しています。それは正常に動作しますが、その後、私のコンポーネントはマウスイベントをもう受信しません。たとえば、CM_MOUSEENTERCM_MOUSELEAVEは発生しません。フレームの親を変更した後にマウスイベントが発生しない

Frame.Parent := SecondDisplayForm; 
Frame.Align := alClient; 
SecondDisplayForm.Show; 

私はこの効果を理解していないと私は本当に提供するために、どのような情報を知らないので、あなたはヒントを持っている場合は、ここで私を助けてください。

+0

他のフォームでKeyPreviewがtrueに設定されていますか? – ertx

+2

'KeyPreview'はマウスイベントに影響を与えるべきではありません。 – jpfollenius

+0

+1私は同じ問題を抱えており、非常に迷惑です。私の場合、CM_MOUSEENTERの後でCM_MOUSELEAVEが起動する前に親を変更しました。たぶんこれも重要です。 – balazs

答えて

2

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に関連していると思うが、それを適切に検討していません。

+0

+1ありがとうございます。それは非常に有益で、私の前提を確認します。 'CM_MOUSELEAVE'メッセージの回避策は、親が(メインフォームの' OnKeyDown'ハンドラで処理されたキーイベントによって引き起こされる)内部からではなく、外部から変更されているため動作しにくいです。 – jpfollenius

+0

CM_MOUSELEAVEではなくWM_MOUSELEAVEメッセージをトリガーする必要があります。あなたがどこからでもFrame.Perform(WM_MOUSELEAVE、0、0)を呼び出すことができるので、あなたの場合でもうまくいくはずだと思います。フレームのsetparentをオーバーライドして、 。 – balazs

関連する問題