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

Composants VCL Delphi Discussion :

Probleme avec Memo (caractere par caractere)


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut Probleme avec Memo (caractere par caractere)
    Alors, je vais expliquer un peu :
    En fait, c'est tout bête (pour les pros), j'ai 2 memo.
    Dans l'un des memos, j'ai une phrase :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Grand transporteur 176 Chasseur léger 758
    (les amateurs d'Ogame apprecieront)
    Le but et de copier cette phrase dans le 2eme memo, mais caractere par caractere (car apres je veux m'amuser a enlever les espaces) et je bloque...
    Voila ce que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.btnCopierClick(Sender: TObject);
    var
    j : integer;
    phrase : string ;
    begin
    for j := 0 to length(memo1.Lines[0])-1 do
    phrase[j] := memo1.Lines[0][j];
    memo2.Lines[0]:=phrase;
    end;
    end.
    Cela me donne : 8 (la derniere valeur de la chaine du memo1)
    Si je met a la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    phrase[j] := memo1.Lines[0][j];
    ...et si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memo2.Lines[0][J]:=phrase;
    Il me dit que la partie gauche n'est pas affectable...

    Voila, si quelqu'un avait une soluce...

    PS : il y a une soluce dans le forum mais avec une fonction ValueFromIndex que je n'ai pas dans ma version de Delphi 6.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    bonjour,

    Voila le code corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.btnCopierClick(Sender: TObject); 
    var 
    j : integer; 
    phrase : string ; 
    begin 
    phrase:='' ; // phrase=vide
    // concatène à phrase chaque char de la ligne
    for j := 1 to length(memo1.Lines[0]) do phrase:= phrase+memo1.Lines[0][j]; 
    memo2.Lines[0]:=phrase; 
    end;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Ca marche nickel. Merci.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Cela dit, ca marche...mais si je veux aller un peu plus loin, j'ai 5 lignes dans mon memo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Matières premières sur lune [3:209:4] le 03-16 10:53:56
    Métal:	515013 	Cristal:	0
    Deutérium:	24988 	Energie:	0
    Flotte
    Grand transporteur	16 	Recycleur	3
    eh bien, je n'arrive a avoir que la premiere...

    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.btnCopierClick(Sender: TObject);
    var
      i,j : integer;
      phrase : string ;
    begin   
      // phrase=vide
      phrase:='' ;
      for i := 0 to 4 
        do
          for j := 1 to length(memo1.Lines[i]) do
               begin
                  //alors on concatène à phrase chaque char de la ligne
                  phrase:= phrase+memo1.Lines[i][j];
                  memo2.Lines[i]:=phrase;               
          end;
    end.
    il ne m'achiche dans mon memo2 que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matières premières sur lune [3:209:4] le 03-16 10:53:56
    Voyez vous ou serez mon erreur ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    je viens de trouver...
    Je vous met le code dans l'apres midi.

    bon, je me suis avance, quoiqu'une des manieres fonctionne mais pas l'autre :

    procedure TForm1.btnCopierClick(Sender: TObject);
    var
    i,j : integer;
    phrase : string ;
    begin
    // phrase=vide
    phrase:='' ;
    i :=0;
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    i:=1;
    memo2.Text:=phrase+chr(13)+chr(10);
    phrase:='';
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;

    for i := 0 to memo1.Lines.Count
    do
    begin
    if i=0
    then
    begin
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    end
    else
    begin
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    memo2.Text:=phrase+chr(13)+chr(10);
    phrase:='';

    end;
    end;
    end;

    end.
    La methode verte fonctionne (elle affiche bien les 2 premieres lignes du memo1 sur les 2 premieres lignes du memo2) mais n'a rien d'enviable, d'autant que je n'ai essayé qu'avec 2 lignes du memo alors que je ne sais meme pas, quand le projet sera fini, combien il y en aura.
    Lamethode rouge est, normalement, la transposition de la methode verte grace a des boucles mais, elle, ne fonctionne pas. Je me demande si c'est pas ce qui est en gras qui est mal place...mais je ne sais pas ou le mettre...

    Un petit coup de pouce serait le bienvenu.
    Merci d'avance.

  6. #6
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    C'est parce que ton Memo1 n'a qu'une ligne. Essaie ça :

    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
     
    procedure TForm1.btnCopierClick(Sender: TObject); 
    var 
    i,j : integer; 
    phrase : string ; 
    begin 
      // phrase=vide 
      phrase:='' ;
      Memo2.Clear; //Nettoyage de ton Memo
      for i := 0 to 4 do 
      begin
       memo2.Lines.Add(''); //Ajout d'une nouvelle ligne
        for j := 1 to length(memo1.Lines[i]) do 
        begin 
        //alors on concatène à phrase chaque char de la ligne 
          phrase:= phrase+memo1.Lines[i][j];      
          memo2.Lines[i]:=phrase;
        end;
      end;
    end;
    Maintenant si tu veux juste copier le contenu d'un mémo dans un autre en supprimant les espaces, pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.btnCopierClick(Sender: TObject); 
    begin 
       Memo2.Lines.Text := StringReplace(Memo1.Lines.Text,' ','',[rfReplaceAll]); 
    end;
    avec SysUtils dans la clause Uses


  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Nos messages se sont croisées...

    Citation Envoyé par kubito
    je viens de trouver...
    Je vous met le code dans l'apres midi.

    bon, je me suis avance, quoiqu'une des manieres fonctionne mais pas l'autre :

    procedure TForm1.btnCopierClick(Sender: TObject);
    var
    i,j : integer;
    phrase : string ;
    begin
    // phrase=vide
    phrase:='' ;
    i :=0;
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    i:=1;
    memo2.Text:=phrase+chr(13)+chr(10);
    phrase:='';
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;

    for i := 0 to memo1.Lines.Count
    do
    begin
    if i=0
    then
    begin
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    end
    else
    begin
    for j := 1 to length(memo1.Lines[i])
    do
    begin
    //alors on concatène à phrase chaque char de la ligne
    phrase:= phrase+memo1.Lines[i][j];
    memo2.Lines[i]:=phrase;
    end;
    memo2.Text:=phrase+chr(13)+chr(10);
    phrase:='';

    end;
    end;
    end;

    end.
    La methode verte fonctionne (elle affiche bien les 2 premieres lignes du memo1 sur les 2 premieres lignes du memo2) mais n'a rien d'enviable, d'autant que je n'ai essayé qu'avec 2 lignes du memo alors que je ne sais meme pas, quand le projet sera fini, combien il y en aura.
    Lamethode rouge est, normalement, la transposition de la methode verte grace a des boucles mais, elle, ne fonctionne pas. Je me demande si c'est pas ce qui est en gras qui est mal place...mais je ne sais pas ou le mettre...

    Un petit coup de pouce serait le bienvenu.
    Merci d'avance.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    J'ai essayé avec le "StringReplace", ca marche tres bien avec du texte "classique" mais le copier/coller que je mets dans le memo1 est tres particulier. En effet, quand j'affiche la taille de ce la par exemple :

    Métal: 515013 Cristal: 0
    il m'indique une longueur de 25 caracteres, or, sans compter les espaces, on est deja a 21 caracteres! Je ne sais pas comment cela se fait mais bon, c'est comme ca (je ne peux pas changer les parametres du jeu ).
    Donc, je garde sous le coude cette fonction StringReplace mais est ce que vous pourriez voir ou est le probleme dans mon code avec la boucle "for" ?
    Merci beaucoup deja pour toutes les infos données.

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Le code modifié donne 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
    15
    16
    17
    18
    19
    20
    21
    memo2.clear;
    for i := 0 to memo1.Lines.Count do begin
        phrase:='' ; 
        if i=0 
           then begin 
                  for j := 1 to length(memo1.Lines[i]) do begin 
                      //alors on concatène à phrase chaque char de la ligne 
                      phrase:= phrase+memo1.Lines[i][j]; 
                      memo2.add(phrase); 
                      end; 
                 end 
           else begin 
                  for j := 1 to length(memo1.Lines[i]) do begin 
                  //alors on concatène à phrase chaque char de la ligne 
                 phrase:= phrase+memo1.Lines[i][j]; 
                 memo2.Add(phrase); 
                 end; 
        end ; 
    //  ajouter une ligne vide à memo2 ???
    memo2.Add('') ;
    end;
    PS : penses à l'indentation pour une meilleure lisiblité. C'est franchement indispensable ...

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Merci mais memo2.Add(phrase) est impossible, je peux seulement faire memo2.Lines.Add(phrase)...mais quand je clic, mon memo2 reste vide...

    PS : pourtant, quand je fais le copier/coller du code source, l'indentation est presente... :

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Désolé pour le Add, petite erreur que tu as bien corrigée.

    Pour le copier-coller avec suppression des blancs en début de ligne, ça m'est déjà arrivé, mais c'est pas systèmatique

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Au risque de devenir pénible , ca ne resoud paspour autant mon petit probleme...

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 59
    Points : 31
    Points
    31
    Par défaut
    Ca y est. Ouf, enfin !

    Voila le code final...de cette procedure...qui est loin de terminer le programme...

    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
    procedure TForm1.btnCopierClick(Sender: TObject);
    var
      i,j : integer;
      phrase : string ;
    begin
      // phrase=vide
      phrase:='' ;
      for i := 0 to memo1.Lines.Count
        do
          begin
            if i=0
              then
                begin
                  for j := 1 to length(memo1.Lines[i])
                    do
                      begin
                        //alors on concatène à phrase chaque char de la ligne
                           if memo1.Lines[i][j] <>' '
                             then
                               begin
                                 phrase:= phrase+memo1.Lines[i][j];
                                 memo2.Lines[i]:=phrase;
                               end;
                      end;
                end
              else
                begin
                  for j := 1 to length(memo1.Lines[i])
                    do
                      begin
                        //alors on concatène à phrase chaque char de la ligne
                          if memo1.Lines[i][j] <>' '
                            then
                              begin
                                phrase:= phrase+memo1.Lines[i][j];
                                memo2.Lines[i]:=phrase;
                              end;
                      end;
     
                end;
            memo2.Lines.Add('');
            phrase:='';
          end;
    end;
    Texte non modifié :
    Tour 1

    L'assaillant tire 37 fois avec une force totale de 139977
    Les boucliers absorbaient 8493 et ils pouvaient se regenerer sur 100.00% pourcent.
    Le défenseur endure une dommage de 96551

    Le défenseur tire 96 avec une force total de 80707
    Les boucliers absorbaient 21071 et ils pouvaient se regenerer sur 100.00% pourcent.
    L'assaillant endure une dommage de 59636
    Texte modifié :
    Tour1

    L'assaillanttire37foisavecuneforcetotalede139977
    Lesboucliersabsorbaient8493etilspouvaientseregenerersur100.00%pourcent.
    Ledéfenseurendureunedommagede96551

    Ledéfenseurtire96avecuneforcetotalde80707
    Lesboucliersabsorbaient21071etilspouvaientseregenerersur100.00%pourcent.
    L'assaillantendureunedommagede59636
    Merci pour tout et @ bientôt pour mon futur probleme
    Encore merci.

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 562
    Points
    3 562
    Par défaut
    Il y avait beaucoup plus simple (j'arrive après la bataille, je sais, mais bon) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var i:Integer;
        c:Char;
    begin
      Memo2.Clear;
      for i:=1 to Length(Memo1.Text) do
      begin
        c:=Memo1.Text[i];
        if c<>' ' then Memo2.Text:=Memo2.Text+c;
      end;
    end;
    Sinon, ton code fonctionnera aussi comme ça :
    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
    procedure TForm1.btnCopierClick(Sender: TObject);
    var
      i : integer;
      phrase : string ;
    begin
      // phrase=vide
      phrase:='' ;
      for i := 0 to memo1.Lines.Count do
          begin
            for j := 1 to length(memo1.Lines[i]) do
                begin
                  //alors on concatène à phrase chaque char de la ligne
                  if memo1.Lines[i][j] <>' '
                  then begin
                         phrase:= phrase+memo1.Lines[i][j];
                         memo2.Lines[i]:=phrase;
                       end;
                  end;       
          memo2.Lines.Add('');
          phrase:='';
       end;
    end;
    bon dev

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

Discussions similaires

  1. probleme avec l'encodage des caracteres
    Par isoman dans le forum Général Java
    Réponses: 2
    Dernier message: 19/05/2009, 00h22
  2. Probleme avec les chaines de caracteres
    Par orj30754 dans le forum C
    Réponses: 16
    Dernier message: 01/02/2007, 16h06
  3. Probleme avec les chaines de caracteres
    Par jesuscrie dans le forum C
    Réponses: 5
    Dernier message: 30/06/2006, 23h56
  4. probleme avec les chaines de caracteres
    Par snake77350 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 19h29
  5. Probleme avec une chaine de caractere
    Par Jim_Nastiq dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 10h56

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