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 :

Affectation de variable boucle FOR à l'intérieur d'une boucle WHILE


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Affectation de variable boucle FOR à l'intérieur d'une boucle WHILE
    Bonjour

    Suivant mon compilo, je me trouve devant un blème d'affectation à ma variable de boucle FOR 'E'.
    Je veux dire, seulement lorsque j'intègre les premières lignes de code faisant défiler toutes les lettres présentes de l'Edit.
    (J'ai donc disposé ici autrement le code afin de mieux présenter mon but)

    Bref, je ne trouve pas comment faire afin que la variable (char) 'C' tourne aussi dans ma boucle While.

    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
    procedure TForm1.btnEssaiClick(Sender: TObject);
    var
      T, E, L: Integer;
      C: Char;
    begin
      T := 120; 
      E := 80;
     
      L := Length(Edit1.Text);
      For E := 1 to Length(Edit1.Text) do
      begin
        C := Edit1.Text[E];
        // ShowMessage(C);
      end;
     
     
      While (E < T) do
      begin
        beep;
        Edit1.Text := Edit1.Text + C;
        E := E + 1;
      end;
     
    end;
    Donc, comment faire afin que la variable "C" à l'intérieur de ma boucle White "tourne" et ne redonne pas toujours le même char.

    Merci d'avance de vos conseils, car pour l'instant ça...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 454
    Points : 24 866
    Points
    24 866
    Par défaut
    Ta demande n'a pas de sens, on ne sait pas ce que tu veux faire, un algo ce n'est pas un truc magique, tu as une entrée, une sortie et un traitement ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Complément détaillé d'explication
    Hello ShaiLeTroll,

    Si si, ma demande à un sens, mais pas facile d'expliquer...

    Je souhaite ajouter x caractères après une string, mais en reprenant exactement les mêmes caractères présents, exemple :

    "ShaiLeTroll n'est pas un véritable troll"
    Je souhaite que cela devienne suivant condition :
    "ShaiLeTroll n'est pas un véritable troll ShaiLeTroll n'est pas un vé"
    Tu vois en gras, la répétition de la string d'origine. Cette répétition doit être stoppée en longueur suivant valeur variable.

    Alors que pour l'instant je n'arrive qu'à :
    "ShaiLeTroll n'est pas un véritable troll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll"

    Je viens de simplifier le code en regroupant tout dans cette boucle While :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      While (E < T) do
      begin
        beep;
        For E := 1 to Length(Edit1.Text) do  
        C := Edit1.Text[E];
        //ShowMessage(C);
        Edit1.Text := Edit1.Text + C;
        E := E + 1;
      end;
    Mais il me manque la possibilité d'ajouter après le do du For un begin.

    Bref toujours au même point mais en ayant cette fois une seule boucle.

  4. #4
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Encore un code plus causant :

    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
    procedure TForm1.btnEssai2Click(Sender: TObject);
    var
      T, E, L: Integer;
      C: Char;
      S: String;
    begin
      T := 40;  // longueur Totale de référence
      E := 20;  // longuer Ecrite de base
      S := 'La meilleure façon d''apprendre...';
     
      While (E < T) do
      begin
        beep;
        For E := 1 to Length(S) do
        C := S[E];
        //ShowMessage(C);
        S := S + C;
        E := E + 1;
        ShowMessage(S);
      end;
    end;
    Si seulement le dernier char était autre chose que la dernière lettre de la string

    Le but est d'ajouter la même string au string d'origine et non le dernier caractère.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hio,
    Citation Envoyé par Droïde Système7 Voir le message
    Encore un code plus causant :

    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
    procedure TForm1.btnEssai2Click(Sender: TObject);
    var
      T, E, L: Integer;
      C: Char;
      S: String;
    begin
      T := 40;  // longueur Totale de référence
      E := 20;  // longuer Ecrite de base
      S := 'La meilleure façon d''apprendre...';
     
      While (E < T) do
      begin
        beep;
        For E := 1 to Length(S) do
        C := S[E];
        //ShowMessage(C);
        S := S + C;
        E := E + 1;
        ShowMessage(S);
      end;
    end;
    Si seulement le dernier char était autre chose que la dernière lettre de la string

    Le but est d'ajouter la même string au string d'origine et non le dernier caractère.
    C'est quoi ce code ?

    Tu es sûr qu'il fait ce que tu penses ?

    Si oui, pourquoi cette boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        For E := 1 to Length(S) do
        C := S[E];
    qui revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E := Length(S);
    C := S[E];
    Tu n'aurais pas oublié de délimiter un bloc par begin end; ?

    Accessoirement, la norme indique que rien ne garantit la validité de la valeur d'une variable contrôlant une boucle for, une fois sortit de la boucle (même si c'est la cas pour tous les compilateurs que je connais, on ne doit pas compter là-dessus).
    [C'est pour le cas où je me tromperais, et que le code est bien celui que tu voulais faire]



    Il faudrait sans doute aussi ajouter des vérifications de limites pour la longueur finale de la chaîne.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut JP !

    Si c'est la longueur de ta chaîne résultante qui est déterminante, tu peux utiliser DupeString et tronquer le résultat à la longueur désirée:

    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
     
    uses
      StrUtils;
     
    function RepeatString(AValue: string; ALength: Integer): string;
    var
      NbDupe: Integer;
    begin
      NbDupe := ALength div Length(AValue) + 1;
      result := DupeString(AValue, nbDupe);
      SetLength(result, ALength);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      S: string;
    begin
      S := 'La meilleure façon d''apprendre...';
      S := RepeatString(S, 50);
      ShowMessage(S);
    end;
    @+ Claudius

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    [Edit] Decidement je suis plutot long a la detente ... [/Edit]
    [Edit2]Je voudrais pas me vanter, mais avec mon code, tu as un espace comme desiré dans ta demande, entre les repetitions de chaines :p[/Edit2]
    Et en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.btnEssai2Click(Sender: TObject);
    var
      T, E, L: Integer;
      C: Char;
      S: String;
    begin
      T := 40;  // longueur Totale de référence
      S := 'La meilleure façon d''apprendre...';
     
      While Length(S) < T do S:= S + ' ' + S;
      S := LeftStr(S,T);
    Et voilou enfin j'ai pas testé, mais ca doit le faire

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Et avec un E mod OldLength ou qqch comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Duplicate(const Str: string; Len: Integer): string;
    var
      SrcLen, I: Integer;
    begin
      SrcLen := Length(Str);
      SetLength(Result, Len);
      for I := 1 to Len do
        Result[i] := Str[(I-1) mod SrcLen + 1];
    end;
    Ce code fera ce que tu veux.

    On peut l'améliorer comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Duplicate(const Str: string; Len: Integer): string;
    var
      SrcLen, I, EndStrLen: Integer;
    begin
      SrcLen := Length(Str);
      SetLength(Str);
      for I := Len div SrcLen - 1 downto 0 do
        Move(Str[1], Result[I*SrcLen+1], SrcLen);
      EndStrLen := Len mod SrcLen;
      Move(Str[1], Result[Len-EndStrLen+1], EndStrLen);
    end;
    Ce qui est plus complexe mais plus rapide.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  9. #9
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Lumière...
    Bonsoir,

    droggo disait :
    C'est quoi ce code ?

    Tu es sûr qu'il fait ce que tu penses ?
    Bin voui voui... mais j'ai tenté d'extaire le principe seulement afin de ne pas vous embrouiller, loupé à ce que je vois.
    Par contre tes compléments d'infos sont très intéressants !

    Claudius...

    Regarde, grâce à toi j'ai enfin réussi à intégrer ton code dans ma boucle While, ce qui était très important :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ...
      While (E < T) do
      begin
        beep;
        Edit1.Text := RepeatString(Edit1.Text, T);
        E := Trunc(StringToRX1(X));
      end;
    Très efficace ton code !

    Whaouuuuuuu !!!

    Je viens seulement de regarder les codes à Qwazerty et sjrd, super les copains, là je suis comblé ; impec de chez impec !

    Me reste plus qu'à choisir alors

    Encore affaire résolue

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 454
    Points : 24 866
    Points
    24 866
    Par défaut
    Ah, tu vois, dès que tu as expliqué ton besoin, on a pu t'aider ...

    Bon, je l'avais en fait cette fonction ... basée sur le code de DupeString ...
    sans div, ni mod, ... c'est pour cela que c'est plus long ...

    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
    {* -----------------------------------------------------------------------------
    la fonction SetLengthDupe retourne la concaténation d'une chaîne avec elle-même à hauteur d'un nombre donné de répétitions calculé en fonction de la taille souhaitée
    @param AText Chaine à répéter
    @param ALength Taille souhaitée
    @return Chaine
    ------------------------------------------------------------------------------ }
    function SetLengthDupe(const AText: string; ALength: Integer): string;
    var
      R, S: PChar;
      LenT, ACount, I, e: Integer;
    begin
      if ALength > 0 then
      begin
        LenT := Length(AText);
        SetLength(Result, ALength);
     
        S := Pointer(AText);
        R := Pointer(Result);
     
        I := ALength;
        while I > LenT do
        begin
          Move(S^, R^, LenT);
          Inc(R, LenT);
          Dec(I, LenT);
        end;
        if I > 0 then
          Move(S^, R^, I);
      end else
        Result := '';
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Bouquet final ;-)
    ShaiLeTroll disait :
    Ah, tu vois, dès que tu as expliqué ton besoin, on a pu t'aider ...Ah, tu vois, dès que tu as expliqué ton besoin, on a pu t'aider ...
    Tu sais, c'est grâce à toi que j'ai pu complémenter cette demande ; par là même mes autres copains ont tout de suite percuté.

    Whaouu, tu me donnes là une méthode avec pointeurs, chouettos !

    J'avoue ne plus savoir de quel côté donner de la tête ; embarras du choix cela se nomme.

    En tous les cas, je conserve précieusement tout ça, bien classé.

    Je dois dire que je suis très gâté

    @+

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

Discussions similaires

  1. Return à l'intérieur d'une boucle for -> warning
    Par MicBeastKiller dans le forum C++
    Réponses: 38
    Dernier message: 11/06/2012, 21h34
  2. Probleme dans une boucle for, faisant appel a une fonction
    Par mapotam dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/01/2010, 21h41
  3. Réponses: 2
    Dernier message: 02/10/2008, 09h35
  4. [MySQL] Traitement des variables d'une boucle for
    Par liryc78 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/03/2006, 20h53
  5. [DOS] Boucle FOR : récupérer %%i dans une variable
    Par Pomalaix dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 06/12/2005, 16h18

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