5

我正在使用开源缩写组件将一些文件存档到单个 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;
4

2 回答 2

5

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

procedure(Sender: TObject; Progress: Byte; var Abort: Boolean) of object;

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

显示此进度事件的方法还处理进度表版本:

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;

所以组件的设计者简单地提供了两种接收进度的替代途径:仪表或回调。


为了处理回调的进度,您需要编写如下方法:

procedure TMyMainForm.OnArchiveSaveProgress(
  Sender: TObject; Progress: Byte; var Abort: Boolean);
begin
  FProgressBar.Position := Progress;
end;

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


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

于 2011-12-01T14:16:45.300 回答
1

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

于 2011-12-01T17:05:13.097 回答