Bar de progression lors de l'installation d'un MSI

Résolu
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009 - 30 janv. 2007 à 11:15
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009 - 2 févr. 2007 à 11:19
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

obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 14:56
Génial merci !!!
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 16:34
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...
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2007 à 16:48
essaye comme ceci :

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

 
@+
Cirec

<hr size="2" />
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
31 janv. 2007 à 16:55
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 !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 17:02
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!!!
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2007 à 17:09
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" />
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2007 à 17:13
es tu certain d'avoir mis un XPManifest sur ta Form

parce que sans ça ne fonctionne pas
 
@+
Cirec

<hr size="2" />
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
31 janv. 2007 à 17:13
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.
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 17:18
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.
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 17:32
Est ce que par hasard je dois faire une incrémentation de PrograssBar1.Position quelque part??? Ou tout est géré dans NewProgressBar???
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2007 à 17:42
non tout est géré automatiquement dans NewProgressBar

 
@+
Cirec

<hr size="2" />
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
31 janv. 2007 à 17:53
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 ?
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
31 janv. 2007 à 18:41
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 ...
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
31 janv. 2007 à 19:50
Ahhh, j'ai trouvé une solution: je la poste dans une heure à peu près ...

A bientot donc ...
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
1 févr. 2007 à 12:00
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.
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
1 févr. 2007 à 16:43
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 févr. 2007 à 17:52
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" />
0
obitskater Messages postés 45 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 13 mars 2009
2 févr. 2007 à 11:19
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
0
Rejoignez-nous