簡體   English   中英

在PageControls之間移動TabSheet

[英]Move a TabSheet between PageControls

我目前正在使用Delphi 7。

我有一個主窗體,它具有5個選項卡的PageControl。 我正在尋找一種方法,可以從pagecontrol中“分離”這些選項卡並將它們分別移動到新的表單中,該表單是在運行時創建的。 移動的工作表需要保留其所有組件(按鈕,標簽等),並且其功能與在pagecontrol中仍然保持的位置幾乎相同。

基本上,這種想法是,如果用戶希望同時查看2(或更多)頁面,則他/她可以將該工作表拖出表單區域,並為其創建一個新窗口。 當用戶完成操作后,多余的表單將用X按鈕關閉,工作表將返回到它在pagecontrol中的原始位置。

僅僅是一個額外的挑戰:是否有可能將這種解決方案做成一個單獨的單元,以便可以在運行時調用它“分離”任何控件? (按鈕,編輯,列表框,圖像等)?

謝謝!
托馬斯

此處顯示的方法與您的開始位置有所不同,但可能會接近您的要求。
這個想法是使用一個空的PageControl,在運行時可以在其上調整選項卡的速度。
每個Tab都是基於祖先的自己的表單,此處為TTemplate ,它將為Dockcontrol和Pageindex提供兩個屬性。
ManualDock(PageControl)可用於將其添加到,而ManualDock(nil)可將其從Pagecontrol中刪除。
這里使用CloseQuery對其進行重新定位並恢復PageIndex。
在此示例中,DoubleClick將取消停靠表單。

填充Pagecontrol的示例:

procedure TDemoForm.FormCreate(Sender: TObject);
var
 i:Integer;
begin
  for I := 0 to 9 do
      begin
        With TTemplate.Create(self) do
          begin
            Color := Random(255*255);
            MyDockControl := PageControl1;
            DockTabIndex  := i;
            Ctl3d := false;
            Caption := Format('Tab %d',[i]);
            Show;
          end;
      end;
end;

和模板的草稿:

type
  TTemplate = class(TForm)
    Button1: TButton;
    RadioGroup1: TRadioGroup;
    procedure FormDblClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    FMyDockControl: TWinControl;
    FDockTabIndex: Integer;
    procedure SetMyDockControl(const Value: TWinControl);
    procedure Redock;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Property MyDockControl:TWinControl read FMyDockControl Write SetMyDockControl;
    Property DockTabIndex:Integer read FDockTabIndex write FDockTabIndex;
  end;

var
  Template: TTemplate;

implementation

{$R *.dfm}

procedure TTemplate.Redock;
begin
  if Assigned(MyDockControl) then ManualDock(MyDockControl);
  if MyDockControl is TPageControl then
     TPageControl(MyDockControl).Pages[TPageControl(MyDockControl).ActivePageIndex].PageIndex := DockTabIndex;
end;

procedure TTemplate.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   CanClose := not Assigned(MyDockControl);
   Redock;
end;

在此處輸入圖片說明

  • 將所有控件移到單獨的框架。
  • Frame.DragKind設置為dkDock
  • Frame.DragMode設置為dmAutomatic
  • Form.PageControl.DockSite設置為True
  • 等等。

請參閱C:\\ Program Files \\ Borland \\ Demos \\ Docking中的示例,以獲取有關如何進一步自定義此示例的靈感。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM