我正在使用开源Abbrevia组件将一些文件存档到一个Zip中,而这正在发生我正在使用TAbMeter Gauge来显示进度.
我宁愿使用TProgressBar来代替这个目的(保持与Windows的标准接口).
我怎样才能使用TProgressBar代替TAbMeter?我知道我可以自己编写进度代码,但看到Abbrevia组件已经在TAbMeter中完成了这项工作,我认为重写它没有任何意义.
如果我甚至可以访问TAbMeter的Position属性,我可以通过与TAbMeter同步来模拟TProgressBar的进度.
这是一个片段,FileNames是一个包含要归档的文件名的TStringList.
procedure ArchiveFiles(SaveAs: string; ProgressBar: TAbMeter);
var
AZipper: TAbZipper;
i: Integer;
begin
AZipper := TAbZipper.Create(nil);
try
AZipper.AutoSave := False;
AZipper.BaseDirectory := ExtractFilePath(SaveAs);
AZipper.ArchiveSaveProgressMeter := ProgressBar;
AZipper.FileName := SaveAs;
AZipper.StoreOptions := AZipper.StoreOptions + [soStripDrive, soRemoveDots]
- [soStripPath];
AZipper.TempDirectory := GetTempDirectory;
try
Screen.Cursor := crHourGlass;
ProgressBar.Visible := True;
for i := 0 to FileList.Count - 1 do
begin
AZipper.AddFiles(FileList.Strings[i], 0);
end;
finally
AZipper.Save;
AZipper.CloseArchive;
ProgressBar.Visible := False;
Screen.Cursor := crDefault;
end;
finally
AZipper.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
您可能正在设置ArchiveSaveProgressMeter
代码中的某个位置.你可以简单地停止这样做,而是设置OnArchiveSaveProgress
事件.然后,您需要提供具有此签名的事件:
procedure(Sender: TObject; Progress: Byte; var Abort: Boolean) of object;
Run Code Online (Sandbox Code Playgroud)
您可以通过更新Position
UI中进度条的值来响应收到此类事件.
表示此progress事件的方法也处理进度表版本:
procedure TAbCustomZipper.DoArchiveSaveProgress(
Sender: TObject; Progress: Byte; var Abort : Boolean);
begin
Abort := False;
if Assigned(FArchiveSaveProgressMeter) then
FArchiveSaveProgressMeter.DoProgress(Progress);
if Assigned(FOnArchiveSaveProgress) then
FOnArchiveSaveProgress(Self, Progress, Abort);
end;
Run Code Online (Sandbox Code Playgroud)
因此,组件的设计者只提供了两种接收进度的替代路径:仪表或回调.
为了处理回调的进度,你需要编写一个这样的方法:
procedure TMyMainForm.OnArchiveSaveProgress(
Sender: TObject; Progress: Byte; var Abort: Boolean);
begin
FProgressBar.Position := Progress;
end;
Run Code Online (Sandbox Code Playgroud)
然后,您可以OnArchiveSaveProgress
在IDE中分配此事件处理程序.将OnClick
事件分配给按钮是一个相同的过程.
注意:我从未使用过Abbrevia,所以我可能从你正在使用的那个中选择了一个不同的组件.但是,与仪表交互的所有组件也通过回调提供进度,因此无论您使用哪个组件,这种基本方法都将起作用.
归档时间: |
|
查看次数: |
1873 次 |
最近记录: |