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

FreeAndNil的有关问题

2012-04-05 
FreeAndNil的问题一个frmMain为MDIForm,一个form1为MDIChild,点击frmMain上有一个btn1按钮,btn1的单击事中

FreeAndNil的问题
一个frmMain为MDIForm,一个form1为MDIChild,
点击frmMain上有一个btn1按钮,btn1的单击事中件代码 if Form1=nil then form1:=TForm1.Create(nil); Form1.Show; 
在form1的close事件中代码 FreeAndNil(form1);
form1上有一个btn1按钮,btn1的单击事中件代码 Self.Close; 

frmMain具体代码如下

Delphi(Pascal) code
procedure TfrmMain.btn1Click(Sender: TObject);begin  if Form1=nil then form1:=TForm1.Create(nil);  Form1.Show;end;


form1具体代码如下
Delphi(Pascal) code
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin  FreeAndNil(form1);end;procedure TForm1.btn1Click(Sender: TObject);begin  Self.Close;end;
 


问题是,如果通过单击Form1窗体右上角自带的关闭按钮来关闭窗体,则不报错。
如果通过单击Form1上的btn1按钮来关闭窗体,则报如下错误


为什么两个关闭方法一个正常一个却报错呢?


[解决办法]
再mdiform 里 调用与销毁是 这样的
Delphi(Pascal) code
//主窗体调用  if not Assigned(FrmOrd) then  begin    Application.CreateForm(TFrmOrd, FrmOrd);    FrmOrd.Show;  end;//子窗体销毁procedure FrmOrd.FormClose(Sender: TObject; var Action: TCloseAction);begin  Action := caFree;  FrmOrd:= nil;end;
[解决办法]
试了一下,问题出在TForm1.Create(nil)把它改为TForm1.Create(Application);至于为什么会报错不太清楚,建议楼主用D自带的MDI APP生成一个试一下,在New->Others->Projects里面就有MDI Application,里面在创建MDI Child的时候Owner也是设置为Application。另外个人觉得在Close里面用FreeAndNil(form1);去释放对象的方式感觉不太好,FreeAndNil一般是在外部调用的,很少在类内部使用。
[解决办法]
Assigned 这个不知道吗 ?

相当于nil 判断
[解决办法]
我是在D7下测试的,要不你把你的工程打包上传到CSDN,可能跟你的某些设置也有关系,或者按照我跟你说的用自带的MDI APP试一下。
[解决办法]
CSDN就可以,在我的社区,我的资源里面,你把积分设置为0就行了,这样下载就不用积分了。
[解决办法]
奇怪了,在我这里测试完全没有问题的。
[解决办法]
在D7测试的,你用的也是D7吧

热点排行