Переместить 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, чтобы узнать, как настроить его дальше.