if not assigned(FormX) then //FormX is the Form you want to create FormX:=TFormX.create(self); try FormX.showmodal; finally FreeAndNil(Formx) end; 上面的是模式化显示窗体下面的是非模式化显示窗体: if not assigned(FormX) then //FormX is the Form you want to create FormX:=TFormX.create(self); FormX.show;然后在FormX的onclose事件中加入: action:=cafree; ondestroy事件中加入:FormX:=nil;
答楼上: Use Release to destroy the form and free its associated memory.Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error.所以对于窗体尤其是非模式化的子窗体用release好一点。
关于 wujunwei(wujun) 所说的: ---------------------------------- if not assigned(FormX) then //FormX is the Form you want to create FormX:=TFormX.create(self); try FormX.showmodal; finally FreeAndNil(Formx) end; 上面的是模式化显示窗体下面的是非模式化显示窗体: if not assigned(FormX) then //FormX is the Form you want to create FormX:=TFormX.create(self); FormX.show;然后在FormX的onclose事件中加入: action:=cafree; ondestroy事件中加入:FormX:=nil;---------------------------------- 建议改为: with TFormX.create(nil) do begin try showmodal; finally release; end; end; 模式窗体闪现后就要销毁,何必再用一个指针来存储它呢?
我来总结一下DELPHI中所有的FORM和DM(数据)都可以自动或手工创建(例外 主FORM应该让他自动CREATE) 在开发程序中 主FORM一般情况有两种选择:SDI MDI, 主要区别是SID的各个FORM位置是可任意的,MDI的子FORM的位置只能在主FORM的框架之内. 除主FORM外,其它的FORM一般用两种方式CREATE和SHOW 先说CREATE打开PROJECT SOURCE可以看到,所有由系统CREATE的FORM全在里面,而由用户CREATE的不在, 所有由系统CREATE创建的FORM,如果是MDI,在关闭时是不会FREE的,只是最小化到MDI的框架下, 在下次要用时用SHOW方法即可,要FREE的话用楼上一位和方法,用action:=cafree,就可以,不用自己用FREE的;.如果是SID,在关闭(指得是用户按下系统X)只是HIDE了,下次要用的话如果再自己用CREATE就多了,造成MEM泄漏,并且是无法修复的.要再用用就用SHOW/SHOWMODAL方法显示 在用DELPHI设计程序时,建议数据模板(DM)让系统自动CREATE,什么原因不用说了吧.除主FORM外全自己CREATE和FREE; 在这里,如果是自己创建,根据使用的显示方式不同,FREE的方式也不同 如果是SHOWMODAL则如下form1 := Tform1.Create(Application); form1.ShowModal(); form1.Free();//在此可直接FREE 如果是SHOW方式 则如下 显示 if (form1 = NIL) then //一般用ASSIGNED begin form1 := Tform1.Create(Application); form1.Show(); end else form1.Show(); //不能在创建的事件中FREE释放 释放要在FORM的OnClose action:=cafree;其实如果要SHOW每个FORM前先检测FORM是否已CREATE则不管怎样也不会用MEM泄漏
楼上仁兄总结得不错,不过还有一点 if not assigned(FormX) then begin FormX:=TFormX.create(self); FormX.show; end; if (form1 = NIL) then //一般用ASSIGNED begin form1 := Tform1.Create(Application); form1.Show(); end; 第2种方式要比第1种好么?
Form1:=TForm1.create(self);//这里是分配内存
Form1.showmodal();
Form1.free; //这里是释放内存,如果是Form1.close就不会释放了,等到主窗体关闭才会释放。
另外我还有个问题:当我自己创建了一个窗体Fomr1,在其中的一些edit中输入一些参数,当我把Form1关闭释放后,如果再想读取先前输入的那些参数,该去哪里读呢?因为此时Form1已经释放了啊。而且每次输入参数后都要关闭窗体、释放窗体的阿
Form1:=TForm1.create(self) 这样建立的可以么?
FormX:=TFormX.create(self);
try
FormX.showmodal;
finally
FreeAndNil(Formx)
end;
上面的是模式化显示窗体下面的是非模式化显示窗体:
if not assigned(FormX) then //FormX is the Form you want to create
FormX:=TFormX.create(self);
FormX.show;然后在FormX的onclose事件中加入: action:=cafree;
ondestroy事件中加入:FormX:=nil;
何时使用他们两个?
那个更好点呢?
Use Release to destroy the form and free its associated memory.Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers for the form or its children should use Release instead of Free (Delphi) or delete (C++). Failing to do so can cause a memory access error.所以对于窗体尤其是非模式化的子窗体用release好一点。
⑵,另外想要edit中的参数就只有将参数存到一个全局变量中了,因为你的窗口已经关闭并释放了 ,所以参数是找不到的了。
----------------------------------
if not assigned(FormX) then //FormX is the Form you want to create
FormX:=TFormX.create(self);
try
FormX.showmodal;
finally
FreeAndNil(Formx)
end;
上面的是模式化显示窗体下面的是非模式化显示窗体:
if not assigned(FormX) then //FormX is the Form you want to create
FormX:=TFormX.create(self);
FormX.show;然后在FormX的onclose事件中加入: action:=cafree;
ondestroy事件中加入:FormX:=nil;----------------------------------
建议改为:
with TFormX.create(nil) do
begin
try
showmodal;
finally
release;
end;
end;
模式窗体闪现后就要销毁,何必再用一个指针来存储它呢?
=================================================================================
"我建的一个应用程序大概有15个窗口左右,全部是Delphi自己创建的,没有手动创建。也就是说,当程序一运行,系统就为这些Form分配内存了。但不明白的是地方是,比如在主窗口中用一个按钮事件调用其他Form时,系统使用的内存还要增加" ==================================================================================
希望对这个问题做个解释???
但把它关掉再打开,内存一点儿也没有变化,如是反复的做,内存也没有变化
由此可以推断。楼主肯定是在你调用的窗口的onshow中创建了什么,又没有在窗口关闭的事件中释放掉内存,所以会造成这种情况。
请楼主再检查一下代码。或者你自己再建一工程,什么都不要做,就只调出加一个窗口试试看。
正常现象。
退出按钮中用:
close在释放事件里用
from1.release;
from1:=nil;这样close时自动就释放了
from1:=nil;
这两句的效果不一样么??
大家把你们建立窗体并释放的方法都写出来比较一下吧
在开发程序中 主FORM一般情况有两种选择:SDI MDI, 主要区别是SID的各个FORM位置是可任意的,MDI的子FORM的位置只能在主FORM的框架之内.
除主FORM外,其它的FORM一般用两种方式CREATE和SHOW
先说CREATE打开PROJECT SOURCE可以看到,所有由系统CREATE的FORM全在里面,而由用户CREATE的不在,
所有由系统CREATE创建的FORM,如果是MDI,在关闭时是不会FREE的,只是最小化到MDI的框架下,
在下次要用时用SHOW方法即可,要FREE的话用楼上一位和方法,用action:=cafree,就可以,不用自己用FREE的;.如果是SID,在关闭(指得是用户按下系统X)只是HIDE了,下次要用的话如果再自己用CREATE就多了,造成MEM泄漏,并且是无法修复的.要再用用就用SHOW/SHOWMODAL方法显示
在用DELPHI设计程序时,建议数据模板(DM)让系统自动CREATE,什么原因不用说了吧.除主FORM外全自己CREATE和FREE;
在这里,如果是自己创建,根据使用的显示方式不同,FREE的方式也不同
如果是SHOWMODAL则如下form1 := Tform1.Create(Application);
form1.ShowModal();
form1.Free();//在此可直接FREE
如果是SHOW方式
则如下
显示
if (form1 = NIL) then //一般用ASSIGNED
begin
form1 := Tform1.Create(Application);
form1.Show();
end
else
form1.Show();
//不能在创建的事件中FREE释放
释放要在FORM的OnClose
action:=cafree;其实如果要SHOW每个FORM前先检测FORM是否已CREATE则不管怎样也不会用MEM泄漏
if not assigned(FormX) then
begin
FormX:=TFormX.create(self);
FormX.show;
end;
if (form1 = NIL) then //一般用ASSIGNED
begin
form1 := Tform1.Create(Application);
form1.Show();
end;
第2种方式要比第1种好么?
建议用assigned