你深入了解DELPHI么?如果是,请进!(100分)

  • 主题发起人 主题发起人 jiliguala
  • 开始时间 开始时间
J

jiliguala

Unregistered / Unconfirmed
GUEST, unregistred user!
Application.CreateForm(TForm1,Form1)

Form1:=TForm1.Create(Application)
之间有什么异同?[?][blue]
 
看一下不就知道了么?[:D]
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;
 
Application.CreateForm(TForm1,Form1)
比下面多了一个设置主Form的功能,如果主Form不存在,则Form1为主Form,
主Form的结束,代表程序结束.
Form1:=TForm1.Create(Application)
仅仅创建一个Form1
 
appliaction.CreateForm(TForm1,Form1);
他所用的是一种叫类变量的技术,VCL原码中大量的用到这种技术,还有一些
高手写也用到了,他把一个类也设成一个变量,如果他要修改其中的一个类的
话,他只要改一下的的类变量的赋值就可以了,便于维护
 
嗯!有启发[:)]
 
来晚了,同意以上看法
 
9494 看帮助
 
同意wangpian看法
 
使用Application.Create来进行窗口创建的多态实现,如果所有的窗口从一个基本的Form
继承(假定为TBaseFrm),appliaction.CreateForm(TBaseFrm(TChildFrm),ChildFrm);
我在一个Main窗口中创建了10多个窗口,我也在想用一个什么函数可以实现创建。这可能
是一个方法,不过还没有实现过。
 

更正一点:
appliaction.CreateForm(TChild1Frm,BaseFrm);
appliaction.CreateForm(TChild2Frm,BaseFrm);
appliaction.CreateForm(TChild3Frm,BaseFrm);
appliaction.CreateForm(TChildnFrm,BaseFrm);
刚测试好。这应当是继承和多态体现。
 
补充一点:Application创建一定是由Application负责释放, Form.Create则可能指定不同的
Owner或者就没有Owner要求程序员自己释放。
 
我来学习的。
 
简单且用的着的是:
Application.CreateForm(TForm1,Form1)执行时先检测是否有主窗口,如果有则表面上和
Form1:=TForm1.Create(Application)一样,如果没有,则把此窗口作为主窗口。
一旦一个窗体为主窗体,则程序执行且所有窗体创建完毕后,程序则检测主窗口是否可见
如果不可见则强迫其可见。这就是为什么启动后主窗口总在最上方(把主窗体的VISIABLE
设为TRUE就不会了)。
 
问题提的不错,小弟也学到不少:)
 
大家讲得很好!!!
 
呵呵,一个简单的问题,深入到VCL内部机制,很好的学习方法啊,学习+听课
 

同意 wangpian:
Application.CreateForm(TForm1,Form1)
比下面多了一个设置主Form的功能,如果主Form不存在,则Form1为主Form,
主Form的结束,代表程序结束.
Form1:=TForm1.Create(Application)
仅仅创建一个Form1
 
后退
顶部