首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

在mainfrm创建内嵌窗体innerfrm后,再在mainfrm操作报内存异常

2013-07-01 
在mainfrm创建内嵌窗体innerfrm后,再在mainfrm操作报内存错误这个是unit UPublicMethods公共单元的方法:p

在mainfrm创建内嵌窗体innerfrm后,再在mainfrm操作报内存错误
这个是unit UPublicMethods;公共单元的方法:

procedure OpenInsetFrm(Frm: TForm; FrmClass: TFormClass; Onwer: TWinControl);
var
  I: Integer;
begin
  if Onwer.ComponentCount > 0 then
  begin
    for I := Onwer.ComponentCount - 1 to 0 do
      TForm(Onwer.Components[I]).Free;
  end;
  Frm := FrmClass.Create(Onwer);
  with Frm do
  begin
    BorderStyle := bsNone;
    WindowState := wsMaximized;
    Parent := Onwer;
//    Show;
  end;
end;


mainfrm调用这个方法:
uses UForeignerManagementFrm, UAbroadManagementFrm, UPublicMethods;

var
  Frm_ForeignerManagement: Tfrm_ForeignManagement;
  Frm_AbroadManagement: Tfrm_AbroadManagement;

procedure TMainFrm.btn_AbroadManagementFrmClick(Sender: TObject);
begin
  UPublicMethods.OpenInsetFrm(Frm_AbroadManagement, Tfrm_AbroadManagement, pnl_Frm);
  Frm_AbroadManagement.IsAdd := True;
  Frm_AbroadManagement.Show;
end;


在公共方法里对窗体操作没有异常,但在mainfrm里对窗体操作就内存错误,我需要往innerfrm里传递参数,请问哪里错了呢
[解决办法]
如果你的Mainform里的pnl里有很多控件有可能报错。
procedure OpenInsetFrm(Frm: TForm; FrmClass: TFormClass; Onwer: TWinControl);
var
  I: Integer;
begin
  if Onwer.ComponentCount > 0 then
  begin
    for I := Onwer.ComponentCount - 1 to 0 do
      TForm(Onwer.Components[I]).Free;
  end;
  Frm := FrmClass.Create(Onwer);
  with Frm do
  begin
    BorderStyle := bsNone;
    WindowState := wsMaximized;
    Parent := Onwer;
//    Show;
  end;
end;

这个方法要改一下,才行:
procedure OpenInsetFrm(Frm: TForm; FrmClass: TFormClass; Onwer: TWinControl);
var
  I: Integer;
begin
  if Onwer.ComponentCount > 0 then
  begin
    for I := Onwer.ComponentCount - 1 to 0 do
      Onwer.Components[I].Free; //直接释放好了,如果你转成TForm的话有可能出问题,因为此Component[i]有可能不是TForm类
  end;
  Frm := FrmClass.Create(Onwer);
  with Frm do
  begin
    BorderStyle := bsNone;
    WindowState := wsMaximized;
    Parent := Onwer;
//    Show;


  end;
end;

热点排行