if Trim(SQLServer)='' then
  begin
    MsgBox('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk]);
    Application.Terminate;
    exit;
  end;Terminate是程序中止,为什么已经中止了,后面还要接一个terminate?谢谢  :)

解决方案 »

  1.   

    上面说错了一点!
    if Trim(SQLServer)='' then
      begin
        MsgBox('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk]);
        Application.Terminate;
        exit;
      end;Terminate是程序中止,为什么已经中止了,后面还要接一个exit?谢谢  :)
      

  2.   

    if Trim(SQLServer)='' then
      begin
        MsgBox('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk]);
        Application.Terminate;
        exit;
    end;不会吧!都终止了还exit有意义吗?
    去掉exit就知道它的作用了嘛!或者用断点看看
      

  3.   

    为什么不相信自己呢,你说的没错,那个Exit确实是多余的。别说上一行是Application.Terminate,上面是任何代码,不管程序有没有终止,这个Exit都是没用的。
      

  4.   

    啊我说错了,Sorry,没细看。如果上一行不是Application.Terminate,这个Exit不一定没用,如果上面列出的代码并不是一个完整的函数。另外,也许在这里Exit也不是多余。或许Application.Terminate只是发出一个消息,并没有直接结束程序呢。本菜鸟也不是很清楚。
      

  5.   

    以后说话之前得多想想了,呵呵。
    Application.Terminate确实并非直接终止应用程序,所以那个Exit不能说是多余的!procedure TApplication.Terminate;
    begin
      if CallTerminateProcs then PostQuitMessage(0);
    end;
      

  6.   

    那么调用TApplication.Terminate后,程序在什么时候中止呢?
      

  7.   

    我对windows、delphi消息了解很少!  还望仔细说明?
      

  8.   

    程序并没有立即中止,而是发送了一个消息。exit是不让下面得程序在执行了
    如:procedure aaa;
    beginif Trim(SQLServer)='' then
      begin
        MsgBox('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk]);
        Application.Terminate;
        exit;
    end;do something;//这块不执行了end;
      

  9.   

    晕倒,都已经结束了,为什么Exit不是多余?
    去掉Exit就行了!
      

  10.   

    不是多余的,Terminate会调用WINDOWS的POSTQUITMESSAGE函数向应用程序的消息队列中发一个消息,VCL据此释放应用程序创建的所有对象,所以,调用TERMINATE后不是马上使应用程序终止,而是当应用程序检索到WM_QUIT消息时才会终止.
    HALT后立即终止应用程序,而不释放其创建的对象.
      

  11.   

    这个exit要的。我一直这么写的,不写exit的话程序还是驻留的。
      

  12.   

    呵呵
    大家的讨论还挺热烈的
    这个exit是一定要要的!
    exit是使程序回到刚才!
      

  13.   

    to :这个exit是一定要要的!
    exit是使程序回到刚才!请问回到刚才什么啊?
      

  14.   

    TO: 海龙:执行Application.Terminate;这句之后,还会执行: Exit吗?
    你跟踪一下代码看看! 如果执行的话,它就起到Exit的作用。但它根本就不执行
    呢! 怎么能够回到刚才呢??    
      

  15.   

    告诉你吧Terminate决对不是立即结束进程,它会进行消息的排队,如果想立即退出可用HALT,如果你用过线程你就会知到在线程中的Terminate,不是立即结束线程而是会先将线程的terminated属性改为FALSE,如果你不相信可以建一个工程,调用APPLICATION的TERMINATE,可以看到应用程序的窗口会在关的时候闪一下
      

  16.   

    在编译器下设断点的话 是会执行的
    但是把EXIT换成showmessage('');
    你们觉得还会执行吗
      

  17.   

    exit根本不会执行的。
    一但application.terminate就会结束。
      

  18.   

    经过测试,我发现exit是执行的,大家也可以测试一下!运行一:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       messagedlg('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk],0);//断点
        Application.Terminate;
         showmessage('ni SB')  ;
        // exit;
         sleep(1000000) ;
    end;运行二:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       messagedlg('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk],0);//断点
        Application.Terminate;
         showmessage('ni SB')  ;
         exit;
         sleep(1000000) ;
    end;
    明显的,第一次时间很长!
      

  19.   

    看看这段E文吧,也许会有帮助。
    TerminateProcess causes all threads within a process to terminate, and causes a process to exit, but DLLs attached to the process are not notified that the process is terminating. Terminating a process causes the following: 1. All of the object handles opened by the process are closed. 
    2. All of the threads in the process terminate their execution. 
    3. The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate. 
    4. The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate. 
    5. The termination status of the process changes from STILL_ACTIVE to the exit value of the process. Terminating a process does not cause child processes to be terminated. 
    Terminating a process does not necessarily remove the process object from the system. A process object is deleted when the last handle to the process is closed.
      

  20.   

    最好用
    halt;这样就直接结束程序的执行了。
    或者  PostMessage(handle, WM_CLOSE, 0, 0);
    halt从工程文件里也可以直接结束程序运行。而
    Application.Terminate;
    只是给系统发了个结束消息,但是不从当前过程退出,所以放了个exit。
      

  21.   

    不是多余的
    Application.Terminate;只是给系统发了个结束消息,但是不从当前过程退出,
    exit在这里是有意义的
      

  22.   

    TO:gxc001(自由人) 你的测试写在OnCreate事件这里。
    为什么会执行呢? 你看看这几行代码吧! Application.Initialize;
                                          Application.CreateForm(TForm1, Form1);
                                          Application.Run;
    在一个窗体创建的时候,还没有执行“Application.Run;”,即没有进入消息
    循环。所以你的"Exit"是执行的。如果你在“Application.Run”,执行后再
    测试看看! 我认为这段代码:  messagedlg('数据库服务器名称不能为空,请重新配置系统',mtError,[mbOk],0);
        Application.Terminate;
         showmessage('ni SB')  ;
         exit;
    在没有执行"Application.Run"之前是有效的。希望大家继续!
      

  23.   

    TO: kl2000()  下面的“Button1Click”是在“Application.Run;”之后吧。 运行一:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         messagedlg('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk],0);
        Application.Terminate;
         showmessage('ni SB')  ;
       //  exit;
         sleep(1000000) ;
    end;运行二:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         messagedlg('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk],0);
        Application.Terminate;
         showmessage('ni SB')  ;
         exit;
         sleep(1000000) ;
    end;
    明显的,第一次时间很长!老兄,还是动动手吧!
      

  24.   

    TO: gxc001(自由人) 确实执行! 呵呵!
      

  25.   

    TO: gxc001(自由人)你写的那些代码确实是执行后面的了!
    但是如下的代码就跟踪不到他执行后面的代码了,
    老兄别说我不动手,其实我们的写法上不同,而
    导致不同的结果!
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        messagedlg('数据库服务器名称不能为空,请重新配置系统设置!',mtError,[mbOk],0);
        Application.Terminate;
        ShowMessage('OK');
        exit;
    end;