在长时间操作期间显示进度取决于几个因素(限制):
- 已定义/未定义的进度(你知道,
可以计算一下,做了多少步
操作)
- 可中断性/分段(您
将能够或不得不打断
刷新进度的操作
给用户)
- 该操作是可线程的(您可以
把操作放到一个线程中)
对于已定义的进度,通常显示分段进度条,而对于未定义的动画或进度条,通常会显示“Marquee”样式。
主要考虑的是操作是否是分段/可中断的。因为如果不是,并且您不处理它,您的应用程序将冻结,直到操作完成。
搜索文件是分段操作的一个例子。每个找到的文件都是一个段,它使您能够向用户显示进度并刷新显示。
例子:
TFrmUndefinedProgress = class(TForm)
private
FCallbackProc : TNotifyEvent;
protected
procedure WndProc(var Message:TMessage); override;
public
constructor Create(aCallbackProc: TNotifyEvent);
procedure UpdateProgress(const aStr : string; aPercent : integer);
...
constructor TFrmUndefinedProgress.Create(aCallbackProc: TNotifyEvent);
begin
inherited Create(nil);
FCallbackProc := aCallbackProc;
end;
...
procedure TFrmUndefinedProgress.FormShow(Sender: TObject);
begin
Update;
PostMessage(Handle, WM_START_UNDEFPROG, 0, 0);
end;
在表单的 OnShow 上向窗口过程发送消息,以确保它首先被呈现。
procedure TFrmUndefinedProgress.WndProc(var Message: TMessage);
begin
if (Message.Msg = WM_START_UNDEFPROG) then begin
if Assigned(FCallbackProc) then
FCallbackProc(Self); --> Call your callback procedure
PostMessage(Handle, WM_CLOSE, 0, 0); --> close when finished
end
else
inherited;
end;
如果您在表单单元中进行常规程序...
procedure ShowUndefinedProgress(aCallbackProc : TNotifyEvent);
var
FrmUndefinedProgress : TFrmUndefinedProgress;
begin
FrmUndefinedProgress := nil;
try
FrmUndefinedProgress := TFrmUndefinedProgress.Create(aCallbackProc);
FrmUndefinedProgress.ShowModal;
finally
FreeAndNil(FrmUndefinedProgress);
end;
end;
然后你可以这样调用进度表:
ShowUndefinedProgress(HandleSomeOperation);
你在哪里传递你的 aCallbackProc。
你把你的操作放在里面:
procedure TForm1.HandleSomeOperation(Sender: TForm);
var
aProgress : TFrmUndefinedProgress;
begin
--> Do something
aProgress := TFrmUndefinedProgress(Sender);
aProgress .UpdateProgress(SomeMessage, Percent);
更新每个找到的文件的显示...
如果你有一个操作需要很长时间,但是你没有办法中断它,那么你应该把它放在一个线程中。
- 创建 TThread 对象的后代。
- 覆盖它的 Execute 方法
- 在执行里面做你的事
并使用它:
- 创建表单
- 在它的 OnShow 上开始一些动画
- 然后运行你的线程
- 线程结束时关闭。