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