我的程序是只有一个线程,为了防止误操作我去掉了窗口的关闭按钮,右键的时候有个close菜单完成结束程序的任务我close中的代码如下:
begin  formmain.close;
  application.terminate;
end;
   这个程序主要完成实时数据提交,当我提交的数据量比较少的时候关闭程序是没有问题,但大量提交过后在关闭程序的时候会报错,而且有时候窗口虽说关掉了但是在任务管理器里还能看到他的进程,这是为什么?
  不知道怎么才能不报错并且连进程一起关掉,不知道你们在程序结束的时候一般怎么作收尾工作的?

解决方案 »

  1.   

    begin
      关闭线成程  
      Close;
      application.Terminate;
    end;
      

  2.   

    呵呵,这样可以了吗!
    再不你就在formclose事件里边加上
    begin
    Action:=cafree;
    end;
      

  3.   

    form1:=nil;
    form1.free;
    action:=cafree;
    application.terminate;
      

  4.   

    qzg(志刚)说的没错,其他的回答不行。
    我前几天也问了这个问题,没有给我一个满意的答案。不过幸运的是我在dephi帮助中找到了答案,请注意下面过程的action: 一种操作是cafree,一种是canone
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    beginend;
      

  5.   

    恐怕不只是这样吧,如果前台线程正在工作,应该是不会响应鼠标键盘消息的,所以尽量不要让主线程做很多的事,这样就可以响应消息,在WM_CLOSE消息的处理中,关闭所有的线程就可以完成程序的关闭了
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
        s:string;
    begin
    for i:=1 to 100000000 do
      begin
       s:=inttostr(i);    //发现用label控件简直痛苦,根本看不到有什么变化,只最后显示结果
       form1.Canvas.TextOut(5,5,s);
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action:=cafree;
    end;end.这样的程序,就没有时间处理关闭的消息,并且界面也不能更新,所以嘛,这个计算最好开在新线程里面,主窗口关闭的时候看线程是否存在,存在则关闭线程后再闭主窗体