1

ここで提供されている例を使用して TPageControl の TTabsheet に閉じるボタンを実装し、キャプションが一致するタブ シートにフォームの親を設定する方法を組み合わせて、TTabSheet として添付されたフォームでページ コントロールを取得し、閉じるボタンと画像を追加することができました今日の Web ブラウザで見られるような画像リストです。

私が変わるとき

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 イベントは、ドッキングされたフォームで検出されないため、閉じるボタンが機能しなくなります。

4

1 に答える 1

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;
于 2011-12-02T22:21:17.607 に答える