//代码一
program Project1;uses
  Forms,
  MainForm in 'MainForm.pas' {Form1},
  MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);///////////
  Application.Run;
end.//代码二
program Project1;uses
  Forms,
  MainForm in 'MainForm.pas' {Form1},
  MyClass_Unit in '..\MyClass_Unit.pas';{$R *.res}begin
  Application.Initialize;
  Form1 := TForm1.Create(Application);///////
  Application.Run;
end.
//无效回答无分

解决方案 »

  1.   

    代码二只运行了form1.create事件,因为没有窗体显示,运行后程序结束!
    代码1运行后显示form1
      

  2.   

    Application.CreateForm(TForm1, Form1);///////////
    这段代码调用了TApplication类的CreateForm方法,这个方法的内部实现原理是:先调用NewInstance来为对象分配内存,再创建对象,然后判断如果Form1如果是应用程序的主窗体的话,就创建Form1的窗口句柄,然后显示出来。
    而Form1 := TForm1.Create(Application);///////
    就不一样了,它只是创建了Form1对象,此时Form1还没拥有句柄,不是一个有效的Win32窗口。
    所以结果是:方法一显示出了Form1,而方法二没有效果,它只创建了Form1对象。
      

  3.   

    分析一下Application.CreateForm的源代码:
    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;
      

  4.   

    另外补充一句,从TWinControl继承下来的可视化类,在Create之后并没有给它分配窗口句柄,只有在创建后第一次使用它时才分配句柄。(也即在需要Handle属性时)。