怪!怪!怪!Form Free不掉?(100分)

  • 主题发起人 主题发起人 秦浩天
  • 开始时间 开始时间

秦浩天

Unregistered / Unconfirmed
GUEST, unregistred user!
在主表单Form1 中放置 ADOConnect,ADOQuery,Datasource。
用Date Form Wizard建立两表单Form2,Form3(使用DBText不用DBGrid)通
过在程序中用动态SQL 语句分别访问 表 dep:depid ,department 和
stu:stuid name sex。两表单数据源均为Datasource,Form2和Form3
采用动态生成。在Form1中通过 Button1,button可调用Form2和Form3。
当我打开Form2,然后关闭,又去打开Form3 时,出现错误提示:stuid 找不到
而只打开Form2或Form3则不出错,估计是Form2没有真正的Free掉,简要的
程序如下:
Form1中:
Button1Click
ADOQuery.Close;
ADOQuery.SQL.Text:='Select * from dep';
ADOQuery.Open;
Form2 := TForm2.Create(Application);
Form2.showmodal;

Button2Click
ADOQuery.Close;
ADOQuery.SQL.Text:='Select * from stu';
ADOQuery.Open;
Form3 := TForm3.Create(Application);
Form3.showmodal;

Form2的OnClose:
Form2:=nil;
Action:=caFree;

Form3的OnClose:
Form3:=nil;
Action:=caFree;
 
release;
呢?也不行吗?
 
Form1中:
Button1Click
ADOQuery.Close;
ADOQuery.SQL.Text:='Select * from dep';
ADOQuery.Open;
Form2 := TForm2.Create(Application);
Form2.showmodal;
Form2.release;

Button2Click
ADOQuery.Close;
ADOQuery.SQL.Text:='Select * from stu';
ADOQuery.Open;
Form3 := TForm3.Create(Application);
Form3.showmodal;
Form3.release;

试试...
 
帮助上推荐用release代替free
 
我认为nil 应该在ondestroy 中设 比较好,你试试看
 
都试过了还是不行。我想可能是由于两表单使用同一Query和Datasource,
第一表单在关闭时并未真正Free掉,在打开第二表单时相应的字段在另一
表中并不出现所致。
 
Form2,Form3的OnClose里面去掉nil, 自己设置自己为nil是不行的
Form2的OnClose:
<font color=red>XXX</font> Form2:=nil;
Action:=caFree;

Form3的OnClose:
<font color=red>XXX</font> Form3:=nil;
Action:=caFree;
 
老屯说得对,
你应该把它们放在button1和button2的事件中。
如:
form1.button1.onclick:
form2:=Tform2.create(self);
form2.showmodal;
form2.free;
form2:=nil;
 
既然每次都要
Form2 := TForm2.Create(Application);

那么
Form2 := nil; 就毫无意义了。
问题不应该是Form2没释放干净,可能是释放的太多了,先把
Form2简化一下,把没用的先屏蔽起来,
另外,重复调用Form2有没有问题

 

ADOQuery.Close;
ADOQuery.SQL.Text:='Select * from dep';
ADOQuery.Open;
放到OnShow中试试.
 
去掉FORM2,FORM3单元的全局变量,
var
form*:TForm*
,然后,在buttonclick事件中,声明变量
var
form*:TForm*
其它的,不变.
try it.
 
我觉得
Form2:=nil
这种写法十分的不规范,
一般不要这样写.
 
多人接受答案了。
 
后退
顶部