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

Delphi Discussion :

problème avec repeat until


Sujet :

Delphi

  1. #1
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut problème avec repeat until
    Salut à tous,
    je voudrais faire une boucle pour que dans une case cela compte de 1 jusque 30 . j'ai fait le code ci-dessous mais cela ne fonctionne pas très bien quand je lance le programme et que j'appuie sur le bouton il faut attendre et puis le chiffre 30 s'inscrit. pouvez-vous me dire où ça bug
    merci


    procedure TForm1.Button10Click(Sender: TObject);
    begin
    i:=1;
    repeat
    i:=i+1;
    delay(1000);
    j:=inttostr(i);
    edit3.text:= j ;
    until i=30;
    end;

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Par défaut
    C'est tout à fait normal!

    En fait, lorsque tu clique sur le bouton, la procédure se lance sans jamais rendre la main aux autre fonctions du programme, notemment celles chargées de rafraichir ton composant Edit.

    Pour autoriser le gestionnaire d'événenment à traiter ses informations, il faut que tu ajoutes la ligne Application.ProcessMessages; dans ta boucle (juste avant le until).


    Cela va en quelque sorte laisser le temps au gestionnaire d'événement de travailler.

  3. #3
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    le problème vient de ta procédure Delay qui bloque le programme, donc la mise à jour de l'affichage des ton composants graphiques (et notemment ton Edit3). Essaye de placer Application.ProcessMessages() à la suite du Delay

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Par défaut
    PS: si tu veux faire un compteur sur 30 secondes, tu ferais mieux d'utilier un timer plutot qu'un delay(1000)

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Par défaut
    Citation Envoyé par denokan
    le problème vient de ta procédure Delay qui bloque le programme, donc la mise à jour de l'affichage des ton composants graphiques (et notemment ton Edit3). Essaye de placer Application.ProcessMessages() à la suite du Delay

    Le delai n'a rien à voir dans cette histoire... Même sans, son programme ne rafraichira pas le composant Edit tant que le gestionnaire des événements n'aura pas repris la main.

  6. #6
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut ça fonctionne
    Salut,

    merci Gaadek pour l'astuce, cela fonctionne mais maintenant je voudrais arrêter la boucle non pas quand cela arrive à un chiffre mais par l'appui d'une touche du clavier. mais je sais pas trop comment faire alors si vous pouvez m'éclairer se serait sympa

    merci

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Par défaut
    Utilise l'événement OnKeyDown sur ton controle form.

    Lorsque cet événement est appelé, tu testes la touche qui est pressée (variable key) et tu mets à jour une variable globale.

    Cette variable globale doit alors être ajoutée dans la condition de ton pas until.

    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
     
    var
      StopLoop: boolean = false;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:  ShiftState);
    begin
      if(Key = VK_F1) then
        StopLoop := true;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
    begin
      StopLoop := false;
      repeat
      ...
      until (i<30) and not StopLoop
    end;
    Si tu appuyes sur la touche F1, ta boucle stoppe...

  8. #8
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut ça bug
    salut gaadek,

    il me met la ligne :
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: ShiftState);
    en erreur :
    [Erreur] Unit1.pas(31): Identificateur non déclaré : 'ShiftState'
    [Erreur] Unit1.pas(31): ';' attendu(e) mais '(' trouvé(e)
    [Erreur] Unit1.pas(31): Identificateur non déclaré : 'FormKeyDown'

    que dois-je faire ?
    merci

  9. #9
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut problème
    Salut,

    ça marche , j'ai trouvé .je crois qu'il y avais une erreur ds la ligne .j'ai trouvé la même ligne sur le web. mais qd je fais tourner le programme il commence à 1 et puis s'arrête




    var
    Form1: TForm1;
    StopLoop: boolean;
    i:integer;
    j:string;

    implementation

    {$R *.dfm}
    procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
    begin
    if(Key = VK_F1) then
    StopLoop := true;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    close;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    i:=0;
    StopLoop := false;
    repeat
    i:=i+1;
    j:=inttostr(i);
    edit1.text:=j;
    delay(2000);
    Application.ProcessMessages;
    until ( not StopLoop);
    end;

    end.

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 917
    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 917
    Billets dans le blog
    6
    Par défaut
    il y avait une petite erreur sur le sens de la comparaison :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    var
     Form1: TForm1;
     StopLoop: boolean;
     
    implementation
     
    {$R *.dfm}
    procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
    begin
     if(Key = VK_F1) then
      StopLoop := true;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     close;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i: integer; // mieux en local
     s: string;
    begin
     i:=0;
     StopLoop := false;
     repeat
      i:=i+1;
      s:=inttostr(i);
      edit1.text:=s;
      delay(2000);
      Application.ProcessMessages;
     until StopLoop; // on veut s'arrêter quand il est mis vrai par la pression de F1
    end;
     
    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 !

  11. #11
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut encore un petit problème
    Salut,
    ça fonctionne mais cela recommence à 1 au lieu de stopper
    que faut-il faire ?
    merci

  12. #12
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 917
    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 917
    Billets dans le blog
    6
    Par défaut
    dans ce cas, il faut remettre la déclaration de i en global
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
    // i:=0; ne pas remettre à 0 à chaque entrée
     StopLoop := false;
     repeat
      Inc(i);
      s:=inttostr(i);
      edit1.text:=s;
      delay(2000);
    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 !

  13. #13
    Membre averti Avatar de KHEOPS1982
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 60
    Par défaut bug encore
    Salut,
    ça ne fonctionne toujours pas. qd j'appuie sur la touche . ça s'arrête puis cela repart en sautant un chiffre. exemple : j'arrête à 31 ça arrête puis repart à 33

    var
    Form1: TForm1;
    StopLoop: boolean;
    i: integer;
    s: string;
    implementation

    {$R *.dfm}
    procedure FormKeypress(Sender: TObject; var Key: Word;Shift: TShiftState);
    begin
    if(Key = VK_escape) then StopLoop := true;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    close;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    StopLoop := false;
    repeat
    Inc(i);
    s:=inttostr(i);
    edit1.text:=s;
    delay(2000);
    Application.ProcessMessages;
    until StopLoop;
    end;

  14. #14
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Essais donc ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button10Click(Sender: TObject);
    begin
         i:=1;
        repeat
          i:=i+1;
          delay(1000);
          j:=inttostr(i);
          edit3.text:= j ;
         Edit3.Refresh;
        until i=30;
    end;
    Ou bien ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button10Click(Sender: TObject);
    Var 
        I : integer;
    
    begin
         For  i:= 1 To 30 Do
          begin
              delay(1000);
              j:=inttostr(i);
              edit3.text:= j ;
         Edit3.Refresh;
        end;
    end;
    A+

Discussions similaires

  1. Problème avec repeater
    Par redz_1988 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 15/03/2012, 13h03
  2. Problème avec repeater imbriqués
    Par polux31 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 05/04/2011, 15h11
  3. Problème avec Do until
    Par nicolasferraris dans le forum ASP
    Réponses: 16
    Dernier message: 14/10/2008, 12h27
  4. Problème avec asp:repeater et injection de js
    Par lutecefalco dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/05/2007, 12h12
  5. problème avec "repeat"
    Par chti_juanito dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/06/2006, 15h10

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