在程序启动时,自动创建窗体和手动创建窗体有什么不同?
我有一个窗体,如果默认的情况下,在delphi中的项目中会有:
application.createForm(TForm2,form2);
application.run;我不想让他自己创建窗体,于是我把 application.createForm(TForm2,form2);
给删掉了,当然from2中有大量的业务逻辑,也有调用我自己写的函数,函数中有的参数传递的是vcl的对象。
在form1的一个按钮中,我写如下代码:
var
obj:TForm2;
begin
obj:=TForm2.create(self);
obj.show;
end;在我执行form2种的一个查询时,出现03C........地址不能读。
我有把创建窗体的代码改称了如下: var
obj:TForm2;
begin
application.createForm(TForm2,obj);
obj.show;
end;
还是同样的问题:
请问各位师兄,自动创建窗体和手动创建窗体有什么不同?application.createForm和TForm2.create有什么不同?end;
我有一个窗体,如果默认的情况下,在delphi中的项目中会有:
application.createForm(TForm2,form2);
application.run;我不想让他自己创建窗体,于是我把 application.createForm(TForm2,form2);
给删掉了,当然from2中有大量的业务逻辑,也有调用我自己写的函数,函数中有的参数传递的是vcl的对象。
在form1的一个按钮中,我写如下代码:
var
obj:TForm2;
begin
obj:=TForm2.create(self);
obj.show;
end;在我执行form2种的一个查询时,出现03C........地址不能读。
我有把创建窗体的代码改称了如下: var
obj:TForm2;
begin
application.createForm(TForm2,obj);
obj.show;
end;
还是同样的问题:
请问各位师兄,自动创建窗体和手动创建窗体有什么不同?application.createForm和TForm2.create有什么不同?end;
With Form2 do
Try
ShowModal;
Finally
Free;
Form2:=Nil;
End;
還是用原來的
application.createForm(TForm2,form2);去掉
var
obj:TForm2;
聲明!應該就好了!估計你的代碼中用了Form2這個變量, 但你實例化的是 obj, 所以出錯
var
obj:TForm2;
这句是肯定的去掉了。
var
Form1:TForm;
begin
Form1:=TForm.Create(Application);
Form.Show;
end;
引用以后,可以通过变量名直接访问;
如果手动创建的话,在你调用CREATE给FORM分配内存前,是不能调用的;
而且你CREATE 以后,自己要FREE,不然容易内存溢出;而且如 yq3woaini(hahhajing(一星奋斗中...)) 所说,窗口多的话,最好手动创建;不然程序启动慢,而且吃内存;
去掉var那样只是选择自动创建罢了
跟楼主的问题一点关系都没有,
人家问的是具体的实现细节的差异
这里还有高人马?
一般在情况下能够使用手动创建的尽量手动创建,这样可以节省系统资源,提升系统运行效率。
你所提的这个问题,应该是出在两个方面:
1:你既然用
var
obj:TForm2;
begin
obj:=TForm2.create(self);
obj.show;
end;这段代码创建窗体,那么首先应该将DELPHI的Project-》Options->Froms对话框中将窗口Form2从自动创建列表中移掉,然后将TForm2所在单元中有个
var
Form2 :TForm2;这句全局变量的声明也移调,而且应该将obj改为Form2.你的这个做法在理论上其实应该是通的过的,但是VCL有他自己的一些特征,不允许你这么做,除非你明确指定
你所创建的obj上的所有可视化空间的属主和双亲。
还有如果你用的是show的方法将这个窗体显示出来的话,你至少应该在这个窗体的OnClose事件中将传递近来的Action参数的值赋为caFree让此窗体在关闭之后自动销毁他所使用的一切资源,否则就会内存泄露了。
obj:TForm2;
begin
obj:=TForm2.create(self);
obj.show;
end;2. var
obj:TForm2;
begin
obj:=TForm2.create(nil);
obj.show;
end;3. var
obj:TForm2;
begin
obj:=TForm2.create(Application);
obj.show;
end;建议使用第3种,这样最安全
这样的话,在unit2中的var form2:tform;后面声明的变量(implements和过程中声明的变量不算)
例如Form1是主窗体,要手动创建Form2的话,就在Form1的按钮中填入:
begin
Form2 := TForm2.Create(Form1);
form2.show;
end;
即可
其实就是
obj := TForm2.Create(Application);
他们是同一个意思!
而且 Close 不等同与 Free ,所以最好是需要窗体的时候才 Create ,用完了就 Free 掉。否则,全部窗体都自动创建的话,程序启动的时候会变很慢,而且内存消耗很厉害,但是大部分内存空间都是闲置的。
obj:TForm2;
begin
obj:=TForm2.create(nil);//这样看看呢?
obj.show;
end;我一般是这样的