2011-12-02 10 views
1

ここに提供されている例を使用して、How to implement a close button for a TTabsheet of a TPageControlをフォームの親にタブキャプションを設定して貼り合わせると、今日のWebブラウザで見るように、画像リストから閉じるボタンと画像を追加してください。所有者引き出しTPageControlフォームをタブとしてドッキングするときにOnMouseイベントが発生しない

私は

procedure TMainfrm.SOTest(Sender: TObject); 
var 
    ATab: TTabSheet; 
    AForm: TMyForm; 
begin 
    { Tabbed } 
    ATab:= TTabSheet.Create(MainPageControl); 
    ATab.PageControl := MainPageControl; 
    MainPageControl.ActivePage := ATab; 
    AForm:= TMyForm.Create(ATab); 
    AForm.Show; 
    ATab.Caption := AForm.Caption; 
end; 

procedure TMainfrm.SOTest(Sender: TObject); 
var 
    AForm: TMyForm; 
begin 
    AForm:= TMyForm.Create(Application); 
    AForm.Show; 
    AForm.DragKind := dkDock; 
    AForm.DragMode := dmAutomatic; 
    AForm.ManualDock(MainPageControl,MainPageControl,alClient); 
    AForm.Caption := 'StackOverFlow'; 
end; 

に変更するとOnMouseイベントは、このように動作を停止するには閉じるボタンを引き起こして任意のドッキングフォームにピックアップしません。

答えて

1

問題は、ページコントロールのDockSiteプロパティを設定していることです(質問には記載されていませんが)。 DockSiteが設定されると、マウスの左ボタンが押された後にドラッグオブジェクトが作成され、マウスがこのオブジェクトによってキャプチャされます(これは、フォームを自動的にドラッグできるように行われます)。したがって、WM_LBUTTONUPのケースTDragObject.WndProcで行われるキャプチャが解放されるまでマウスメッセージを処理するのはこのオブジェクトです。

WndProcをオーバーライドすると、マウスがドラッグオブジェクトによってキャプチャされている間にページコントロールにマウスメッセージが配信されないため、新しいクラスを派生させてメッセージハンドラなどを配置することはできません。マウスをクリックするたびにMsg.hwndが別のウィンドウを指しているので、Application.OnMessageを使用してもうまくいきません。

たとえば、ページコントロールがWM_LBUTTONDOWNを傍受できるようにするには、ある方法または別のサブクラスにあるかどうか、テストを実行して、タブがクリックされている場合はキャプチャを解放します。リンクされた質問に基づく非常に汚れた簡単な例:

type 
    TPageControl = class(comctrls.TPageControl) 
    private 
    procedure WmLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN; 
    end; 

    TMainfrm = class(TForm) 
    .. 

procedure TPageControl.WmLButtonDown(var Msg: TWMLButtonDown); 
var 
    I: Integer; 
begin 
    inherited;      // mouse will be captured here 
    for I := 0 to Length(Mainfrm.FCloseButtonsRect) - 1 do 
    begin 
    if PtInRect(Mainfrm.FCloseButtonsRect[I], SmallPointToPoint(Msg.Pos)) then 
    begin 
     ReleaseCapture;   // and released here 
     Break; 
    end; 
    end; 
end; 
+0

ありがとう - これは私に問題を理解させてくれます。 –

+0

@リチャード - ようこそ! –

関連する問題