请问一下关于创建Form有几种方法?(20分)

  • 主题发起人 主题发起人 lijun175165721
  • 开始时间 开始时间
L

lijun175165721

Unregistered / Unconfirmed
GUEST, unregistred user!
请问一下关于创建Form有几种方法?
请问以下关于两种不同的创建Form的方法有什么不同?
frmLogon:=TfrmLogon.Create(self);
Application.CreateForm(TfrmLogon,frmLogon);
请大家指点!!!
 
Application.CreateForm(TfrmLogon,frmLogon);
为工程上创建窗体。

frmLogon:=TfrmLogon.Create(self);
可以理解为窗体上创建窗体

两种的调用方法好像不一样。你仔细去比对一下看看。
 
只知道两点不同:
1.Application.CreateForm创建的Form.Parent=Application;
TfrmLogon.Create(self)创建的Form.Parent=当前的对象.
2.Application.CreateForm,如果Application.MainForm为nil,则会将创建的窗口设置为MainForm
这些东西应该看源代码.....
 
路过顺便学习一下
呵呵
 
不同点并不多。wrl_001 讲得差不多了,不过有些出入
CreateForm默认设置窗口的Owner属主为Application ,Owner和Parent不是一回事来着
Owner是指属主,在而Parent是容器
Create;可以指定自己想要的属主,也可以置空。
CreateForm还有一个功能就是会把第一个用CreateForm创建的窗口类设置为程序的主窗口即MainForm;

procedure TApplication.CreateForm(InstanceClass: TComponentClass
var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
看一下源代码就知道了。
还有TMyForm.Create(Self)和Create(nil)有很大的不同。在指定属主的情况下,属主会管理其对象的生死,即Self在释放的时候也会释放TMyForm实例。这样就不会造成内在泄露。
不过会带来一点点的性能消耗,如果是须要大量创建的对象还是指定Nil属主,然后自己管理其生死的好。
 
Application.CreateForm 一般让系统来为你创建

自己程序还是用 TFrom.Create() 好了。方便自己处理。
 
自己用api来创建窗体,但很少有人会这么笨
 
谢谢大家的回答!
 
不同方式创建的Form,它的生命周期是怎么样的呀?
有时候用Assigned()函数来判断的时候,并不能真正的判断它是否存在!
有是明明是把Form用free()函数free掉了,但是有时用Assigned()判断它,还是存在的,后面就接着就产生其它访问错误了!
 
两种吧
静态和动态
 
根据我菜鸟研究出来的经验,不是有时候的问题,而是长期就是的问题,因为Form与窗体根
本就是两回事,Form 是var出来的,现成的窗体可以赋值给它,即时Create的窗体也可以赋
值给它,form.free把窗体free掉,不等于连form变量也free掉,也不会改变它的值,好比
a:=b一样,无论b以后怎样改变,a也不会受影响,避免错误源于良好的编程习惯,凡是
create然后接受赋值的变量,在free之后,一定要顺手将变量设为nil,如果是句柄则设为
0,有的指针设为-1等。
 
同意 晚起的小虫的观点,觉得说得通俗易懂

至于窗体的生命周期的问题,我觉得是不定的,不管是那种创建方法,程序员都可以在运行过程中释放掉的啦.Assign只是判断一个指针是否为空的,如果窗体已被释放,这个指针又有什么用呢,反而会带来很多问题,如果是全局的窗体指针,建议使用FreeAndNil函数来释放窗体
 
谢谢大家的回答!
 
后退
顶部