我想实现在菜单中点一个窗体,就显示在主界面的一个pagecontrol上,打开的窗体全部显示在pagecontrol上,每个form都有一个关闭按钮,通过关闭按钮关闭创建的tabsheet,我实现了加到pagecontrol上,但关闭老是报错,
1.创建pagecontrol的tabsheet,然后在它上边创建打开的form
procedure TfrmMain.CreateTabSheet( myFormClass: TFormClass;var Reference: TForm);
var
MyForm : TForm;
begin
tabsheet := TRzTabSheet.Create(RpgcMain);
try
tabsheet.Caption := Reference.Caption;
tabsheet.PageControl := RpgcMain;
tabsheet.Name := stabsheetname;
MyForm := myFormClass.Create(tabsheet);
try
MyForm.Parent := tabsheet;
MyForm.BorderStyle := bsnone;
MyForm.WindowState := wsmaximized;
RpgcMain.ActivePage := tabsheet;
MyForm.Show;
except
FreeAndNil(MyForm);
end;
except
FreeAndNil(tabsheet);
end;
end;
2.在主界面中写的关闭tabsheet方法,在各个form上都有一个关闭按钮,调用该方法
procedure TfrmMain.FreePageControl(pageindex:Integer);
var
ncount : Integer;
begin
ncount := Self.RpgcMain.PageCount;
if ncount > 0 then
begin
Self.RpgcMain.Pages[pageindex].Free;
if ncount > 1 then
Self.RpgcMain.ActivePageIndex := ncount - 2
else
Self.RpgcMain.Visible := False;
end;
end;
哪位兄弟晓得为啥,我搞了几天了,没找到问题在哪儿
1.创建pagecontrol的tabsheet,然后在它上边创建打开的form
procedure TfrmMain.CreateTabSheet( myFormClass: TFormClass;var Reference: TForm);
var
MyForm : TForm;
begin
tabsheet := TRzTabSheet.Create(RpgcMain);
try
tabsheet.Caption := Reference.Caption;
tabsheet.PageControl := RpgcMain;
tabsheet.Name := stabsheetname;
MyForm := myFormClass.Create(tabsheet);
try
MyForm.Parent := tabsheet;
MyForm.BorderStyle := bsnone;
MyForm.WindowState := wsmaximized;
RpgcMain.ActivePage := tabsheet;
MyForm.Show;
except
FreeAndNil(MyForm);
end;
except
FreeAndNil(tabsheet);
end;
end;
2.在主界面中写的关闭tabsheet方法,在各个form上都有一个关闭按钮,调用该方法
procedure TfrmMain.FreePageControl(pageindex:Integer);
var
ncount : Integer;
begin
ncount := Self.RpgcMain.PageCount;
if ncount > 0 then
begin
Self.RpgcMain.Pages[pageindex].Free;
if ncount > 1 then
Self.RpgcMain.ActivePageIndex := ncount - 2
else
Self.RpgcMain.Visible := False;
end;
end;
哪位兄弟晓得为啥,我搞了几天了,没找到问题在哪儿
for i:=pagecontrol1.pagecount-1 downto 0 do
begin
pagecontrol1.Pages[i].Free;
end;
再试试吧。
從上面的分析看,你不應該在子窗體裏面做這個釋放動作(釋放tabsheet),應該交給主窗體來控制(可以通過消息,子窗體釋放時,發消息給主窗,告訴它,子窗體要釋放了;注意發消息給主窗時,用postmessage比較安全)
2、子窗體:
Event --can be OnDestroy:
PostMessage(主窗體.handle,IamFree,0,0);
3、主窗體定義一個處理iamfree消息的函數,比如:procedure FreeTabSheet(var Message : TMessage);message IAMFREE
具體實現,你直接判斷,當前哪個頁面是active,就free了