各位仁兄,仁姐,小弟碰到一个问题,因为数据库有百万条记录,而我简单的实现一个导入功能,不过他要首先去其他表中搜索数据,按条件插入,这就碰到问题了,一点击,就停在那里,不动了,跟死机一样。所以小弟想实现一个跳出框,不用显示进度,只要提示正在处理数据便可,另外把鼠标事件改为漏斗,试着弄过一个form,点击导入的时候,form.show,执行完以后,form.close,但是form上的字都显示不出来,只显示了form的边框,中间什么都没有,是不是需要数据库在后台操作,form前台跳出啊,希望能提供些解决方案,最好有源码?/高分必送!

解决方案 »

  1.   

    form.show
    form.refresh;或者;
    Application.ProcessMessage
      

  2.   

    本人经验:
    在公共UNIT中自建非模态窗口过程和释放过程:
    procedure MyShow(str: string);
    begin
     MyMessagefrm:=TMyMessagefrm.Create(Application);
     MyMessagefrm.Label1.Caption:=str;
     MyMessagefrm.Show;
     MyMessagefrm.Refresh;
    end;procedure MyShowFree;
    begin
     myMessagefrm.Hide;
     myMessagefrm.Free;
     myMessagefrm:=nil;
    end;然后在insert, update操作之前调用myshow('正在保存数据, 请稍候......');
    操作之后调用myshowfree释放
      

  3.   

    补充: 必须首先在工程中创建myMessagefrm非模态窗口
      

  4.   

    form.update();更新一下就行了~ 我前时候程序有点大,载入有点慢,于是用一个启动窗体,没加上面的那一句的时候,窗体冻结了,什么都看不见,加上就好了~如果里面有循环,加个Application.ProcessMessage
      

  5.   

    //提供一个测试代码,效果不是很理想,但基本能满足要求
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,ActiveX,DB, ADODB;const
          WM_TASK_FINISH = WM_USER + 1001;
    type
      TMainFrm = class(TForm)
        btnTest: TButton;
        procedure btnTestClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure TradeFinish(var Msg:TMessage);message WM_TASK_FINISH;
      end; TDBThread=class(TThread)
     protected
       procedure Execute();override;
     public
       MsgWnd:THandle;//接收线程完成通知消息的窗口
       ConnectionString:string; //ado 连接串
     end;var
      MainFrm: TMainFrm;implementation{$R *.dfm}
    { TDBThread }procedure TDBThread.Execute;
    var
      Index:Integer;
      SQL:string;
      adoQry:TAdoQuery;
    begin
      CoInitialize(nil);
      adoQry := TAdoQuery.Create(nil);
      try
        adoQry.ConnectionString := ConnectionString;
        //模拟插入1000条记录s
        for Index := 1 to 100 do
        begin
          SQL := 'INSERT INTO DEDAK_TEST (BH,MC) VALUES(''%s'',''%s'')';
          (*
            数据库是Access 2000
            表结构
            DEDAK_TEST
            (
              BH varchar(50),
              MC varchar(50)
            )
          *)
          SQL := Format(SQL,[IntToStr(Index),'A' + IntToStr(Index)]);
          adoQry.SQL.Text := SQL;
          adoQry.ExecSQL();
          Sleep(2);
        end;
      finally
        CoUninitialize();
       //通知主窗体任务完成
        PostMessage(MsgWnd,WM_TASK_FINISH,0,0);
      end;
    end;procedure TMainFrm.btnTestClick(Sender: TObject);
    var
      Obj:TDBThread;
      ConnStr:string;
    begin
      ConnStr := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
                 'Data Source=F:\DataBase40.mdb;'    +
                 'Persist Security Info=False';
      Obj := TDBThread.Create(TRUE);
      Obj.FreeOnTerminate := TRUE;
      Obj.MsgWnd := Self.Handle;
      obj.ConnectionString := ConnStr;  Screen.Cursor := crSQLWait;
      obj.Resume(); //启动线程
    end;procedure TMainFrm.TradeFinish(var Msg: TMessage);
    begin
      Screen.Cursor := crDefault;
      ShowMessage('数据插入完成');
    end;end.