要调用的时候: if not Assigned(Form2) then Application.CreateForm(TForm2, Form2);在Form2.OnClose事件里面: Action := caFree;在Form2.OnDestroy事件里面: Self := nil; Application.Terminate当然会关闭整个程序,因为这句话就是干这个的。
程序运行时,只显示Form1,而Form2、Form3不但不显示,而且不占用内存。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~所有窗体为非自动创建,用时才创建,用过后(关闭窗体后)马上释放窗体。如果想实现记忆上次打开的窗口上的一些控件内容,可以在关闭(释放前)窗体时保存到ini文件,下次打开(创建)窗体时再读取那个ini文件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1、设置非主窗体为非自动创建;2、打开窗口用如下方式: if not Assigned(Form1) then begin Form1:=TForm1.Create(nil); end; Form1.ShowModal; end;3、Form1的FormClose、FormDestroy属性设置如下: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end;procedure TForm1.FormDestroy(Sender: TObject); begin Form1:=nil; end;
free(form1);
form2.show;
form2.ShowModal;按此操作。
form2.ShowModal;按此操作。
form2.ShowModal;按此操作。
楼上的答案全部都是正确的~楼主基础太差,根本没有理解意思,建议看基础书籍,或者找朋友现场讲解一下!这里只说一下,你概念理解的有问题,你把“动态窗体”和“动态创建窗体”混淆在一块了。delphi里面就没有“动态窗体”这个概念的,其它网友告诉你,是要“动态创建窗体”!这是相对于delphi默认会“自动创建窗体”来说的。
请教下改如何释放窗体比较好呢?Form2.Free?
Form2.Destroy?或是其它呢? 我很奇怪为什么多次创建释放之后果真出现了你所说的错误。Application.Terminate; 这一句会关闭整个程序,如果要关闭单个窗体可行不?
if not Assigned(Form2) then
Application.CreateForm(TForm2, Form2);在Form2.OnClose事件里面:
Action := caFree;在Form2.OnDestroy事件里面:
Self := nil;
Application.Terminate当然会关闭整个程序,因为这句话就是干这个的。
呵呵~我发现21楼提供的代码在释放窗体的时候不会报错,但是同时也有一个问题。比如说我现在在Form2,然后我调用Form3,我按你说的做了,一切很好很和谐。可是,但我要关闭Form3,重新显示Form2时,问题就来了。 我的代码里面有
Form3.Hide;
Form2.Show;
写在FormCloseQuery里面。原本不动态创建窗体,那就在我点击关闭时会显示回Form2,可是现在则是直接关闭整个程序。我尝试添加一句Abort;,可是这样就不会执行OnClose和OnDestroy。跪求改进方法。
你的Application的dpr文件里面创建的第一个可视窗体会被认为是主窗体,例如Form1。Form1还没有被关闭掉的话,你动态创建和释放Form2,Form3...是不会关闭程序的。并且一般来说,主窗体应该是始终不会被关闭的。
1、设置非主窗体为非自动创建;2、打开窗口用如下方式:
if not Assigned(Form1) then
begin
Form1:=TForm1.Create(nil);
end;
Form1.ShowModal;
end;3、Form1的FormClose、FormDestroy属性设置如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil;
end;
可是现在情况是特殊的…… 请问能否在 动态创建的Form1关闭后,在Form2中写上:
Form1.Action:=caFree;
Form1:=nil;
procedure TMainForm.ShowForm(FormClass: TFormClass);
begin
With FormClass.Create(Self) do
try
ShowModal;
finally
Free;
end;
end;