Тема: 7z архивы
Показать сообщение отдельно
  #8  
Старый 27.10.2013, 22:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Deep88
всё равно показует каждый архив в отдельности, только ещё хуже)
сразу прогрес заполняется и приложение подвисает до след архива.

подскажи лучше как сделать через размеры архивов.
может напрямую через 7z.dll будет проще?

да кстате если сделать лабел с именем архива так
label2.Caption:='извлекается архив '+archives.strings[i];
то имя появляется только на последнем архиве.

Имя появляется только в конце по другой причине, тк пока идет обработка, у тебя не обрабатывается очередь сообщений, соотв. не проходит отрисовка.

Ты для начала сделай, что бы у тебя нормально отрабатывалось в общем случае, потом уже будешь биться над сглаживанием.

Еще раз.
Код:
type
  TForm1 = class(TForm)
  public
    // Текущий архив
    ArcNum : Integer;
    // Total текущего архива
   ArcLen : Integer;
  ...

function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall;
 begin
   if total 
     then form1.ArcLen := value 
     else form1.ProgressBar1.Position := ArcNum*100 + 100*value/ArcLen;
   Result := S_OK;
  // Даем отрисоваться обновлению
  Application.ProcessMessages;
 end;
  
procedure TForm1.Button1Click(Sender: TObject);
var 
  i:integer; 
  arhives:tstringlist;
begin
  arhives.create;
  arhives.add:='test.7z';
  arhives.add:='test2.7z';

  // инициализируем прогресс бар
  ProgressBar1.Max := archives.count*100;
  ProgressBar1.Position := 0;
  ArcNum := 0;
  ArcLen := 0;
  with CreateInArchive(CLSID_CFormat7z) do
    for i:=0 to archives.count-1 do
      begin
        OpenFile(arhives[i]);
        SetProgressCallback(nil, ProgressCallback);
        ExtractTo('c:\1');
        Inc(ArcNum);
     end;
end;
Короче, как-то вот так. Может где и накосячил, но идея, вроде, изложена правильно.

ЗЫ. Кстати, а чем тебя не устроит вариант с 2мя прогресс барами. Один показывает прогресс извлечения из текущего архива, второй - общий, по кол-ву обработанных архивов.
Ответить с цитированием