一、///////// 在FrmMain中动态创建Frm2窗体
procedure TFrmMain.***(***);
beginFrm2:=TFrm2.Create(application);with frm2 do
begin
//.........
endif 某种错误 then
frm2.free; // 就是不要Frm2显示出来,这样释放对吗?要再用Destroy吗?
else // 如果没错则将Frm2显示出来
Frm2.Show;
self.Hide;
end;////////////////////Frm2的CLose中Destroy
procedure TFrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FrmMain.Show;
self.Destroy;
end;这样对吗? 要先Frm2.Free吗?
二、///////// 另外一种以模态框形式显示出来procedure ShowForm(FormClass: TFormClass):integer;
begin
With FormClass.Create(Application) do
try
ShowModal;
finally
Free; // 这个不明白,finally后面跟的是不是不管Try部分
end;
result:=**
end; // Free;
// 这个不明白,finally后面跟的是不是不管Try部分是否正常执行,都会运行?
那如果不管Try对否都运行Free部分的话,那result:=** 不是都不会执行了吗?
还是我Free理解有错,Free跟Destroy到底啥区别?谢谢
procedure TFrmMain.***(***);
beginFrm2:=TFrm2.Create(application);with frm2 do
begin
//.........
endif 某种错误 then
frm2.free; // 就是不要Frm2显示出来,这样释放对吗?要再用Destroy吗?
else // 如果没错则将Frm2显示出来
Frm2.Show;
self.Hide;
end;////////////////////Frm2的CLose中Destroy
procedure TFrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FrmMain.Show;
self.Destroy;
end;这样对吗? 要先Frm2.Free吗?
二、///////// 另外一种以模态框形式显示出来procedure ShowForm(FormClass: TFormClass):integer;
begin
With FormClass.Create(Application) do
try
ShowModal;
finally
Free; // 这个不明白,finally后面跟的是不是不管Try部分
end;
result:=**
end; // Free;
// 这个不明白,finally后面跟的是不是不管Try部分是否正常执行,都会运行?
那如果不管Try对否都运行Free部分的话,那result:=** 不是都不会执行了吗?
还是我Free理解有错,Free跟Destroy到底啥区别?谢谢
解决方案 »
- 怎么判断cxgrid当前选中的是哪列
- 自动关闭对话框的问题!
- ActiveX控件如何关闭加载它的Form窗体
- 函数调用问题
- 求助算法,急????/
- QReport的哪个控件能够显示过长字符串的时候自动折行?QRMemo不行啊!!
- 我要用TREEVIEW显示数据库中的数据,怎么给每一个TREENODE的data 添加 数据
- 自己写的、自己经常用的一个编程时用的小工具,感兴趣自己去拿哦。 http://www.csdn.net/cnshare/soft/14/14606.shtm
- 谁能告诉我两个DBEdit关联的问题
- 关于WSAWaitForMultipleEvents(winsock2API)函数的问题,急,急,急!!!
- Delphi中Memo组件的光标定位(用的是Delphi7.0)--希望大家能帮我看看
- 怎麼系統所有自動加載的窗體在 Create 後都自動 Show 出來了, 原先只有主窗體顯示的丫.
我记得时这样的吧!
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end; finally后面跟的不管Try部分是否正常执行,都会运行.
finally
end;
就算在try中出现异常,finally里的代码都会执行。
所以在try里绝对不能free;至于你的result这句肯定会执行的,只要你不访问前面一个form里的东西。
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
我记得时这样的吧!==
try
ShowModal;
finally
Free;
那为什么这里还要Free?procedure TFrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FrmMain.Show;
self.Destroy;
end;
那就是说是不是不用 在Close时加这句 self.Destroy; ??越来越不明白了。。是不是动态创建以后,就不用管它了,不用去Destroy,也不用去Free??
那下回再用到那个窗体是不是直接Show就好了? 它还在吗?
如果在auto-create forms那么在project->viewsource看到 Application.CreateForm(TForm1, Form1);这是自动创建了;如果available forms那你需要动态创建
try
fm1 := Tform1.Create(nil);
showmodal;
finally
FreeAndnil(fm1);
end;
try
Application.CreateForm(TFrmTemp,FrmTemp);
FrmTemp.ShowModal;
finally
FreeAndNil(FrmTemp);
end;
2、Close是关闭窗体,就是不显示了(隐藏了),但是这个对象还在,下次你可以调用Show再显示(前提如1),Destroy是释放窗体对象,释放了就不能再Show了,Free功能与Destroy基本相同,但是它会先检测一下自己是不是空指针,不是才会调用Destroy;
3、一般情况下使用Free
procedure TForm1.Button1Click(Sender: TObject);
begin
if form2=nil then
begin
showMessage('frm2 is nil now');
form2:=Tform2.Create(application);
try
form2.ShowModal;
finally
//freeandNil(form2); // freeAndNil 以后才可以再按下Btn
form2.Free; // 若是Free则再次按Btn会出错。。
end; //try
end; //procprocedure TForm1.Button2Click(Sender: TObject);
begin
if form2=nil then
showMessage('frm2 is nil after free')
else
begin
showMessage('frm2 is not nil after free');
form2.ShowModal;
end;end;
1.按下Form1的Btn1,模态显示Form2
2.按Form2的Cancel按钮关闭
3.按下From1的Btn2
结果: 若Btn1Click的程序中用的是 Finally form2.Free; 则到第3步会出错,显示完“'frm2 is not nil after free'”后,就出错了而若 若Btn1Click的程序中用的是 Finally FreeAndNil(form2),则第3步显示完 'frm2 is nil after free'后,还可以再显示Form2我不明白了: 不是说Free就是把窗口释放了吗?为什么还不是为成Nil? 那FreeAndNil和Free又差在哪了?Free功能与Destroy基本相同,但是它会先检测一下自己是不是空指针,不是才会调用Destroy;
==Free不能把窗口变成Nil啊?
我这样写:
procedure TFrm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// freeAndNil(self);
self.destroy;
end;两个都不行,Free应该也不行那要怎么自己将自己Nil掉?
两个部分应该是对应的,所以释放的时候要主要不要只释放了堆里面的对象实例空间而不释放栈中的指针空间....
例如在将一个窗体释放的时候,不应该只将对象释放,如Self.Free
而同时应该将指针进行释放,所以需要使用FreeAndNil(Self)这个句子”
procedure ShowForm(FormClass: TFormClass):integer;
begin
With FormClass.Create(Application) do
try
ShowModal;
finally
Free; // 这个不明白,finally后面跟的是不是不管Try部分
end;
result:=**
end;那怎么上面这段程序这么流行, 我看书里都这样
都没再Nil的,真奇怪。。