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

Lazarus Pascal Discussion :

La boucle prend la main et empêche l'affichage [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut La boucle prend la main et empêche l'affichage
    bonjour à tous
    j'ai un soucis avec les boucles et Lazarus que j'utilise depuis peu.

    Je m'explique: j'ai un bouton, un memo et une boucle qui compte de 1 à 10000 avec affichage dans le mémo (et des labels).
    Je veux afficher avec les labels, au cours de comptage, différents étapes; quand le compte est à 1000, 4000 et 8000 par exemple.
    Le problème est que ces différents affichages (labels) ne se font qu'une fois la boucle terminée et non pas au fur et à masure du comptage. (l'affichage dans le mémo se fait normalement)
    Comment faire pour remedier à ce problème?
    (je n'avais pas çà sous Delphi)

    Merci à tous pour vos interventions et vos solutions

    Mon extrait de code...

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var   i:integer;
           s:string;
    begin
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if i>1000 then Label1.caption:='Etape 1 (1000)';
         if i>4000 then Label2.caption:='Etape 2 (4000)';
         if i>8000 then Label3.caption:='Etape 3 (8000)';
         str(i,s);
         Memo1.Lines.Add(s);
       end;
    end;

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour bienvenu,

    Utilises Application.ProcessMessages;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if i>1000 then 
     begin
       Label1.caption:='Etape 1 (1000)';
       Application.ProcessMessages;
     end;
    Ou sinon places le à la fin de ta boucle

    PS : Utilises la balise code # pour les bout de code. Merci d'avance

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse rapide
    Malheureusement çà ne change rien...
    (j'ai mis les balises)

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pubthi Voir le message
    Merci pour la réponse rapide
    Malheureusement çà ne change rien...
    (j'ai mis les balises)
    Je sais pas ce que tu as fait mais ça devrait fonctionner :

    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 TForm1.Button1Click(Sender: TObject);
    var   i:integer;
           s:string;
    begin
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if i>1000 then
         begin
           Label1.caption:='Etape 1 (1000)';
           application.ProcessMessages;
         end;
         if i>4000 then
         begin
           Label2.caption:='Etape 2 (4000)';
           application.ProcessMessages;
         end;
         if i>8000 then
         begin
           Label3.caption:='Etape 3 (8000)';
           application.ProcessMessages;
         end;
         str(i,s);
         Memo1.Lines.Add(s);     
       end;
    end;
    ou

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var   i:integer;
           s:string;
    begin
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if i>1000 then Label1.caption:='Etape 1 (1000)';
         if i>4000 then Label2.caption:='Etape 2 (4000)';
         if i>8000 then Label3.caption:='Etape 3 (8000)';
         str(i,s);
         Memo1.Lines.Add(s);
         application.ProcessMessages;
       end;
    end;
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Je sais pas ce que tu as fait mais ça devrait fonctionner :



    A+
    J'ai bien fait comme tu l'as proposé (les 2 solutions). Mais pas de changement...

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pubthi Voir le message
    J'ai bien fait comme tu l'as proposé (les 2 solutions). Mais pas de changement...
    Ton problème vient d'ailleurs quelle version de Lazarus utilises tu ? sous quel OS ? as tu d'autres parties de code dans ton application ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Ton problème vient d'ailleurs quelle version de Lazarus utilises tu ? sous quel OS ? as tu d'autres parties de code dans ton application ?
    Bonjour
    J'y ai pensé aussi. J'avais la version 2.0.2, j'ai maintenant la 2.0.10 avec win7. Sur d'autres Pc, même problème.
    Le code donné dans mon premier message n'est qu'un exemple. J'ai d'autres projets en cours avec ce problème. Tant que la boucle tourne, l'appli est "coincée", impossible de faire quoique ce soit, cliquer un bouton par exemple.

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 728
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 728
    Points : 15 128
    Points
    15 128
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Je sais pas ce que tu as fait mais ça devrait fonctionner :
    Tutafait !
    Ça fonctionne tout à fait bien, même sous Linux, même avec mon vieux 1.4 (le 2.0.10 n'est pas encore en prod'), et on peut même améliorer un poil :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var   i:integer;
           s:string;
    begin
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if i>1000 then Label1.caption:='Etape 1 (1000)';
         if i>4000 then Label2.caption:='Etape 2 (4000)';
         if i>8000 then Label3.caption:='Etape 3 (8000)';
         str(i,s);
         Memo1.Lines.Add(s);
         if i mod 20 = 0 then Application.ProcessMessages; // speed up !
       end;
    end;
    Ça permet de ne mettre à jour l'affichage qu'une fois tous les 20 tours de boucle : ça speede grave et ça laisse quand même respirer la machine,

    Citation Envoyé par pubthi Voir le message
    J'ai d'autres projets en cours avec ce problème. Tant que la boucle tourne, l'appli est "coincée", impossible de faire quoique ce soit, cliquer un bouton par exemple.
    C'est un grand classique. Il y a autre chose ailleurs qui coince…
    PS : on est tous passé par là, alors pas de panique,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    Le souci dans cette procédure c'est qu'on a une boucle infernale. On ne laisse pas "respirer" le CPU. ça boucle, ça boucle. D'ailleurs il faudrait regarder le gestionnaire de tâches pour voir l'occupation CPU du programme pendant l'exécution de cette procédure. On pourrait à la place utiliser un timer pour effectuer le comptage tous les x temps et tester quand on arrive à certaine valeurs.
    Ami calmant, J.P (sans T)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Bonjour bienvenu,

    Utilises Application.ProcessMessages;
    ""Les voies du "Lazarus" sont impénétrables""

    J'ai réinstallé Lazarus et.... çà fonctionne (avec 'Application.ProcessMessages' dans la boucle...)
    Allez savoir pourquoi...

    Merci à tous et surtout à BeanzMaster

  11. #11
    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
    Peut-être manquait-il une déclaration en uses rendant inopérant cet appel sous Windows ?
    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 !

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 728
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 728
    Points : 15 128
    Points
    15 128
    Par défaut
    Coucou Y.,

    Citation Envoyé par tourlourou Voir le message
    Peut-être manquait-il une déclaration en uses rendant inopérant cet appel sous Windows ?
    Hum hum, ça n'aurait pas passé la compil (ou alors ça se déglingue grave !)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    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
    Salut JP,
    C'est une bribe de souvenir de cas où une procédure multi-plateformes était ignorée sur certaines, simple DoNone là pour compatibilité.
    Au pire, je n'aurais proféré qu'une bêtise de plus
    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 !

  14. #14
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonjour à tous

    J'espère que tout le monde va bien dans ces moments difficiles !

    Donc permettez-moi de vous proposer mon code amélioré, je l'ai essaye il a fonctionné convenablement

    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
    procedure TForm1.Button1Click(Sender: TObject);
      var   i:integer;
           s:string;
    begin
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if  i=1001 then begin Label1.caption:='Etape 1 (1000)'; Application.ProcessMessages ;end;
         if  i=4001 then begin Label2.caption:='Etape 2 (4000)'; Application.ProcessMessages ;end;
         if  i=8001 then begin Label3.caption:='Etape 3 (8000)'; Application.ProcessMessages ;end;
         str(i,s);
         Memo1.Lines.Add(s);
       end;
    end;

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 728
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 728
    Points : 15 128
    Points
    15 128
    Par défaut
    Salut salut,
    Citation Envoyé par tourlourou Voir le message
    souvenir de cas où une procédure multi-plateformes était ignorée sur certaines, simple DoNone là pour compatibilité.
    Un petit exemple pour qu'on comprenne bien ?

    ---
    Citation Envoyé par FOCUS77 Voir le message
    Donc permettez-moi de vous proposer mon code amélioré, je l'ai essaye il a fonctionné convenablement
    amélioré ?
    Amuse-toi à rajouter un autre bouton avec une seule ligne de code genre label4.Caption := 'test'; tout en passant la boucle à while i<500000 do et tu verras que tu es bloqué, surtout si tu cliques après Label3.caption:='Etape 3 (8000)'; : ta boucle ne "respire" plus…
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    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
    Bonsoir Jean-Pierre,

    Malheureusement, si ma mémoire était meilleure et mon souvenir plus précis qu'une impression, j'aurais pu être plus affirmatif, mais ce n'est qu'un sentiment que je ne relie pas à un exemple précis jusqu'ici...

    Si je retrouve l'exemple, je ne manquerai pas de vous faire profiter de ma joie de l'avoir retrouvé !
    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 !

  17. #17
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Bonjour
    As tu pensé à utiliser les threads?
    Tel que tu as écrit ton code la boucle de comptage s’exécute dans le thread principal et bloque toute ton application.
    Une solution consiste à utiliser les threads en créant un thread dans lequel ta boucle va s'éxécuter et chaque fois que le compteur atteint une valeur définie tu apelle une fonction du thread principal qui rafraichi l'affichage.
    En résumé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
    //Création du thread et lanclement du thread
    //voir les différent article sur les threads sous lazarus
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.MajAffichage (S: String);      
    begin
     Memo1.Lines.Add(s);
     update;
    end;
    Dans le run du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
      i:=0;
      while  i<10000 do
      begin
         i:=i+1;
         if  i=1001 then MajAffichage('Etape 1 (1000)');
         if  i=4001 then MajAffichage(''Etape 2 (4000)'
         if  i=8001 then MajAffichage(''Etape 3 (8000)';    
       end;
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

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

Discussions similaires

  1. Application qui prend la main sur l'OS
    Par reggaerai dans le forum Android
    Réponses: 1
    Dernier message: 27/03/2014, 12h06
  2. Réponses: 3
    Dernier message: 27/02/2010, 10h10
  3. Mon style empêche l'affichage de l'image
    Par Invité dans le forum Silverlight
    Réponses: 3
    Dernier message: 27/02/2009, 18h43
  4. Réponses: 7
    Dernier message: 22/10/2007, 20h54
  5. Réponses: 15
    Dernier message: 19/09/2006, 20h28

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