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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    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
    Membre Expert
    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
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  4. #4
    Membre Expert
    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
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    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
    Membre Expert
    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
    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
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    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,

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 247
    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)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    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

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    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 !

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    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 !)

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 938
    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 !

+ 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