Цитата:
Сообщение от 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мя прогресс барами. Один показывает прогресс извлечения из текущего архива, второй - общий, по кол-ву обработанных архивов.