Bar de progression lors de l'installation d'un MSI [Résolu]

Signaler
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009
-
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009
-
Bonjour à tous, c'est mon premier post ici...


Voilà ma question, je suis en train de réaliser un setup avec plusieurs
pages: bienvenue, saisie d'information, acceptation de licence, etc...

Puis ma derniere doit representer une bar de progression qui tourne
jusqu'à ce que l'installation du .msi qui va avec soit terminée.

Pour executer le .msi je passe une execution de console comme dans cmd avec la commande msiexec, la ça marche!


Mon soucis est je ne sais pas trop comment réaliser cette bar de
progression qui tourne jusqu'à ce que l'installation soit terminée...


Pouvez vous s'il vous plait m'indiquer la marche à suivre, ou me dirigez vers des liens qui pourraient m'aider.

Merci d'avance.

38 réponses

Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

Génial merci !!!
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

alors.....

Flo j'ai fait tout ce que tu m'as dit.

J'ai mis en place un CreateProcess qui ouvre en fait NotePad.exe (juste pour effectuer mes tests). Il l'ouvre bien, mais la fiche avec la ProgressBar se met sur un fond blanc , et lorsque je met le curseur dessus il y a le sablier... (Et aucune progressBar ne s'affiche).
Et quand je ferme NotePad, la fiche avec la progressBar s'affiche bien...

Donc est ce que ça vient de CreateProcess, ou bien est-je fais une erreur avec NewProgressBar???

Ma procédure avec Create Process ressemble à ça :

procedure runMsi2();


  var
    proc_info: TProcessInformation;
    startinfo: TStartupInfo;
     
begin




    FillChar(proc_info, sizeof(TProcessInformation), 0);
    FillChar(startinfo, sizeof(TStartupInfo), 0);
    startinfo.cb := sizeof(TStartupInfo);


    if CreateProcess('c:\windows\notepad.exe', nil, nil,
        nil, true, NORMAL_PRIORITY_CLASS, nil, nil,
         startinfo, proc_info) <> False then begin

      WaitForSingleObject(proc_info.hProcess, INFINITE);

      CloseHandle(proc_info.hProcess);
      Application.MessageBox('Notepad finished!',
        'Info', MB_ICONINFORMATION);
    end else begin

      Application.MessageBox('Couldn''t execute the '
        + 'application', 'Error', MB_ICONEXCLAMATION);
    end;
  end;

Et l'appel de procédure à ça :

scr4.Show;
RunMsi2();
scr4.Hide;

Sinon dans le .pas avec la ProgressBar j'ai exactement fait comme tu me l'avais indiqué...

PS: savez vous ce qui ce passe sur delphi.developpez.com/ car depuis ce matin impossible d'y accéder...
Messages postés
3824
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 décembre 2020
37
essaye comme ceci :

scr4.Show;
Application.ProcessMessages;
RunMsi2();
scr4.Hide;

 
@+
Cirec

<hr size="2" />
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
héhé Cirec: tu m'as devancé.
Mais appeler une seule fois Application .ProcessMessages ne rédoudra pas le problème, ce serait trop simple !!!
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

Bon déjà ça marche mieux, merci à tous les deux, car même quand le nouveau processus est lancé le contenu de la fiche est bel et bien visible, mais la progress bar ne démarre pas...

Est ce que cela pourrait etre du à certains parametres de la progress bar que j'aurais mal configuré??

"delay" de la procedure BeginAnim, correspond à quoi ?

PS: Merci encore car petit à petit ça avance!!!
Messages postés
3824
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 décembre 2020
37
tu es sûr qu'un seul appel ne suffit pas

vue que le déclanchement de la ProgressBar se fait par un seul message !
le reste est un cycle interne gèré par Windows

si j'ai le temps je frais un teste
 
@+
Cirec

<hr size="2" />
Messages postés
3824
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 décembre 2020
37
es tu certain d'avoir mis un XPManifest sur ta Form

parce que sans ça ne fonctionne pas
 
@+
Cirec

<hr size="2" />
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
Bon, si la progressbar ne démarre pas, c'est pas normal.
As-tu mis le bon Delay ?

Alors, précisions :
- Delay: Integer correspond en gros à la vitesse d'animation (plus il est petit, plus ça va vite). En principe tu mets entre 100 et 200 millisecondes, mais jamais plus.

- Il faut absolument utiliser ma technique pour que ça marche, car si tu n'appelles pas Applicaiton.ProcessMessages au moins aussi souvent que "Delay" tu ne verras rien.
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

J'ai mis le delay à 200, et XPManifest je l'ai bien mis, enfin j'espère. J'ai mis windowsXP.res dans le même repertoire que le projet, et j'ai mis {$R WindowsXP.res} dans le.pas qui contient la fiche avec la ProgressBar.
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

Est ce que par hasard je dois faire une incrémentation de PrograssBar1.Position quelque part??? Ou tout est géré dans NewProgressBar???
Messages postés
3824
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 décembre 2020
37
non tout est géré automatiquement dans NewProgressBar

 
@+
Cirec

<hr size="2" />
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

Bon alors là je vois vraiment pas où est le probleme, je vais vous passer les bouts de codes que j'ai et si vous voyez un problème si vous pouvez me les signaler, ça serait super ! Merci d'avance :

//***************************************************************

//dans main1.pas

//****************
procedure runMsi2();   //procedure qui crée le nouveau processus


  var
    proc_info: TProcessInformation;
    startinfo: TStartupInfo;
    aCmdLine : shortstring;


  begin


  aCmdLine := Variables.Values['run'];




    FillChar(proc_info, sizeof(TProcessInformation), 0);
    FillChar(startinfo, sizeof(TStartupInfo), 0);
    startinfo.cb := sizeof(TStartupInfo);




    if CreateProcess('c:\windows\notepad.exe', nil, nil,
        nil, true, NORMAL_PRIORITY_CLASS, nil, nil,
         startinfo, proc_info) <> False then begin

      while True do
      begin
        Application.ProcessMessages;
        if WaitForSingleObject(proc_info.hProcess, 150) <> WAIT_TIMEOUT then
           Break;
      end;

      CloseHandle(proc_info.hProcess);
      Application.MessageBox('Notepad finished!',
        'Info', MB_ICONINFORMATION);
    end else begin
      Application.MessageBox('Couldn''t execute the '
        + 'application', 'Error', MB_ICONEXCLAMATION);
    end;
  end;

//***********

//dans la fonction principal

scr4.Show;


     RunMsi2();


scr4.Hide;

//********************************************************************

//Fiche avec La ProgressBar :

unit jauge;


interface




uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls, ComCtrls, NewProgressBar;


type
  Tscr4 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Panel2: TPanel;
    Label1: TLabel;
    cancelbtn: TButton;
    Panel3: TPanel;
    Timer1: TTimer;
    ProgressBar1: TProgressBar;
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  scr4: Tscr4;




implementation


{$R *.dfm}
{$R WindowsXP.res}


 


procedure Tscr4.FormShow(Sender: TObject);
begin
 progressBar1.BeginAnim(150);
end;


 


procedure Tscr4.FormHide(Sender: TObject);
begin
 ProgressBar1.StopAnim;
end;


end.

//**************************************************************

// Methode de Flo NewProgressBar (on sait jamais si j'ai fais une erreur..)

unit NewProgressBar;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;


type
  TProgressBar = class(ComCtrls.TProgressBar)
  public
    procedure CreateParams(var Params: TCreateParams); override;
    procedure BeginAnim(Delay: Integer);
    procedure StopAnim;
  end;
 
implementation


 


const
  PBS_MARQUEE = $08;
  PBM_SETMARQUEE = WM_USER + 10;


procedure TProgressBar.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or PBS_MARQUEE;
end;


procedure TProgressBar.BeginAnim(Delay: Integer);
begin
  SendMessage(Handle, PBM_SETMARQUEE, 1, Delay);
end;


procedure TProgressBar.StopAnim;
begin
  SendMessage(Handle, PBM_SETMARQUEE, 0, 0);
end;


end.

//***************************************************************
//***************************************************************

Si jamais ça ne vient pas de là est ce que ça pourrait venir des propriétés de la ProgressBar ?
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
Mhhhh, c'est pas dit que ta version du manifest permette de faire fonctionne la progressbar.
Es-tu sur de ne pas avoir le composant TXPManifest ?

Sinon, le code a l'air OK, je ne vois pas trop d'où ça peut venir ....

Je vais réflechir à ça ...
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
1
Ahhh, j'ai trouvé une solution: je la poste dans une heure à peu près ...

A bientot donc ...
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

La progressBar marche merveilleusement bien!!! Un grand MERCI pour cette aide!!!!

Par contre maintenant ma question est : est il possible, avec CreateProcess, d'executer une commande qu'on executerait en temps normal avec "cmd", par exemple : set.

Car j'arrive à le faire avec ShellExecute, mais cette fonction n'attends pas la fin du processus lancé.

Donc ce qu'il me faudrait ça serait peut être un mix des 2... A moins, biensur que CreateProcess permettent d'executer des commandes cmd.
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

J'ai bien essayer d'executer la commande avec shellexecute, et faire une boucle

while ExeRunning('cmd' ,true) do
Application.ProcessMessages;

ExeRunning() étant une fonction que j'ai trouvé ici : http://delphi.developpez.com/faq/?page=interexecution#applicationencoursexe

Ca marche niquel, mais le temps d'execution est affreusement long!!! Donc cette solution n'est pas envisageable...

Donc je maintiens ma demande ci dessus... S'il vous plait bien sur
Messages postés
3824
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 décembre 2020
37
arf ...
 tu as trouvé avant que ne poste ma réponse

enfin, au moins tu auras la réponse pour cacher la fenêtre dos

 
@+
Cirec

<hr size="2" />
Messages postés
45
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2009

Enfin on est arrivé au bout.... MMEEERRRCCCIII à tous les deux encore et encore merci!!!

Ca gère ça tourne trop bien merci.

Allez à la prochaine