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 :

Dilemne à propos de boucles


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut Dilemne à propos de boucles
    Hello,
    Je tente de construire un programme où un personage est dirigé par l'utilisateur. Je débute donc pour l'instant le programme se passe comme suit:
    L'utilisateur place un premier point en cliquant sur la fiche puis reclique sur un point ayant soit la meme abscisse soit la meme ordonnée (pour tracer un segment quoi) ainsi j'initialise une boucle qui du point de départ jusquà l'arrivée va dessiner un rectangle sur chaque point du segment. Jusque là ça marche tres bien... Le probleme vient du fait que ça plante lorsque l'on tente de changer de destination (ex: je clique sur le point (50,100) et sur (50,150) pour tracer un segment vertical "descendant" puis je reclique (avant que ce segment soit fini) sur le point (50,50) résultat: ça bug (normal).
    Ma question est donc: faut-il utiliser un "break" lorsque l'on change de destination ? ou ya t'il une solution plus "propre" ?

    Ci dessous la procédure du clic sur la fiche:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    Procedure TForm1.FormClick(Sender: TObject);
    var X,Y:integer;
    Begin
      If Firstpoint Then   //Premier point -> devient le pt de départ
      Begin
        Form1.Canvas.Penpos := Souris  ;
        Form1.Canvas.rectangle (Souris.X-2,Souris.Y-2,Souris.X+2,Souris.Y+2);
        Dep.X := Souris.X;
        Dep.Y := Souris.Y;
        Label1.Caption := IntToStr(Dep.X) + ' ; ' + IntToStr(Dep.Y);
        Firstpoint := False;
      End
      Else    // Cas où le premier point est déjà posé
      Begin
        Form1.Canvas.LineTo (Souris.X,Souris.Y);
        Arr.X := Souris.X;
        Arr.Y := Souris.Y;
        Label2.Caption := IntToStr(Arr.X) + ' ; ' + IntToStr(Arr.Y);
        X:= Dep.X; Y := Dep.Y;
        If (Dep.X = Arr.X) Then            //Déplacement Vertical
          If (Dep.Y < Arr.Y) Then          //Haut en Bas
          Repeat
            Form1.Canvas.Rectangle(X-2,Y-2,X+2,Y+2);
            Y:=Y+1;
            Pause(1);
          Until (Y = Arr.Y)
          Else                             //Bas en Haut
          Repeat
            Form1.Canvas.Rectangle(X-2,Y-2,X+2,Y+2);
            Y:=Y-1;
            Pause(1);
          Until (Y = Arr.Y)
         Else If (Dep.Y = Arr.Y) Then      //Déplacement Horizontal
                If (Dep.X < Arr.X) Then    //Gauche à Droite
                Repeat
                  Form1.Canvas.Rectangle(X-2,Y-2,X+2,Y+2);
                  X:=X+1;
                  Pause(1);
                Until (X = Arr.X)
                Else                       //Droite à Gauche
                Repeat
                  Form1.Canvas.Rectangle(X-2,Y-2,X+2,Y+2);
                  X:=X-1;
                  Pause(1);
                Until (X = Arr.X);
       End;

  2. #2
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Salut!

    Il m'arrive de donner des cours de prog et voici comment j'introduis les 3 boucles Delphi aux étudiants:
    1. La boucle for est utilisée quand on sait combien d'itération on doit faire
    2. la boucle repeat est utilisée quand on sait qu'on doit exécuter le code au moins une fois mais quand on ne sait pas combien de fois on doit répéter l'exécution
    3. La bouche while est utilisée quand on ne sait pas combien de passages on doit faire
    Donc, en théorie, la boucle while devrait être utilisée pour répondre à tes besoins en ce sens on te ne sais pas précisément quand elle doit s'arrêter (à la fin de la ligne ou à l'intervention de l'utilisateur qui clique pour descendre).

    C'était la théorie, maintenant la pratique .

    Personellement, j'utiliserais le Break dans un for. Je ne sais pas ce que propre veut dire exactement mais je sais que ce n'est pas plus lourd à exécuter (une fois en assembleur, je crois que c'est pas mal du pareil au même) et que c'est plus clair à lire quand vient le temps de débugger. Aussi, tu connais la limite supérieure de ton itération (c'est le bout de la ligne) mais EN PLUS tu peux avoir à sortir de la boucle compte tenu du choix de l'utilisateur. Le Break a sa place ici à mon avis.

    Bon dev!

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Par défaut
    Une autre chose que tu peux faire c'est mettre la propieté du compo Enable = false et a la fin du boucle, le remetre a true, no?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    Daccord merci Slimjoe, en effet une boucle while parait plus judicieuse. Jvais donc réécrire le code.
    @Cadetill: Si je met le compo sur disabled je ne pourrais plus cliquer dessus et changer de direction quand je le souhaite n'est-ce pas ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Par défaut
    Citation Envoyé par LeFlou
    @Cadetill: Si je met le compo sur disabled je ne pourrais plus cliquer dessus et changer de direction quand je le souhaite n'est-ce pas ?
    jejeje, je n'ai pas lu bien ta question

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 69
    Par défaut
    J'ai bougé ma procédure de Click vers MouseDown (procédure déclenchée par relachement de bouton) et réecrit les boucles en While cependant je ne sais pas comment formuler une condition "tant que l'on a pas tracé les points du segment et que la procédure n'est pas appellé (de nouveau)" cad si l'on reclique durant le traçage du segment on arrete de tracer on retrace un nouveau avec les nouveaux parametres... Cela a voir avec la récursivité ?

    Ci dessous la procédure:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Var A,B:Integer;    // X <=> A | Y <=> B
    Begin
      If Button = mbLeft then
      If Firstpoint Then   //Premier point -> devient le pt de départ
      Begin
        Form1.Canvas.Penpos := Souris  ;
        Form1.Canvas.rectangle (Souris.X-2,Souris.Y-2,Souris.X+2,Souris.Y+2);
        Dep.X := Souris.X;
        Dep.Y := Souris.Y;
        Label1.Caption := IntToStr(Dep.X) + ' ; ' + IntToStr(Dep.Y);
        Firstpoint := False;
      End
      Else    // Cas où le premier point est déjà posé
      Begin
        Form1.Canvas.LineTo (Souris.X,Souris.Y);
        Arr.X := Souris.X;
        Arr.Y := Souris.Y;
        Label2.Caption := IntToStr(Arr.X) + ' ; ' + IntToStr(Arr.Y);
        A:= Dep.X; B := Dep.Y;
        If (Dep.X = Arr.X) Then            //Déplacement Vertical
          If (Dep.Y < Arr.Y) Then          //Haut en Bas
          While (B <> Arr.Y) Do
          Begin
            Form1.Canvas.Rectangle(A-2,B-2,A+2,B+2);
            B:=B+1;
            Pause(1);
            Refresh;
          End
          Else                             //Bas en Haut
          While (B <> Arr.Y) Do
          Begin
            Form1.Canvas.Rectangle(A-2,B-2,A+2,B+2);
            B:=B-1;
            Pause(1);
            Refresh;
          End
         Else If (Dep.Y = Arr.Y) Then      //Déplacement Horizontal
                If (Dep.X < Arr.X) Then    //Gauche à Droite
                While (A <> Arr.X) Do
                Begin
                  Form1.Canvas.Rectangle(A-2,B-2,A+2,B+2);
                  A:=A+1;
                  Pause(1);
                  Refresh;
                End
                Else                       //Droite à Gauche
                While (A <> Arr.X) Do
                Begin
                  Form1.Canvas.Rectangle(A-2,B-2,A+2,B+2);
                  A:=A-1;
                  Pause(1);
                  Refresh;
                End
      End;
     
    End;

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. ASP petit problème à propos sur une boucle if
    Par nicodu59 dans le forum ASP
    Réponses: 2
    Dernier message: 02/08/2007, 10h21
  3. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  4. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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