delphi 使用PageControl嵌套显示窗体,需要必须实现两个部分:
1.创建标签页和创建窗体。
2.指定窗体关闭函数,该函数包含关闭当前标签页。
1.创建标签页和创建窗体。
//如果不存在就创建标签页和窗体,如果存在,就找到。
//PFormClass:要创建的窗体的类,CName:窗体的Cption;EName :窗体的Name
procedure TMainForm.CreateTabSheet(PFormClass: TFormClass;CName,EName:string);
const
MyTabSheetFirstName = 'MyTabSheet_';
var
MyForm:TForm;
MyTabSheet : TTabSheet;
MyTabSheetName :string;
begin
MyTabSheetName := MyTabSheetFirstName + EName;
//查找该标签页是否已经存在
MyTabSheet := TTabSheet(self.FindComponent(MyTabSheetName));
//不存在,就创建出新的标签页
if MyTabSheet = nil then
begin
try
//创建新标签页
MyTabSheet := TTabSheet.Create(self);
MyTabSheet.Name := MyTabSheetName;
MyTabSheet.PageControl := pgcMain;
MyTabSheet.Caption := CName;
MyTabSheet.Align := alClient;
//创建窗口
try
MyForm := PFormClass.Create(self);
myform.Name := EName;
MyForm.Parent := MyTabSheet;
MyForm.BorderStyle := bsNone;
MyForm.Top := 0;
MyForm.Left := 0;
MyForm.Width := MyTabSheet.Width;
MyForm.Height := MyTabSheet.Height;
MyForm.Align := alClient;
//关联窗体关闭时,执行的函数。
MyForm.OnClose := CloseTabSheet;
MyForm.Show;
except
FreeAndNil(MyForm);
Abort;
end;
except
FreeAndNil(MyTabSheet);
Exit;
end;
end;
//设置当前的标签页为活动页
pgcMain.ActivePage := MyTabSheet;
end;
2.指定窗体关闭函数,该函数包含关闭当前标签页。
//关闭窗体时,也关闭其所处的标签页
procedure TMainForm.CloseTabSheet(Sender: TObject; var Action: TCloseAction);
begin
if (sender as TForm).Parent <> nil then
begin
TTabSheet((sender as TForm).Parent).free;
//把关闭的标签页的前一页设为活动页
pgcMain.SelectNextPage(false);
abort;
end;
end;
3、右击可以选中当前页
procedure TMainForm.pgcMainMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
tabSheet :TsuiTabSheet;
begin
if mbRight = Button then
begin
pgcMain.ActivePage := pgcMain.Pages[pgcMain.IndexOfTabAt(X, Y)];
end;
end;
// 关闭当前页面
procedure TMainForm.mmiN23Click(Sender: TObject);
begin
if pgcMain.ActivePageIndex <> 0 then
begin
pgcMain.ActivePage.Free;
pgcMain.SelectNextPage(false);
end;
end;
// 关闭所有页面
procedure TMainForm.mmiN24Click(Sender: TObject);
var
i: integer;
begin
for i := 1 to pgcMain.PageCount - 1 do
begin
pgcMain.Pages[1].Free;
end;
end;
// 关闭其他页面
procedure TMainForm.mmiN25Click(Sender: TObject);
var
i, ActiveIndex: integer;
begin
// 当前页面是【首页】,则直接关闭其他页面
if pgcMain.ActivePageIndex = 0 then
begin
for i := 1 to pgcMain.PageCount - 1 do
begin
pgcMain.Pages[1].Free;
end;
end
else
begin
// 关闭当前页面前面的除【首页】的所有页面
for i := 1 to pgcMain.ActivePageIndex - 1 do
begin
pgcMain.Pages[1].Free;
end;
// 关闭当前页面后面的所有页面
for i := 2 to pgcMain.PageCount - 1 do
begin
pgcMain.Pages[2].Free;
end;
pgcMain.ActivePageIndex := 1;
end;
end;