代码如下:如何改进调用此函数,正在导出数据时,可以最小化,移动窗口,可以执行其它应用程序。
function Tdm.DBGExport(var dbg: TDBGridEh): Boolean;
var
  fd_file: TSaveDialog;
  fn: string;
  sa: boolean;
begin
  Application.ProcessMessages;
  result := true;
  fd_file := TSaveDialog.Create(Application);
  try
    fd_file.DefaultExt := 'xls';
    fd_file.Filter := 'Microsoft Excel 文件(*.xls)|*.XLS|文本文件(*.txt)|*.TXT|Csv文件(*.csv)|*.Csv|HTML文件(*.htm)|*.htm|RTF文件(*.rtf)|*.RTF';
    if (not dbg.DataSource.DataSet.Active) or (not fd_file.Execute) then
    begin
      //messagebox(application.Handle,'没有任何数据,不能进行保存','警告',mb_ok);
      result := False;
      Exit;
    end;
    fn := fd_file.filename;
    sa := (dbg.Selection.SelectionType = gstNon);
    case fd_file.FilterIndex of
      2: SaveDBGridEhToExportFile(TDBGridEhExportAsText, dbg, fn, sa);
      3: SaveDBGridEhToExportFile(TDBGridEhExportAsCsv, dbg, fn, sa);
      4: SaveDBGridEhToExportFile(TDBGridEhExportAsHTML, dbg, fn, sa);
      5: SaveDBGridEhToExportFile(TDBGridEhExportAsRTF, dbg, fn, sa);
    else
      SaveDBGridEhToExportFile(TDBGridEhExportAsXLS, dbg, fn, sa);
      Application.ProcessMessages;
      Application.MessageBox('导出EXCEL数据成功!','提示');
    end;
  finally
    fd_file.Free;
  end;
end;

解决方案 »

  1.   

    DBGExport方法在内部的SaveDBGridEhToExportFile方法执行时阻塞了,把Application.ProcessMessages;放到Case语句前面试试,如果不行的话,把导出代码放到一个独立的线程中去,导出完成后给主线程发一个消息,主线程收到消息以后提示导出成功。
      

  2.   

    你的数据量有多大?
    每次导出都是3-5万左右,因为这个导出代码不支持EXCel分标签
      

  3.   

    看看吧,简单的多线程:
    function myfun(p : Pointer):Integer;stdcall;
    var
      i : Integer;
    begin
      for i := 0  to  500000 do
      begin
        Form1.Canvas.Lock;
        form1.Canvas.TextOut(10,10,IntToStr(i));
        form1.Canvas.Unlock;
      end;
      Result :=0;  
    end;这个子调用:procedure TForm1.btn3Click(Sender: TObject);
    var
      id : THandle;
    begin
      CreateThread(nil,0,@myfun,nil,0,id);
    end;这样子在调用上面的函数时,就创建了一个线程。不会影响你主线程的操作。