如何将关闭后的窗体从内存中清除?(100分)

  • 主题发起人 主题发起人 K
  • 开始时间 开始时间
K

K

Unregistered / Unconfirmed
GUEST, unregistred user!
我编了一个程序有8个窗体,
主窗体在Project Options中Forms页设在Auto-create forms:列表框中,
其他7个窗体都在Available forms:列表框中.
当我不退出主程序并多次打开这7个窗体时总是出错:
Project wy.exe raised exception class
EAccessViolation with message 'Access violation at
address 00000009. Write of address 98AA870A',Process
stopped. Use Setp or Run to continue.
是不是我每次打开的窗口没有从内存中清掉造成的.
主单元程序:
program wy;
uses
Forms,
krk in 'krk.pas' {wyFormrk},
booknaem in 'booknaem.pas' {Formbook},
booklb in 'booklb.pas' {Formlb},
ksz in 'ksz.pas' {Formkh},
kdb in 'kdb.pas' {Formdb},
sm in 'sm.pas' {Formabout},
hz in 'hz.pas' {wyFormhz},
wyt in 'wyt.pas' {wyFormmain};
{$R *.RES}
begin
Application.Initialize;
Application.Title := '图书账务软件';
Application.CreateForm(TwyFormmain, wyFormmain);
Application.Run;
end.
我在程序中每个窗口都是这样打开的:
procedure TwyFormmain.N15Click(Sender: TObject);
begin
wyformhz:=Twyformhz.Create(application);
wyformhz.Show;

end;
当关闭时:
procedure TwyFormrk.SpeedButton3Click(Sender: TObject);
begin
close;
end;
procedure TwyFormmain.FormClose(Sender: TObject;
var Action: TCloseAction);
begin

wyformmain.free;
end;
请大侠帮助,我应当怎样做。
 
在每个窗口的OnClose事件中Free掉自身
 
问题在于myFormMain.pas应在其它过程的前头.
Uses
Forms,
wyt in 'wyt.pas' {wyFormmain}, <<------------
krk in 'krk.pas' {wyFormrk},
booknaem in 'booknaem.pas' {Formbook},
booklb in 'booklb.pas' {Formlb},
ksz in 'ksz.pas' {Formkh},
kdb in 'kdb.pas' {Formdb},
sm in 'sm.pas' {Formabout},
hz in 'hz.pas' {wyFormhz};
{
若不行,应在Unit单元选项中进行适当的位置调整!
 
if form1<>nil then
form1:=nil
form1:=TForm1.Create(self)
form1.show
onclose:action:=caFree
ondestroy: form1:=nil
 
procedure TwyFormmain.FormClose(Sender: TObject;
var Action: TCloseAction);
begin

//wyformmain.free;--->
Action:=caFree;//窗体就会自动释放,你可跟踪一下,为caFree 执行onDestroy
//说明窗体释放
end;
 
这样:

procedure TwyFormmain.N15Click(Sender: TObject);
begin
wyformhz:=Twyformhz.Create(application);
wyformhz.ShowModal;
wyformhz.free;

end;

我以前也出现过类似的问题,改成这样后就全OK啦!
 
churchill,Jams,Nose,okmy,面条 多谢各位的帮助五位大侠的方法我都有
试过了可错误信息还有。请问还有别的方法吗?
 
在你的 MAINFORM中
TMAINFORM.BUTTON1CLICK(SENDER:TOBJECT);
begin
APPLICATION.CREATEFORM(TTEST,TEST);
TEST.SHOW;
end;

在TEST FORM 中
TEST.FORMCLOSE(SENDER:TOBJECT);
begin
TEST.RELEASE;
end;
 
在TEST FORM 中
TEST.BUTTON2CLICK(SENDER:TOBJECT);
begin
TEST.CLOSE;
end;
 
呵呵,没试过,不晓得对象自己是否可以free自己:-) 不过我估计PASCAL可以的。
如果不可以,那么就要找application.onmessage了。
 
我在我目前的程序中就是这样用.可以的.
 
用 Action:=caFree 是正确的,可能是你写错程序了吧。看你写的就有点儿乱。
我想TwyFormmain就是主窗体吧。

procedure TwyFormmain.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
wyformmain.free;
end;

换成
//注意不是:TwyFormmain.FormClose
procedure Twyformhz.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;

不行的话,下次我倒贴分给你.
面条的方法也可以,不过ShowModal以后,在它关闭之前就不能换到其他窗体了。
 
Nose onedolph用了你俩的方法问题解决了,十分感谢。
wyformmain.free;换成Action:=caFree;
这两个有什么区别吧?请大侠能否给解释一下,谢谢。
 
TwyFormmain.FormClose时,整个应用程序将被Terminated.所以
主窗体Close时,Action:=caFree;
是没有意义的。
你可能对类与对象的关系不太熟。
wyformmain 是 Twyformmain 的一个实例(对象),wyformmain.Free 只不过是
wyformmain 这一个对象的Free,而不是所有Twyformmain的对象的Free,
用Action:=caFree就可以保证所有Twyformmain的对象在Close时Free。
如果没有定义
var
wyformmain:Twyformmain;(在每个Unit的implementation语句之前都有类似的)
你的程序肯定出错,连编译都通不过。
所以,我一般都不直接用wyformmain之类的东西。
 
请问wyformhz是在哪儿定义的?是全局量吗?
用Application.CreateForm(TComponentClass;
var Reference);
创建窗口。
 
new 一个窗体,看它的unit1.pas,你就会看见
var
Form1:TFrom1;
如果不是全局变量,
Application.CreateForm(TForm1;Form1);能成吗?
 
多谢各位大侠.
 
后退
顶部