我想实现在菜单中点一个窗体,就显示在主界面的一个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.   

    我做了下试验,可能是你的关闭方法有毛病。你先把创建的form.free然后再关闭tabsheet看看。我想是这个原因。
      

  2.   

    你是创建了多个tabsheet吗?
    for i:=pagecontrol1.pagecount-1 downto 0 do
    begin
    pagecontrol1.Pages[i].Free;
    end;
    再试试吧。
      

  3.   

    問題是:你在關閉子窗體時(子窗體還沒銷毀),做了釋放子窗體所在的tabsheet的動作,而你在創建子窗體時MyForm := myFormClass.Create(tabsheet); 傳遞了tabsheet,這就是説,當tabsheet銷毀時,也會去銷毀子窗體。
       從上面的分析看,你不應該在子窗體裏面做這個釋放動作(釋放tabsheet),應該交給主窗體來控制(可以通過消息,子窗體釋放時,發消息給主窗,告訴它,子窗體要釋放了;注意發消息給主窗時,用postmessage比較安全)
      

  4.   

    1、在公用單元定義一個消息:Iamfree = WM_USER + 200;各窗體引用它;
    2、子窗體:
      Event --can be OnDestroy:
        PostMessage(主窗體.handle,IamFree,0,0);
    3、主窗體定義一個處理iamfree消息的函數,比如:procedure FreeTabSheet(var Message : TMessage);message IAMFREE
    具體實現,你直接判斷,當前哪個頁面是active,就free了