http://expert.csdn.net/Expert/topic/2508/2508034.xml?temp=.4569818 改了一下,效果不好,具体原因如下; if TabSheet1.DockClientCount > 0 then for i := 0 to TabSheet1.DockClientCount - 1 do begin (TabSheet1.DockClients[i] as TForm).Close; TabSheet1.DockClients[i].Free; end; //打开Form try Application.CreateForm(TForm2, Form2); Form2.Dock(TabSheet1, BoundsRect); //第二个参数我现在还没有搞清楚是怎么回事,身成的Form不在TabSheet1的中间,而且不知道为什么TabSheet1没有DockSite属性,上面的帖子中是通过设置Panel1的DockSite属性达到满意效果的,楼主如果解决了这个问题,麻烦告诉一声,给我个短消息 Form2.Show; except Form2.Free; end;
现在改好了,下面的代码实现的功能:Form1中的PageControl1上如果没有Form2对应的TTabSheet就生成一个Caption为Form2的TTabSheet。 //////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin //如果已经存在就退出 for i := 0 to PageControl1.ControlCount - 1 do if (PageControl1.Controls[i] as TTabSheet).Caption = 'Form2' then Exit; //打开Form try Application.CreateForm(TForm2, Form2); Form2.ManualDock(PageControl1, nil, alClient); Form2.Show; except Form2.Free; end; end; ///////////////////////////////////////////////////// 在Form1中添加PageControl1: TPageControl;Button1: TButton;两个控件,New一个Form2,在Unit1中Uses Unit2,然后运行即可看到效果,不需要设置任何属性。
再改一下: /////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin //如果已经存在就退出 for i := 0 to PageControl1.PageCount - 1 do if PageControl1.Pages[i].Caption = 'Form2' then//这里直接用Page Exit; //打开Form try Application.CreateForm(TForm2, Form2); Form2.ManualDock(PageControl1, nil, alClient); Form2.Show; except Form2.Free; end; end;
if PageControl1.Pages[i].Caption = 'Form2' then//这里直接用Page //////////////////////////////////////////////////////改为 if PageControl1.Pages[i].Caption = Form2.Caption then
改了一下,效果不好,具体原因如下;
if TabSheet1.DockClientCount > 0 then
for i := 0 to TabSheet1.DockClientCount - 1 do
begin
(TabSheet1.DockClients[i] as TForm).Close;
TabSheet1.DockClients[i].Free;
end;
//打开Form
try
Application.CreateForm(TForm2, Form2);
Form2.Dock(TabSheet1, BoundsRect);
//第二个参数我现在还没有搞清楚是怎么回事,身成的Form不在TabSheet1的中间,而且不知道为什么TabSheet1没有DockSite属性,上面的帖子中是通过设置Panel1的DockSite属性达到满意效果的,楼主如果解决了这个问题,麻烦告诉一声,给我个短消息
Form2.Show;
except
Form2.Free;
end;
////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
//如果已经存在就退出
for i := 0 to PageControl1.ControlCount - 1 do
if (PageControl1.Controls[i] as TTabSheet).Caption = 'Form2' then
Exit;
//打开Form
try
Application.CreateForm(TForm2, Form2);
Form2.ManualDock(PageControl1, nil, alClient);
Form2.Show;
except
Form2.Free;
end;
end;
/////////////////////////////////////////////////////
在Form1中添加PageControl1: TPageControl;Button1: TButton;两个控件,New一个Form2,在Unit1中Uses Unit2,然后运行即可看到效果,不需要设置任何属性。
///////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
//如果已经存在就退出
for i := 0 to PageControl1.PageCount - 1 do
if PageControl1.Pages[i].Caption = 'Form2' then//这里直接用Page
Exit;
//打开Form
try
Application.CreateForm(TForm2, Form2);
Form2.ManualDock(PageControl1, nil, alClient);
Form2.Show;
except
Form2.Free;
end;
end;
//////////////////////////////////////////////////////改为
if PageControl1.Pages[i].Caption = Form2.Caption then
frmSearch := TfrmSearch.Create(Application);
AddPage(frmSearch);
procedure TfrmMain.AddPage(Child: TForm);
var
TabSheet: TdxTabSheet;
ChildData: TChildData;
begin
Child.WindowState:=wsMaximized;
ChildData:=TChildData.Create;
ChildData.Form:=Child;
ChildData.OnActivateEvent:=Child.OnActivate;
ChildData.OnDestroyEvent:=Child.OnDestroy;
ChildList.Add(ChildData);
Child.OnActivate:=OnChildActivate;
Child.OnDestroy:=OnChildDestroy;
TabSheet:=TdxTabSheet.Create(Self);
TabSheet.PageControl:=Pages;
TabSheet.Caption:=Child.Caption;
Pages.ActivePage:=TabSheet;
end;
谢谢!
...
TabSheet:=TdxTabSheet.Create(Self);
TabSheet.PageControl:=Pages;
TabSheet.Caption:=Child.Caption;
Child.Position := poDefault;
Child.Dock(TabSheet, BoundsRect);
Pages.ActivePage:=TabSheet;
如果方便请发送邮件:[email protected].