es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mostrando mensaje personalizado de estado mientras se extrae el archivo en Inno Setup.

Tengo un archivo de instalación para mi aplicación que contiene el archivo .exe y un archivo .zip también.

Lo que quiero es:

Recientemente agregué un código en la sección [Code] que extrae archivos de un archivo zip. Pero en realidad, esto sucede después de que la instalación se ha completado y la barra de progreso llega al 100%. Lo que quiero es hacer que el proceso de descompresión del código funcione con la barra de progreso y mostrar al usuario lo que se está extrayendo en ese momento.

Por ejemplo, supongamos que extraer archivos tomará el 50% de la barra de progreso y el resto lo tomará la sección de código mientras está descomprimiendo, con un estado sobre lo que se está extrayendo en ese momento.

Aquí está el código:

[Code]

procedure InitializeWizard;
begin
  ForceDirectories(ExpandConstant('{localappdata}\folder-A\app\folder-B'));
end;

const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;

procedure unzip(ZipFile, TargetFldr: variant);
var
  shellobj: variant;
  SrcFldr, DestFldr: variant;
  shellfldritems: variant;
begin
  if FileExists(ZipFile) then begin
    if not DirExists(TargetFldr) then 
      if not ForceDirectories(TargetFldr) then begin
        MsgBox('¡¡No se puede crear la carpeta '+TargetFldr+'!!', mbError, MB_OK);
        Exit;
      end;

  shellobj := CreateOleObject('Shell.Application');
  SrcFldr := shellobj.NameSpace(ZipFile);
  DestFldr := shellobj.NameSpace(TargetFldr);
  shellfldritems := SrcFldr.Items;
  DestFldr.CopyHere(
    shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
    unzip(ExpandConstant('{app}\example.zip'),ExpandConstant('{app}\'));
  end;
end;
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para que el proceso de descompresión funcione con la barra de progreso y muestre al usuario lo que se está extrayendo, puede utilizar las funciones de la barra de progreso integradas de Inno Setup.

    En primer lugar, necesita calcular el tamaño total de los archivos que se están extrayendo del archivo zip para poder determinar el porcentaje de progreso. Puede hacerlo usando la función GetBasicFileInfo de la unidad Classes.

    var
      TotalFileSize: Int64;
    
    ...
    
    procedure descomprimir(ZipFile, TargetFldr: variant);
    var
      shellobj: variant;
      SrcFldr, DestFldr: variant;
      shellfldritems: variant;
      I: Integer;
      FileSize: Int64;
    begin
      ...
    
      // Calcular el tamaño total de los archivos que se están extrayendo
      TotalFileSize := 0;
      for I := 0 to shellfldritems.Count - 1 do begin
        if not shellfldritems.Item(I).IsFolder then begin
          FileSize := Classes.GetBasicFileInfo(ZipFile + '\' 
            + shellfldritems.Item(I).Name).FileSize;
          TotalFileSize := TotalFileSize + FileSize;
        end;
      end;
    
      ...
    end;
    

    Luego, durante el proceso de descompresión, puede usar WizardForm.ProgressGauge para actualizar la barra de progreso y WizardForm.StatusLabel para mostrar al usuario lo que se está extrayendo.

    var
      TotalFileSize: Int64;
      ExtractedSize: Int64;
      ExtractedFiles: Integer;
    
    ...
    
    procedure descomprimir(ZipFile, TargetFldr: variant);
    var
      shellobj: variant;
      SrcFldr, DestFldr: variant;
      shellfldritems: variant;
      I: Integer;
      FileSize: Int64;
      CurrentSize: Int64;
    begin
      ...
    
      // Extraer los archivos y actualizar el progreso
      ExtractedSize := 0;
      ExtractedFiles := 0;
      for I := 0 to shellfldritems.Count - 1 do begin
        if not shellfldritems.Item(I).IsFolder then begin
          WizardForm.StatusLabel.Caption := 'Extrayendo ' 
            + shellfldritems.Item(I).Name;
          FileSize := Classes.GetBasicFileInfo(ZipFile + '\' 
            + shellfldritems.Item(I).Name).FileSize;
          CurrentSize := 0;
          DestFldr := shellobj.NameSpace(TargetFldr);
          DestFldr.CopyHere(
            shellfldritems.Item(I), SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
          ExtractedSize := ExtractedSize + FileSize;
          ExtractedFiles := ExtractedFiles + 1;
          WizardForm.ProgressGauge.Position := 
            MulDiv(ExtractedSize, 100, TotalFileSize); 
        end;
      end;
    
      ...
    end;
    

    Finalmente, necesita llamar a la función descomprimir durante el proceso de instalación utilizando el evento CurPageChanged.

    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpInstalling then begin
        WizardForm.StatusLabel.Caption := 'Extrayendo archivos...';
        descomprimir(ExpandConstant('{app}\ejemplo.zip'),ExpandConstant('{app}\'));
      end;
    end;
    

    Con estas actualizaciones, la barra de progreso mostrará el estado actual del proceso de descompresión, y la etiqueta de estado mostrará el nombre del archivo que se está extrayendo.

Comments are closed.