gpt4 book ai didi

excel - 执行长时间运行的导出任务时如何拥有响应式 UI(表单)?

转载 作者:行者123 更新时间:2023-12-03 14:59:23 26 4
gpt4 key购买 nike

大家好。首先,我不是以英语为母语的人,我可能会有一些语法错误等。

我需要做过类似我的事情或应用程序的人的建议,好吧,问题是我在我的delphi表单中使用TProgressBar,另一个名为“TExcelApplication”的组件和TDBGrid。

当我导出 DBGrid 的内容时,应用程序“卡住”,因此我基本上放置了 ProgressBar 以便用户查看进程完成了多少。我意识到,当 TDBGrid 检索每一行并将其导出到新的 Excel 工作簿时,您无法移动实际的表单,因此您必须等到该过程完成才能移动该表单。

那么,是否可以做一些事情(我考虑过线程,但我不确定它们是否有帮助),以便用户可以根据需要移动窗口?

非常感谢您花时间阅读并给我建议。我正在使用 Delphi XE。

这是我用来导出行的代码:

with ZQDetalles do
begin
First;
while not EOF do
begin
i := i + 1;
workSheet.Cells.Item[i,2] := DBGridDetalles.Fields[0].AsString;
workSheet.Cells.Item[i,3] := DBGridDetalles.Fields[1].AsString;
workSheet.Cells.Item[i,4] := DBGridDetalles.Fields[2].AsString;
workSheet.Cells.Item[i,5] := DBGridDetalles.Fields[3].AsString;
workSheet.Cells.Item[i,6] := DBGridDetalles.Fields[4].AsString;
workSheet.Cells.Item[i,7] := DBGridDetalles.Fields[5].AsString;
workSheet.Cells.Item[i,8] := DBGridDetalles.Fields[6].AsString;
workSheet.Cells.Item[i,9] := DBGridDetalles.Fields[7].AsString;
Next;
barraProgreso.StepIt;
end;
end;

如果您想查看“导出”按钮的完整代码,请随时查看此链接:http://pastebin.com/FFWAPdey

最佳答案

每当您在具有 GUI 的应用程序中执行需要花费大量时间的操作时,您都希望将其放在单独的线程中,以便用户仍然可以操作表单。您可以这样声明一个简单的线程:

TWorkingThread = class(TThread)
protected
procedure Execute; override;
procedure UpdateGui;
procedure TerminateNotify(Sender: TObject);
end;

procedure TWorkingThread.Execute;
begin
// do whatever you want to do
// make sure to use synchronize whenever you want to update gui:
Synchronize(UpdateGui);
end;

procedure TWorkingThread.UpdateGui;
begin
// e.g. updating the progress bar
end;

procedure TWorkingThread.TerminateNotify(Sender: TObject);
begin
// this gets executed when the work is done
// usually you want to give some kind of feedback to the user
end;

// ...
// calling the thread:

procedure TSettingsForm.Button1Click(Sender: TObject);
var WorkingThread: TWorkingThread;
begin
WorkingThread := TWorkingThread.Create(true);
WorkingThread.OnTerminate := TerminateNotify;
WorkingThread.FreeOnTerminate := true;
WorkingThread.Start;
end;

这非常简单,当您想要从线程更新视觉元素时,请记住始终使用同步。通常,您还需要注意用户在线程仍在工作时无法再次调用该线程,因为他现在可以使用 GUI。

关于excel - 执行长时间运行的导出任务时如何拥有响应式 UI(表单)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com