重新打开界面时出错(100分)

  • 主题发起人 主题发起人 valiantzhong
  • 开始时间 开始时间
V

valiantzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:
Win2k Server+sp2,Sql Server 2k,delphi 6
数据库连接:ADO
出错情况:
在运行程序时,打开A界面(A含有数据集)后将A界面关闭(form.release),再一次打开A
界面出现以下错误提示:
Project Project2.exe raised exception class EAccessViolation with message'Access
violation at address 004479a7 in module 'project2.exe'.Read of address 40100180'.
Process stopped.Use step or run to continue.
 
关闭的时候资源没释放,
Action := caFree;
form1 := nil;
//****
FreeAndNil(form1);
等等的释放方法
if Assigned(form1) then 重新打开时的判断
 
你在关闭窗体时释放了某个对象,在下一次打开窗体时并没有重新创建它就直接使用,就造
成了这种情况,你仔细检查一下吧。
其实没有必要关闭某个窗体时都要销毁其中的对象,然后每次打开出又重新建立对象,这样
会降低程序的运行效率。如果你希望把程序启动时所需要的时间分摊到各个子窗体打开的时间
上去(加快程序的启动速度),或者希望减少程序运行时所需要占用的资源,这样做也行,
但建议不要采用Form.Release方法,尽量采用Form.Free方法。
procedure TForm1.Button1Click(Sender: TObject);
begin
try
MySubForm := TMySubForm.Create(Application);
MySubForm.ShowModal;
finally
MySubForm.Free;
//MySubForm := nil; //如果你喜欢的话还可以这样做,通常是没有必要的
end;
end;
 
OnClose事件中加入

action:=caFree
 
多人接受答案了。
 
是的,在release form 后没有重新创建 form才导致了这种情况。
后来我尝试了在form.show前加入
Application.CreateForm(TForm3,Form3);{form3为该form}
就可以正常运行了。
不过现在form我都用hide隐藏了,这样有没有什么不利之处?
 
用Hide本身没有什么不妥,它只是隐藏窗体,而不释放任何资源。你要注意:资源的分配与
释放要一致,如果释放后未重新分配就访问,会出现内存地址访问错误,但如果只分配不释
放的话,就会造成内存泄漏(进程占用的内存会越来越多,直到内存耗尽或你结束进程)。
你现在这样看起来就是只分配不释放。
 
后退
顶部