最近尝试做一个管理系统,其中有登陆界面,在登录界面中要输入密码验证身份,现在我知道两种方法启动窗体
   1、建立主窗体,在主窗体的OnCreate()函数中启动验证窗体。即输入
            Form2 := TForm2.Create(Application);
          Form2.ShowModal;
          Form2.Free;
      (有一个疑问,为什么showmodal之后接着free掉了?)
   2、在program窗体中输入
           begin
            Application.Initialize;
            PassWD_Form := TPassWD_Form.Create(Application);
            if  PassWD_Form.ShowModal = mrOK then
              begin
                Application.Title := '车辆调度管理系统';
                Application.CreateForm(TMain_Form, Main_Form);
                Application.CreateForm(TDModule, DModule);
                Application.Run;
              end else
                Application.Run;
          end.
      之类的方式。
       这种方式我有几个问题
           1、Application.Initialize;的作用是什么?
           2、是不是采用PassWD_Form := TPassWD_Form.Create(Application);方式建出来的不是主窗体,而采用
              Application.CreateForm(TMain_Form, Main_Form);第一个建出来的才是主窗体。
           3、Application.Run;的作用是什么?
     3、对于以上两种方式我该采用那一种?或者还有什么更好的吗?

解决方案 »

  1.   

      Application.Initialize;
      Application.Title := '监控系统';
      loginForm := TLoginForm.Create(Application);
      try
        loginForm.ShowModal;
      finally
        loginForm.Free;
      end;  if not loginForm.bIfLoginSuccess then
      begin
        Application.Terminate;
      end;  //调用主窗口
      Application.CreateForm(TFormMain, FormMain);
      Application.Run;
      

  2.   

    从别处找的在 Project1 的 Application.Initialize 之前,Delphi 编译器会自动插入一行代码: 
    SysInit._InitExe。_InitExe 主要是初始化 HInstance 和模块信息表等。然后 _InitExe 调用 System._StartExe。System._StartExe 调用 System.InitUnit;System.InitUnit 调用项目中所有被包含单元的 Initialization 段的代码;其中有 Controls.Initialization 段,这个段比较关键。在这段代码中建立了 Mouse、Screen 和 Application 三个关键的全局对象。 Application.Create 调用 Application.CreateHandle。Application.CreateHandle 建立一个窗口,并设置 Application.WndProc 为回调函数(这里使用了 MakeObjectInstance 方法,后面再谈)。Application.WndProc 主要处理一些应用程序级别的消息。 我第一次跟踪应用程序的执行时没有发现 Application 对象的创建过程,原来在 SysInit._InitExe 中被隐含调用了。如果你想跟踪这个过程,不要设置断点,直接按 F7 就发现了。 然后才到了 Project1 的第 1 句: Application.Initialize; 
    这个函数只有一句代码:  if InitProc <> nil then TProcedure(InitProc); 也就是说如果用户想在应用程序的执行前运行一个特定的过程,可以设置 InitProc 指向该过程。(为什么用户不在 Application.Initialize 之前或在单元的 Initliazation 段中直接运行这个特定的过程呢?一个可能的答案是:如果元件设计者希望在应用程序的代码执行之前执行一个过程,并且这个过程必须在其他单元的 Initialization 执行完成之后执行[比如说 Application 对象必须创建],则只能使用这个过程指针来实现。) 然后是 Project1 的第 2 句:     Application.CreateForm(TForm1, Form1); 
    这句的主要作用是创建 TForm1 对象,然后把 Application.MainForm 设置为 TForm1。 最后是 Project1 的第 3 句:     Application.Run; 
    TApplication.Run 调用 TApplication.HandleMessage 处理消息。Application.HandleMessage 的代码也只有一行
      

  3.   

    Delphi 的消息机制浅探 你看一下这本书。
      

  4.   

    疑问:为什么showmodal之后接着free掉了?
     回答:不是紧接着 , showmodal一定要返回result 或着close后 才会执行它后面的代码.
      

  5.   

    疑问回答
    不是紧接着 
    showmodal后 一定要等到返回result,关闭窗体之后才会,执行后面的代码
      

  6.   

    疑问回答
    不是紧接着 
    showmodal后 一定要等到返回result,关闭窗体之后才会,执行后面的代码
      

  7.   

    有一个疑问,为什么showmodal之后接着free掉了?
    因为ShowModal的窗体,需要等到这个窗体关闭以后,才能执行ShowModal之后的语句1、Application.Initialize;的作用是什么?
    程序初始化2、是不是采用PassWD_Form := TPassWD_Form.Create(Application);方式建出来的不是主窗体,而采用 
    Application.CreateForm(TMain_Form, Main_Form);第一个建出来的才是主窗体。
    哪个窗体是主窗体,不是由创建方式决定的,而是在工程文件里自己定义的。
    Project->Options菜单,Forms页,上面有个Main Form:这里定义的3、Application.Run;的作用是什么?
    执行这个程序,开始进入消息循环3、对于以上两种方式我该采用那一种?或者还有什么更好的吗?
    你喜欢用哪种就用哪种
      

  8.   

    第二个问题不尽然吧。其实最根本的还是applicatin.createForm决定的。可以看一下源码,第一个产生的窗体绝对就是主窗。