在PageControls之间移动TabSheet

时间:2014-11-13 13:11:32

标签: delphi tpagecontrol ttabsheet

我目前正在使用Delphi 7。

我有一个主窗体,它有一个带有5个标签的PageControl。 我正在寻找一种方法来分离'来自pagecontrol的这些tabheets并将它们单独移动到一个新的表单,即创建运行时。移动的工作表需要保留其所有组件(按钮,标签等),其功能几乎与它在页面控件中的位置相同。

基本上,想法是如果用户想要同时查看2个(或更多)页面,则他/她可以将该表格拖出表单区域,并为其创建新窗口。用户完成后,使用X按钮关闭额外的表单,工作表将返回到页面控件中的原始位置。

只是为了额外的挑战: 是否可以将此解决方案放入一个单独的单元中,以便可以调用它来分离'运行时的任何控件? (按钮,编辑,列表框,图像等)?

谢谢!
托马斯

2 个答案:

答案 0 :(得分:3)

此处显示的方法与您的起始位置不同,但可能接近您的要求 我们的想法是使用一个空的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;

enter image description here

答案 1 :(得分:1)

  • 将所有控件移动到单独的Frame。
  • Frame.DragKind设为dkDock
  • Frame.DragMode设为dmAutomatic
  • Form.PageControl.DockSite设为True
  • Etvoilá。

请参阅 C:\ Program Files \ Borland \ Demos \ Docking 中的示例,以获取有关如何进一步自定义此内容的灵感。