5

オープンソースのAbbreviaコンポーネントを使用して、いくつかのファイルを1つのZipにアーカイブしていますが、これが発生している間、進行状況を表示するためにTAbMeterゲージを使用しています。

ただし、代わりにこの目的でTProgressBarを使用することをお勧めします(Windowsとの標準インターフェイスを維持します)。

TAbMeterの代わりにTProgressBarを使用するにはどうすればよいですか?進捗状況を自分でコーディングできることはわかっていますが、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;

PositionUI のプログレス バーの値を更新することで、このようなイベントの受信に応答します。

この進行状況イベントを表示するメソッドは、進行状況メーターのバージョンも処理します。

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;

そのため、コンポーネントの設計者は、進行状況を受け取るための 2 つの代替ルート (メーターまたはコールバック) を単純に提供しました。


コールバックからの進行状況を処理するには、次のようなメソッドを記述する必要があります。

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 に答える