读书人

在mainfrm创建内嵌窗体innerfrm后再

发布时间: 2013-07-01 12:33:04 作者: rapoo

在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;

读书人网 >.NET

热点推荐