Аббревиа ПрогрессБар - PullRequest
5 голосов
/ 01 декабря 2011

Я использую компоненты Abbrevia с открытым исходным кодом для архивирования некоторых файлов в один Zip, в то время как это происходит, я использую датчик TAbMeter для отображения прогресса.

Я бы предпочел вместо этого использовать TProgressBar для этой цели (поддерживая стандартный интерфейс с Windows).

Как я могу использовать TProgressBar вместо TAbMeter? Я знаю, что могу сам кодировать ход выполнения, но, учитывая, что Компоненты Abbrevia уже сделали это в TAbMeter, я не вижу смысла переписывать его.

Если бы я мог даже получить доступ к свойству Position TAbMeter, я мог бы симулировать прогресс TProgressBar, синхронизировавшись с TAbMeter.

Вот фрагмент, 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;

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

Вы, вероятно, устанавливаете ArchiveSaveProgressMeter где-то в своем коде.Вы можете просто прекратить это делать и вместо этого установить событие OnArchiveSaveProgress.Затем вам нужно указать событие с такой подписью:

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

Чтобы ответить на получение такого события, обновите значение Position индикатора выполнения в вашем пользовательском интерфейсе.

Метод, который отображает это событие прогресса, также обрабатывает версию индикатора выполнения:

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, поэтому я мог выбрать другой компонент из одноготы используешь.Тем не менее, все компоненты, которые взаимодействуют со счетчиками, также обеспечивают прогресс посредством обратного вызова, поэтому этот базовый подход будет работать независимо от того, какой компонент вы используете.

1 голос
/ 01 декабря 2011

Если кому-то это поможет, я создал новый компонент TAbProgressBar, который можно использовать вместо TAbMeter.Оба они реализуют один и тот же интерфейс, поэтому он работает с одинаковыми свойствами Archive*ProgressMeter.Просто обновите Abbrevia из Subversion и перекомпилируйте пакеты AbbreviaVCL и AbbreviaVCLDesign.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...