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

Langage Delphi Discussion :

Rendre visible un Label dès le début d'une procédure


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Rendre visible un Label dès le début d'une procédure
    Bonjour et heureuse année 2014 à tous.

    Un bouton appelle la procedure ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure Sauvegarde;
    var I,T:integer;
    begin
      LabelCopie.Visible:=True;T:=LabelCopie.Top;
      for I:=0 to IFin do
        begin
          LabelCopie.Top:=T+I*12;
          Traitement;
        end;
    end;
    A l'appel de Sauvegarde LabelCopie.Visible est False.

    Traitement est une sous-procedure qui copie des fichiers et prend plusieurs dizaines de secondes.

    Avec Sauvegarde telle qu'elle est ci-dessus LabelCopie n'apparait qu'après la clôture de la procedure.

    Comment faire pour que LabelCopie apparaisse dès l'instruction LabelCopie.Visible et que son .Top soit effectivement modifié à chaque itération de I.

    J'ai vainement cherché dans les FAQ et n'ai rien trouvé.

    Merci d'avance.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Application.ProcessMessages après chaque changement de Top mais ça va grandement ralentir le temps de traitement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Rendre visible un label.....
    Un grand merci, Andnotor, ça marche super bien.

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Attention, Application.processMessages traite tous les messages en attente, y compris les click sur des boutons qui auraient lieu pendant ton traitement.
    Tu peux alternativement utiliser la méthode Update, qui va traiter uniquement les messages d'affichage en attente, ou alors la méthode Repaint, qui va forcer le redessin de ton label.
    Il faut peut-être que tu appelle la méthode sur le parent de ton label, à vérifier.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Rendre visible un label.....
    Merci guillemouze pour tes précisions.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re : rendre visible un Label dès le début d'une procédure
    Bonjour à tous.

    Ma question initiale a été résolue parfaitement par adjonction de Application.ProcessMessages ou Update.

    Question subsidiaire sur laquelle je sèche :

    Comment rendre le Label clignotant lorsqu'il est visible (ou pas) de façon à attirer l'attention de l'utilisateur.

    Merci d'avance.

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    un Timer dont l'événement OnTimer bascule la propriété Visible, et loge dans la propriété Tag le nombre de clignotements effectués pour se désactiver (Enabled:=False) lorsqu'il aura atteint une certaine limite.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re : rendre visible un Label dès le début d'une procédure
    Merci Tourlourou,

    J'ai essayé mais le Timer s'arrête dès après la première bascule.

    Je pense que le problème se situe dans la position respective des instructions et des Application.ProcessMessages mais je ne suis pas arrivé à trouver une combinaison telle que le Timer continue à être actif.

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    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
    procedureTForm1.MyOnTimer(Sender: TObject);
    var
      aTimer: TTimer;
    begin
      Label1.Visible := not Label1.Visible ;
      aTimer := Sender as TTimer;
      Dec(aTimer.Tag);
      if aTimer.Tag<1 then
      begin
        Label1.Show;
        aTimer.Enabled:=False;
      end 
    end;
     
    //...
    begin
      //...
      Label1.Show;  
      Timer1.Interval:=300;
      Timer1.OnTimer:=MyOnTimer;
      Timer1.Tag:=15;
      Timer1.Enabled:=True;
      //..
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re : rendre visible un Label dès le début d'une procédure
    Merci Tourlourou.

    Pour être honnête je n'ai pas bien saisi le code que tu proposes. Mon problème n'a de plus probablement pas été bien exposé.

    C'est pourquoi je le pose ci-dessous d'une façon plus claire et plus simple.

    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
     
    procedure Routine;
    var I,N:integer;
    begin
      Form1.Label1.Visible:=True;
      Application.ProcessMessages;
    //Pause
      for I:=0 to 5 do
      begin
        N:=0;
        repeat
        Inc(N);
        until N>2000000000;
      end;
    //Fin de Pause
      Form1.Label1.Visible:=False;
    end;
    Un bouton appelle la procedure Routine. Avant l'exécution la propriété Visible de Label1 est False.

    Les lignes entre Pause et Fin de Pause simulent le temps pris en réalité par des copies de fichiers. Avec mon PC qui n'est pas très récent Pause dure environ 15 secondes.

    Comment faire pour que pendant ces 15 secondes Label1 clignote ?

    Merci d'avance.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    C'est toujours le même problème : ta boucle bloque le traitement des messages. Application.ProcessMessages doit être dans la boucle.
    Pour s'en passer, il faudrait que la copie des fichiers se fasse dans un thread secondaire (ce qui serait de toute façon nettement mieux).

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re : rendre visible un Label dès le début d'une procédure
    Merci encore à tous les deux.

    Je vais pousser mes investigations du coté des threads comme tu le suggères, Andnotor.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Rendre visible un label.....
    Bonjour à tous,

    Comme suggéré par Andnotor j'ai mis en place un thread secondaire et ça marche super bien.

    Maintenant je voudrais afficher un message à la sortie du thread et je pense que pour cela il faut que j'appelle un MessageDlg ou un ShowMessage dans l'évènement OnTerminate du thread.

    Mais je dois être plus c.. que la moyenne car je n'arrive pas à trouver comment il faut faire pour afficher à l'écran OnTerminate et y écrire du code.

    Merci de votre aide en détaillant bien comment procéder.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Simplement déclarer une procédure qui respecte le prototype TNotifyEvent :
    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
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        Thread :TMyThread;
        procedure ThreadTerminated(Sender :TObject); //<---
      end;
     
    implementation
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Thread := TMyThread.Create;
      Thread.OnTerminate := ThreadTerminated; //<---
    end;
     
    procedure TForm1.ThreadTerminated(Sender: TObject);
    begin
      ShowMessage('Blabla');
    end;

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Rendre visible un label.....
    Merci Andnotor.

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

Discussions similaires

  1. cfform : rendre non visible le label d'un cfselect
    Par reneguenon dans le forum Coldfusion
    Réponses: 0
    Dernier message: 23/04/2010, 10h06
  2. [WPF] [C#] Rendre visible un label
    Par seemax dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 05/11/2009, 11h49
  3. [AC-2003] Rendre visible le label d'une listbox
    Par manbas dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/08/2009, 19h47
  4. [Toutes versions] Rendre visible l'intitulé suivant le résultat d'une requête
    Par jeje22 dans le forum IHM
    Réponses: 5
    Dernier message: 21/04/2009, 14h04
  5. rendre visible ou invisible une picture (icon)
    Par Robleplongeur dans le forum MFC
    Réponses: 3
    Dernier message: 18/05/2004, 12h23

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