首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缩写ProgressBar

缩写ProgressBar
EN

Stack Overflow用户
提问于 2011-12-01 21:57:29
回答 2查看 2.1K关注 0票数 5

我正在使用开源缩写组件将一些文件归档到一个单独的Zip中,同时我使用TAbMeter来显示进度。

不过,我更喜欢使用TProgressBar来实现这个目的(与Windows保持一个标准接口)。

如何使用TProgressBar而不是TAbMeter?我知道我可以自己编写进度代码,但由于Abbrevia组件已经在TAbMeter中完成了这一点,我认为重写它没有意义。

如果我甚至可以访问TAbMeter的Position属性,我就可以通过与TAbMeter同步来模拟TProgressBar的进度。

这是一个代码片段,FileNames是一个包含要存档的文件名的TStringList。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-01 22:16:45

您可能在代码中的某个位置设置了ArchiveSaveProgressMeter。您可以简单地停止这样做,而是设置OnArchiveSaveProgress事件。然后,您需要提供一个具有此签名的事件:

代码语言:javascript
复制
procedure(Sender: TObject; Progress: Byte; var Abort: Boolean) of object;

您可以通过更新UI中进度条的Position值来响应收到此类事件。

呈现此进度事件的方法还处理进度计量器版本:

代码语言:javascript
复制
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;

因此,组件的设计者简单地提供了两种接收进度的替代方法:仪表或回调。

为了处理来自回调的进程,你需要写一个类似这样的方法:

代码语言:javascript
复制
procedure TMyMainForm.OnArchiveSaveProgress(
  Sender: TObject; Progress: Byte; var Abort: Boolean);
begin
  FProgressBar.Position := Progress;
end;

然后将此事件处理程序分配给OnArchiveSaveProgress,很可能是在集成开发环境中。这与将OnClick事件分配给按钮的过程相同。

注意:我从来没有用过Abbrevia,所以我可能选了一个不同于你正在使用的组件。但是,所有与仪表交互的组件也通过回调提供进度,因此无论您使用哪个组件,此基本方法都将有效。

票数 5
EN

Stack Overflow用户

发布于 2011-12-02 01:05:13

为了防止它对其他人有帮助,我创建了一个可以代替TAbMeter的新TAbProgressBar组件。它们都实现了相同的接口,因此它使用相同的Archive*ProgressMeter属性。只需从Subversion更新Abbrevia并重新编译AbbreviaVCL和AbbreviaVCLDesign包即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8342492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档