2

我目前正在使用 Delphi 7。

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

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

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

谢谢!
托马斯

4

2 回答 2

3

此处显示的方法与您的起始位置不同,但可能接近您的要求。
这个想法是使用一个空的 PageControl,在运行时在其上调整选项卡。
每个 Tab 都是基于祖先的自己的表单,这里TTemplate将为 Dockcontrol 和 Pageindex 提供两个属性。
ManualDock(PageControl)可用于将其添加到ManualDock(nil) Pagecontrol 或从 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;

在此处输入图像描述

于 2014-11-13T15:48:53.533 回答
1
  • 将所有控件移动到单独的框架。
  • 设置Frame.DragKinddkDock
  • 设置Frame.DragModedmAutomatic
  • 设置Form.PageControl.DockSiteTrue
  • 等等瞧。

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

于 2014-11-13T13:21:53.013 回答