delphi导出数据数据量大时无法移动窗口的问题

老杨_sz 2010-06-10 12:03:36
代码如下:

如何改进调用此函数,正在导出数据时,可以最小化,移动窗口,可以执行其它应用程序。


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;
...全文
180 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2010-06-18
  • 打赏
  • 举报
回复
upup
haochin 2010-06-13
  • 打赏
  • 举报
回复
看看吧,简单的多线程:
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;

这样子在调用上面的函数时,就创建了一个线程。不会影响你主线程的操作。
haochin 2010-06-12
  • 打赏
  • 举报
回复
数据太多还真的只能用多线程的。
SQLDebug_Fan 2010-06-10
  • 打赏
  • 举报
回复
新手不代表不可以学,去找找线程的资料。
老杨_sz 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 biekvn 的回复:]
DBGExport方法在内部的SaveDBGridEhToExportFile方法执行时阻塞了,把Application.ProcessMessages;放到Case语句前面试试,如果不行的话,把导出代码放到一个独立的线程中去,导出完成后给主线程发一个消息,主线程收到消息以后提示导出成功。
[/Quote]

把导出代码放到一个独立的线程中去????如何做?新手啊
麦客来了 2010-06-10
  • 打赏
  • 举报
回复
DBGExport方法在内部的SaveDBGridEhToExportFile方法执行时阻塞了,把Application.ProcessMessages;放到Case语句前面试试,如果不行的话,把导出代码放到一个独立的线程中去,导出完成后给主线程发一个消息,主线程收到消息以后提示导出成功。

hongss 2010-06-10
  • 打赏
  • 举报
回复
线程被占用了
亮剑_ 2010-06-10
  • 打赏
  • 举报
回复
改成多线程,导出操作和界面刷新分开
bylgood 2010-06-10
  • 打赏
  • 举报
回复
用线程了
老杨_sz 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zxf_feng 的回复:]
建个线程,让导出在后台运行。

你的数据量有多大?
[/Quote]


你的数据量有多大?
每次导出都是3-5万左右,因为这个导出代码不支持EXCel分标签
阿三 2010-06-10
  • 打赏
  • 举报
回复
建个线程,让导出在后台运行。

你的数据量有多大?

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧