Переместить TabSheet между PageControls

Я использую Delphi 7 в настоящее время.

У меня есть основная форма, на ней есть PageControl с 5 вкладками. Я ищу способ "отсоединить" эти таблицы от элемента управления страницы и переместить их по отдельности в новую форму, которая создается во время выполнения. Перемещенный лист должен сохранять все его компоненты (кнопки, метки и т. Д.) И функционировать почти так же, как он все еще был на своем месте в элементе управления страницы.

По сути, идея заключается в том, что если пользователь хочет одновременно просматривать 2 (или более) страницы, он может перетащить этот лист из области формы, и это создаст для него новое окно. Когда пользователь закончил, дополнительная форма закрывается кнопкой X, лист возвращается на свое первоначальное место в элементе управления страницы.

И только для дополнительной задачи: возможно ли сделать это решение отдельным устройством, чтобы его можно было вызывать для отсоединения любых элементов управления во время выполнения? (кнопки, правки, списки, изображения и т. д.)?

Спасибо!
Томас

2 ответа

Решение

Подход, показанный здесь, отличается от вашего исходного положения, но может соответствовать вашим требованиям.
Идея состоит в том, чтобы использовать пустой PageControl, на котором вкладки перемещаются во время выполнения.
Каждая вкладка будет собственной формой, основанной на предке, здесь 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, чтобы узнать, как настроить его дальше.

Другие вопросы по тегам