我目前正在使用Delphi 7。
我有一个主窗体,它有一个带有5个标签的PageControl。 我正在寻找一种方法来分离'来自pagecontrol的这些tabheets并将它们单独移动到一个新的表单,即创建运行时。移动的工作表需要保留其所有组件(按钮,标签等),其功能几乎与它在页面控件中的位置相同。
基本上,想法是如果用户想要同时查看2个(或更多)页面,则他/她可以将该表格拖出表单区域,并为其创建新窗口。用户完成后,使用X按钮关闭额外的表单,工作表将返回到页面控件中的原始位置。
只是为了额外的挑战: 是否可以将此解决方案放入一个单独的单元中,以便可以调用它来分离'运行时的任何控件? (按钮,编辑,列表框,图像等)?
谢谢!
托马斯
答案 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;
答案 1 :(得分:1)
Frame.DragKind
设为dkDock
。Frame.DragMode
设为dmAutomatic
。Form.PageControl.DockSite
设为True
。请参阅 C:\ Program Files \ Borland \ Demos \ Docking 中的示例,以获取有关如何进一步自定义此内容的灵感。