IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

incrémenter TProgressBar d'un autre form


Sujet :

Composants VCL Delphi

  1. #1
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut incrémenter TProgressBar d'un autre form
    bonjour,

    depuis ce matin je cherche à réaliser une progressbar dans la bare de status de mon formulaire principal. jusque là pas de soucis.

    les choses se compliquent au moment d'incrémenter la valeur de ma progressBar. en effet l'endroit où j'aimerais appliquer cette incrémentation est au niveau de l'affichage d'un autre form qui est assez long(car beaucoup de composants)

    ma question : comment realiser cette incrémentation ? (on m'a parlé de threads mais je n'ai pas encoure touché à ça)

    formPrincipal (au moment d'afficher la deuxieme form) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TfrmMain.mnuPlanMoisClick(Sender: TObject);
    begin
    frmPlanMois.Show;
    end;
    deuxieme form qui au niveau de la méthode 'show' realise une boucle pour creer des composants graphiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    procedure TfrmPlanMois.FormShow(Sender: TObject);
    var
    month : integer;
    year : integer;
    i : integer;
    day : integer;
    item : TPlannerItem;
    begin
    plMonth.Caption.Title := ' Planning du mois de '+ FormatDateTime('mmmm', Now);
    day := StrToInt(FormatDateTime('dd',Now));
    month := StrToInt(FormatDateTime('mm',Now));
    year := StrToInt(FormatDateTime('yyyy',Now));
    plMonth.Positions := MonthDays[isLeapYear(year)][month];
    plMonth.Header.Captions.Clear;
    plMonth.Footer.Captions.Clear;
     for i := 0 to plMonth.Positions do
              begin
                   if i = 0 then
                      plMonth.Header.Captions.Add('')
                   else
                      plMonth.Header.Captions.Add(FormatDateTime('dd/mm/yyyy', Now - day + i));
              end;
     
    plannerCreateItems;
    end;

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    et Quel est le problème ?
    pour ne pas mettre dans la TfrmMain une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TfrmMain.ChangeProgressBar(Pourcent: Integer);
    begin
         StatusBar.Panels[2].Text := IntToStr(Pourcent);
         StatusBar.Refresh(); // va forcer un OnDrawPanel, et c'est moins lourd qu'un Application.ProcessMessages();
    end;
     
    procedure TfrmMain.StatusBarDrawPanel(StatusBar: TStatusBar;
      Panel: TStatusPanel; const Rect: TRect);
    var
       MyRect: TRect;
    begin
         MyRect.Left := Rect.Left;
         MyRect.Right := Rect.Left + Round((Rect.Right - Rect.Left) * StrToInt(StatusBar.Panels[2].Text) / 100);
         MyRect.Top := Rect.Top;
         MyRect.Bottom := Rect.Bottom;
         StatusBar.Canvas.Pen.Color := clNavy;
         StatusBar.Canvas.Brush.Color := clNavy;
         StatusBar.Canvas.FillRect(MyRect);
    end;
    et dans le code TfrmPlanMois, l'appeler via son pseudo-singleton (la variable automatiquement créé frmMain: TfrmMain)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frmMain.ChangeProgressBar(1);
    utiliser un Thread pour manipuler la VCL c'est exactement ce qu'il ne faut pas faire ... très mauvais conseils !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    le probleme c'est que le pseudo-singleton n'est pas crée, je n'ai pas acces à la fenetre frmMain depuis la fenetre frmPlanMois

  4. #4
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Je créérais un événement dans la forme principale que je brancherais à une méthode la 2ème fiche. Donc si la deuxième fiche doit faire des modifications, elle le faira à travers cette méthode.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    Il n'est pas créé ? c'est rare, normalement, il est indispensable si l'on fait un Application.CreateForm dans le DPR ?
    Surtout que je n'ai pas vu d'instanciation de frmPlanMois, on peut supposer qu'il est aussi créer ...

    si tu ne veux pas passer par une variable globale tu peux faire, ou que tu ne veux pas que frmPlanMois fasse un uses de frmMain ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TfrmMain.mnuPlanMoisClick(Sender: TObject);
    begin 
      frmPlanMois.StatusBarExterne := StatusBar1;
      frmPlanMois.Show;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    type
      TfrmPlanMois = class(TForm)
      ...
      private
        FStatusBarExterne: TStatusBar; 
        procedure ChangeProgressBar(Pourcent: Integer);
      public
        property StatusBarExterne: TStatusBar read FStatusBarExterne write FStatusBarExterne;
       end;
     
    ...
    procedure TfrmPlanMois.ChangeProgressBar(Pourcent: Integer);
    begin
         StatusBarExterne.Panels[2].Text := IntToStr(Pourcent);
         StatusBarExterne.Refresh(); // va appeler frmMain.OnDrawPanel
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    j'ai implémenté votre solution mais la progress bar ne progresse pas, pourtant avec des show message j'ai bien vu que l'incrémentation se faisait au bon endroit ... je pense que le probleme est du au refresh ...

    mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TfrmMain.FormShow(Sender: TObject);
    begin
    lblDate.Caption := lblDate.Caption +  ' ' + DateToStr(Now);
    lblBvnu.Caption := 'NOM Prénom, '+ lblBvnu.Caption;
    pbStatus.Parent:=stsBar;
    stsBar.Panels[1].style := psOwnerDraw;
    pbStatus.SetBounds(stsBar.Panels[0].Width, 2, 200, stsBar.Height-2);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TfrmMain.mnuPlanMoisClick(Sender: TObject);
    begin
    frmPlanMois.StatusBarExterne := stsBar;
    frmPlanMois.Show;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    type
      TfrmPlanMois = class(TForm)
        plMonth: TPlanner;
        FStatusBarExterne: TStatusBar;
        procedure FormShow(Sender: TObject);
        procedure setInactiveDays;
        procedure plannerCreateItems;
        procedure plMonthItemDblClick(Sender: TObject; Item: TPlannerItem);
        procedure ChangeProgressBar(Pourcent: Integer);
        private
        { Déclarations privées }
      public
         property StatusBarExterne: TStatusBar read FStatusBarExterne write FStatusBarExterne;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TfrmPlanMOis.ChangeProgressBar(Pourcent: Integer);
    begin
       StatusBarExterne.Panels[1].Text := IntToStr(Pourcent);
       StatusBarExterne.Refresh;
    end;

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 940
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 940
    Par défaut
    Ce n'est pas en affichant du texte sur la StatusBar que ça va incrémenter ta ProgressBar

    Il te faut une référence à la ProgressBar atteignable depuis ta 2ème fiche.

  8. #8
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    bonjour, je suis novice en delphi, pourriez vous m'indiquer comment proceder ?

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 940
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 940
    Par défaut
    Même principe que la StatusBar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TfrmMain.mnuPlanMoisClick(Sender: TObject);
    begin
    frmPlanMois.StatusBarExterne   := stsBar;
    frmPlanMois.ProgressBarExterne := pbStatus;
    frmPlanMois.Show;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type
      TfrmPlanMois = class(TForm)
        FStatusBarExterne: TStatusBar;
        FProgressBarExterne: TProgressBar;
        ...
        private
        { Déclarations privées }
      public
         property StatusBarExterne: TStatusBar read FStatusBarExterne write FStatusBarExterne;
         property ProgressBarExterne: TProgressBar read FProgressBarExterne write FProgressBarExterne;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TfrmPlanMOis.ChangeProgressBar(Pourcent: Integer);
    begin
       ProgressBar.Position := Pourcent;
       StatusBarExterne.Panels[1].Text := IntToStr(Pourcent);
       StatusBarExterne.Refresh;
    end;

  10. #10
    Membre Expert
    Avatar de vpourchet
    Homme Profil pro
    Integrateur Systemes & Virtualisation
    Inscrit en
    Avril 2008
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Integrateur Systemes & Virtualisation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 159
    Par défaut
    merci beaucoup cela fonctionne

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 493
    Par défaut
    salut

    plutot que de passer un Tprogressbar
    j'aurai joué avec les événements

    si tu fait tes traitement dans un datamodule ou un objet non graphique
    tu va avoir du mal a utiliser cette technique


    @+ Phil

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 096
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ce n'est pas en affichant du texte sur la StatusBar que ça va incrémenter ta ProgressBar

    Il te faut une référence à la ProgressBar atteignable depuis ta 2ème fiche.
    L'Exemple montrait comment dessiné directement une barre de progression via TStatusBar.OnDrawPanel (appelé indirectement par le Refresh) dans une TStatusBar ... j'aurais du répéter systématiquement ce gestionnaire, semble que Values25 n'avait pas suivi l'affaire ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 940
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 940
    Par défaut
    J'avais pas tout lu non plus. Je n'ai réagis que sur son dernier post

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Utilisation d'une variable dans une autre form (!)
    Par neuropathie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2005, 13h09
  2. Réponses: 4
    Dernier message: 07/10/2005, 21h54
  3. Comment insérer une form dans une autre form ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/07/2005, 11h15
  4. [C#] Acceder à la méthode d'une autre form
    Par dacid dans le forum Windows Forms
    Réponses: 35
    Dernier message: 23/03/2005, 14h49
  5. Comment basculer le focus depuis une autre form ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/09/2003, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo