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

C++Builder Discussion :

RichEdit, Changer la couleur de tous les mêmes caractères présents dans un texte


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut RichEdit, Changer la couleur de tous les mêmes caractères présents dans un texte
    Bonjour à tous,

    J'utilise un bouton, un printDialog et un RichEdit.
    En cliquant sur mon bouton je vais chercher un code.txt qui va se mettre dans mon RichEdit.

    Il se compose de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    G90 G80 G40 M3
    G92 X0 Y0 Z0
    G1 F140
    X0.000
    Z-0.026
    Y0.029
    Y0.058 Z-0.026
    Y0.116 Z-0.025
    ... etc
    c'est donc ce que je retrouve dans mon RichEdit et j'aimerai par exemple que tout les 'G' soit en rouge , le 'M' en bleu

    Je viens de passer environ 1h sur google à essayer d'adapter des idées a mon code et j'en viens à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RichEdit1->SelAttributes->Color = clRed;
    RichEdit1->SelText = "G";
    RichEdit1->SelAttributes->Color = clBlue;
    RichEdit1->SelText = "M";
    Seulement ça rajoute un G rouge sur ma premiere ligne suivie directement d'un M bleu ne faisant pas partie du code d'origine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GMG90 G80 G40 M3
    ...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    C'est normal, tu modifie SelText !
    Il faut utiliser SelStart et SelLength pour positionner le Curseur au bon endroit (penser aux CR+LF lors des saut de ligne), ensuite tu appliques SelAttributes
    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 à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    En procédant de cette maniere je débute au caractère 0 et je prends une longueur de 1. Mon tout premier G devrait donc etre rouge non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RichEdit1->SelStart=0;
    RichEdit1->SelAttributes->Color = clRed;
    RichEdit1->SelLength=1;
    PS : Je n'ai pas l'aide builder

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Tu n'as pas l'aide ? C'est bien Dommage ?
    Version inférieur à 6 sous Seven ?
    Programme d'aide de Windows (WinHlp32.exe) pour Windows 7
    Sinon Doc Wiki Embarcadero, autant l'utiliser Embarcadero nous offre une aide en ligne, c'est mieux que ces dernières années !

    lien vers ComCtrls.TRichEdit

    Je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RichEdit1->SelStart=0;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clRed;
    RichEdit1->SelStart=1;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clBlue;
    Comme le je disais il faut utiliser SelStart et SelLength pour positionner le Curseur au bon endroit ensuite tu appliques SelAttributes

    Normalement, cela fonctionne, c'est comme cela que je procédais pour colorer une trace en temps réel de débogage dans mon ancien taf en Delphi !
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Exact !
    C'est vrai j'avais mal placé mon SelLength

    J'ai la version 10 mais je ne l'avais pas installé.
    En tout cas super le site ! Merci

    Faut que j'essaye de trouver pour que tout les G soit en rouge maintenant, car cette technique me permet que de choisir manuellement quelle lettre je veux coloré.
    Et en cliquant sur mon bouton j'importerai beaucoup d'autres codes de tailles différentes et les G ne seront pas a la meme place

    Le RichEdit est il capable de faire ceci ? (Coloré automatiquement tout les G dans son contenu)

    Juste pour 4 caractères (d'une même ligne) en couleur il me faut 12 lignes

    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
     
    RichEdit1->SelStart=0;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clRed;
     
    RichEdit1->SelStart=4;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clRed;
     
    RichEdit1->SelStart=7;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clRed;
     
    RichEdit1->SelStart=11;
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color = clBlue;
    Sachant que j'ai 59925 lignes dans mon code...

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Je dirais Pos, PosEx te permettrons de faire de recherches de chaine ton texte ...
    Tu fais une sorte de coloration syntaxique, il te faut construire un dictionnaire de mot, leur associer une couleur, et faire une boucle qui recherche les mots (tu peux le faire ligne par ligne).

    Une astuce, si la 1ere lettre correspond à la 1ere d'un mot, tu regardes tout de suite la dernière lettre (si c'est possible), cela peut améliorer les perfs, il y a plein de technique d'optimisation pour chercher chaine dans un dico !
    La méthode de tri des mots dans le dictionnaire sous forme d'arbre peut-être intéressante à coder (ça c'est valable pour des mots de plus de 4 lettres, si tu en reste à une lettre, c'est pas bien compliqué)
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Ou peut on trouver pos posex?
    Je viens d'essayer dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    RichEdit1->?
    RichEdit1->SelAttributes->?
    RichEdit1->Lines->?
    Je trouve juste J'en conclu que ce que j'ai besoin n'est pas un élément de RichEdit?

    Le dictionnaire devrait pouvoir être facultatif si je n'ai qu'une lettre a coloré a chaque fois?

    N'y a t-il pas une commande permettant de dire en bref que pour toutes les lettres G (caractere ASCII alt 71) -> le mettre en rouge

    Exemple tres grossier et complètement faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RichEdit1->'alt+71'->Color=clRed;
    PS : J'ai déjà utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AnsiString nbligne;  
    nbligne=RichEdit1->Lines->Count;      // Compte le nombre de ligne dans richedit1
    Memo1->Lines->Add(nbligne);           // Affiche nbr lignes du code dans memo1
    Au cas ou ça joue pour la suite

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Citation Envoyé par RadStudio57 Voir le message
    Ou peut on trouver pos posex?
    Je sais que tu n'as pas l'aide mais tu pourrais faire la démarche d'aller sur le Net !
    Pos
    PosEx

    Pour le reste, TRichEdit, c'est un composant basique de mise en forme d'un texte !

    Avoir une coloration syntaxique de tous les G et tous les M automatiquement doit pouvoir se faire avec TSynEdit, tu dois pouvoir lui indiquer que G et M sont ses seuls éléments syntaxiques (dictionnaire), je ne pourrais pas t'aider, je ne connais ce composant que de nom !

    Bienvenue dans la dur vie de programmeur !
    Bon Courage !
    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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Pour le moment pour précéder pas a pas j'essaye de compter le nombre de G par ligne

    j'ai donc
    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
     
    {
    AnsiString nbligne;                       //declare
    nbligne=RichEdit1->Lines->Count;          //compte le nombre de ligne dans richedit1
    Memo1->Lines->Add(nbligne);               //affiche nbr lignes du code dans memo1
     
    int i,l;
    for (i=0; i < nbligne; i++)
    {
    AnsiString ligne;                                   //declare
    ligne=RichEdit1->Lines->Strings[i];
    l=ligne.Length();
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));        //affiche dans memo2 le nombre de G dans richedit1
    }
    }
    Donc avec mon code qui a 3 G dans la premiere ligne ; 1 dans la 2e et aucun dans les suivantes je devrai avoir qq chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    3
    1
    0
    0
    ...
    etc
    J'ai un soucis quelque part qui fait qu'en fait j'ai seulement

    Sinon,
    A partir de mon code un professeur m'a dit qu'il y avait en fait des soucis avec Pos et du coup il avait fait autrement , ce qui donne

    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
    {
    AnsiString nbligne;
    char tampon[100], *pstr;                       //declare
    nbligne=RichEdit1->Lines->Count;          // compte le nombre de ligne dans richedit1
    Memo1->Lines->Add(nbligne);              // affiche nbr lignes du code dans memo1
     
    int i,l;
    for (i=0; i < nbligne; i++)
    { DWORD count = 0;
    AnsiString ligne;
    ligne=RichEdit1->Lines->Strings[i];
    l = ligne.Length();
    strcpy(tampon,ligne.c_str());
     
       pstr=tampon;
       while(*pstr) {
       if(*pstr >0x40 && *pstr<='Z') count++;
        pstr++;
      }
     
     
      Memo1->Lines->Add(count);
     }
    }
    et lui a bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    3
    1
    0
    0
    ..
    etc
    Mais je ne comprends pas entierement son code et je prefererai rester sur celui qui est Totalement de moi en essayant de le corriger.

    Des erreurs apparantes sont elles visibles chez moi ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Déjà, regardes cette partie de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ligne=RichEdit1->Lines->Strings[i];
    l=ligne.Length();
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));
    C'est normal que tu n'aies que des 1... Quelle différence-y-a-t'il entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RichEdit1->Lines->Strings[i]
    et??

    Ensuite, tu pourras regarder ce que fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (int i=1; i<=ligne.Length(); i++)
    {
      char c = ligne[i];
    }
    Sinon, ton prof est... comment dire... taquin ?? Si le problème vient de sa manière de calculer le nombre de lettres, demandes-toi quel lien il peut y avoir entre 0x40 et 'Z' ? Ou peut-être plus simple: entre 0x41 et 'Z' ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    De mon coté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RichEdit1->Lines->Strings;  ou   
               ->Text;
    revient au meme non ? Ils vont tout les 2 voir le contenu de RichEdit1

    Mais dans un cas comme dans l'autre j'aurai des 1

    PS : en essayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i=1; i<=ligne.Length(); i++)
    {
     char c = ligne;
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));
    }
    Ah la par contre il y a une difference entre ->Lines->Strings et ->Text;
    Avec Strings j'ai quatorze 1 un en dessous de l'autre
    Avec Text; j'ai cinq 1 un en dessous de l'autre ( Et j'en ai 5 dans le code )

    J'en conclu que pour chaque G trouvé il va me mettre un 1 et sauté de ligne.
    Ca à l'air d'être suffisant pour que je change les G en question de couleurs.
    L'important est que leur positions soit trouvé . Apres savoir qu'il y en a 3 sur la même ligne puis 2 sur la suivante ou alors 5 en tout doit revenir au même. Exact?

    Edit : Je viens de redescendre de mon petit nuage, pour être sur j'ai ajouter d'autres 'G' a mon code pour voir si des 1 allez se rajouter. Et en appuyant sur le bouton a ma grande surprise, rien ne s'est ajouté, j'en ai toujours 5 un en dessous de l'autre. Simple coincidence

    Sinon coté professeur

    Justement je m'interrogeai la dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Si pointeur plus grand que 0x40 et plus petit que Z ..
    Je pensais d'abord que 0x40 serai du hexadecimal qui signifierai a minuscule ainsi ca serait compris de a minuscule a Z majuscule ( soit toutes les lettres )

    Mais en pensant comme ca pourquoi n'aurait il pas écrit 'a' si 'Z' marche ?

    Et puis pourquoi entre 'a et Z' si on cherche que 'G'
    pourquoi pas directement = 'G' ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Aïe aïe aïe

    revient au meme non ? Ils vont tout les 2 voir le contenu de RichEdit1
    Le premier te renvoie la ligne numéro i, le second te renvoie l'intégralité du contenu.

    Pour le coup de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=1; i<=ligne.Length(); i++)
    {
     char c = ligne[i];
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));
    }
    Je voulais que tu regardes ce que vaut la variable "c" au fur et à mesure..... Puis que tu réfléchisses à ce que tu pourrais en faire...

    Ensuite 0x41 c'est A majuscule (a minuscule c'est 0x61), donc ce qu'il a voulu calculer, c'est le nombre de caractères entre A et Z... Il est taquin, parce qu'il aurait pu écrire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*pstr>='A' && *pstr<='Z') count++;
    Mais puisque de toute façon ça ne correspondait pas ce que tu voulais faire....

    Avant de te lancer dans le codage, prends une feuille, un crayon, et écris l'algorithme de ce que tu veux faire, en décomposant au maximum...
    Les questions spécifiques à C++ Builder viendront ensuite.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Merci de ces précieuses informations
    Je vais retourner un peu sur papier car je me perds là..

    Sinon au premier coup d'oeil c pourrait être le nombre de G total qui évolue au fur et à mesure des lignes analysés.

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Dans le style de ceci ?

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Depuis le début, tu veux nous faire écrire ton devoir !
    Après, tu ne connais pas tes codes ASCII par coeur !
    Pour vérifier, facile 0x40 = 64, fait ALT + 64 dans NotePad, ainsi que que ALT + 65 !

    lors d'une Analyse par ligne par ligne il faut manuellement compter la position (pseudo caret), en ajoutant +2 (CR LF) à chaque ligne passée !
    Cela permettra de définir SelStart correctement

    Heureusement que tu n'as pas des fichiers Linux\Mac à gérer, CR LF pouvant sur ces systèmes soit CR soit LF soit les CR LF, et avec TRichEdit, j'ignore comment il gère son SelStart avec ce genre de Fichier !

    J'ai du pensé à ce genre de chose quand j'ai codé ma fonction
    SearchStringInFile que j'ai ensuite utilisé pour remplacer du code automatiquement sur un bon millier de fichier

    Sinon, si tu veux gérer une couleur par lettre, tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TColor LetterColors[26] = (clBlue, clRed, clNone, clGreen, clNone, clNavy ...);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ('A' <= *pstr && *pstr <= 'Z')
    {
      SelAttributes->SelStart = ???
      SelAttributes->SelLength = 1;
      SelAttributes->Color = LetterColors[*pstr - 'A'];
    }
    je trouve plus élégant d'écrire (A < x & x < B) cela ressemble plus à la forme mathématique (A < x < B), c'est tellement plus lisible !

    normalement, le code devrait être très court

    Code pascal : 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
    var 
      Caret, iLines, iStr: Integer;
      Str: String;
      Color: TColor;
    begin
      Caret := 0;
      for iLines := 0 to RichEdit1.Lines.Count - 1 do
      begin
        Str := RichEdit1.Lines[iLines];
     
        for iStr := 1 to Length(iStr) do
        begin       
           if (Str[iStr] in ['A'..'Z']) then
           begin
             Color = LetterColors[Ord(Str[iStr]) - Ord('A')];
             if Color <> clNone then
             begin
               SelAttributes.SelStart = Caret;
               SelAttributes.SelLength = 1;
               SelAttributes.Color = Color;
               Inc(Caret);
             end;
           end;
        end;
     
        Inc(Caret, 2);
    end;

    Tu vois c'est très très facile !


    Ton prof a vraiment écrit ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(tampon,ligne.c_str());
    pstr=tampon;
    ceci suffit largement, inutile d'allouer de la mémoire inutilement (sans compter le strlen implicite)
    Rassure-moi, c'est ton oeuvre pas la sienne ! sinon change d'école ! ou change de cursus !
    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

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Depuis le début, tu veux nous faire écrire ton devoir !
    Je veux de l'aide pour reussir pas des réponses a recopier betement sinon j'aurai été un peu plus préssé
    Tu as bien vu qu'entre mon premier post et celui-ci 1 mois s'est écoulé.

    Ca fait 2 mois en fait que je suis dessus, j'ai reussi a faire mes envois en base de données, mes fiches de renseignements jointes, mon import de code, puis même une partie administrateur demandant des identifiants et permettant de voir ce qui se trouve dans cette base de données puis un bouton permettant de transferer entre 2 tables en supprimant de la 1ere table apres transfert etc ... Après plein de petits détails presque inutiles avec Tmainmenu. Je n'arriverai pas a tout resumer lol

    Revenons a nos moutons !
    Alt 64 fait @
    alt 65 fait A

    Pour l'enseignant , Oui il est prof de BTS IRIS depuis plus d'une dizaine d'années

    D'apres ton (Code) tu pars de la partie de mon prof non ?
    Moi je n'utilise pas pstr entre 'A' et 'Z' dans mon code

    Mon 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
    16
     
    {
    AnsiString nbligne;                       //declare
    nbligne=RichEdit1->Lines->Count;          //compte le nombre de ligne dans richedit1
    Memo1->Lines->Add(nbligne);               //affiche nbr lignes du code dans memo1
     
    int i,l;
    for (i=0; i < nbligne; i++)
    {
    AnsiString ligne;                                   //declare
    ligne=RichEdit1->Lines->Strings;
    l=ligne.Length();
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));        //affiche dans memo2 le nombre de G dans richedit1
    }
    }
    Mon Code apres l'intervention de Totoche76
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    AnsiString nbligne;                       //declare
    AnsiString ligne;
    nbligne=RichEdit1->Lines->Count;          //compte le nombre de ligne dans richedit1
    Memo1->Lines->Add(nbligne);               //affiche nbr lignes du code dans memo1
     
    int i,c,l;
    l=ligne.Length();
    for (int i=1; i<=ligne.Length(); i++)
    {
    char c = ligne;
    Memo2->Lines->Add(RichEdit1->Text.Pos("G"));
    }
    En tout cas je vais tester ce que tu m'as écris et faire quelques recherches car je vois déjà des choses nouvelles pour moi tels que Caret, Inc(Caret) et je veux pouvoir expliquer pourquoi j'ai utiliser telles ou telles choses

    Merci pour les liens que tu me mets a chaques fois

    ---------------------------1h plus tard--------------------------

    Edit : Avant de me tirer les cheveux sur le pascal et les Tcolor j'ai un peu corrigé le code du prof.

    Il avait *pstr compris entre A et Z , ca me disait toutes les lettres par ligne.
    M'interessant que au G pour le moment je suis passé à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(*pstr >'F' && *pstr<='G') 
    Puis à
    if (*pstr=='G') count++;    
     
    ( J'allais faire un long post demandant pourquoi lui ne marchait pas et me calculait tout les caracteres par ligne alors qu'en fait j'avais simplement mis '=' au lieu de '==' :oops:  )
    Ensuite ce que je ne comprends pas dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ('A' <= *pstr && *pstr <= 'Z')
    {
      SelAttributes->SelStart = ???
      SelAttributes->SelLength = 1;
      SelAttributes->Color = LetterColors[*pstr - 'A'];
    }
    ce sont les SelAttributes qui trainent tout seul. Ne serait-ce pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (*pstr=='G')
    {
      RichEdit1->SelStart = ??? // Remplacer ??? par position du G en question
      RichEdit1->SelLength = 1;
      RichEdit1->SelAttributes->Color = LetterColors[*pstr - 'A'];
      //En vert ce que je ne comprends pas:  Color = clRed ne suffirait pas ? 
    }

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Caret = c'est le nom que l'on donne au Curseur, dans mon code c'est une variable locale
    Inc(i) => i++
    J'ai codé en Delphi, pour moi c'est plus rapide, ça te donne une idée de l'algo sans te donner tous les éléments syntaxiques que je te laisse découvrir
    J'ai aussi codé brouillon !
    tu as très bien corrigé mes mauvais copier coller de SelAttributes !

    De rien pour les liens, ça donne toujours des idées (surtout en terme de démarche et de méthode sur certains bons sujets) même si c'est un langage différent !

    Etudie bien mon algo en Delphi (pascal), tu pourrais gérer G et M avec un tableau constante comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TColor LetterColors[26] = {clNone, clNone, clNone, clNone, clNone, clNone, clRed, clNone, clNone, clNone, clNone, clNone, clBlue, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone, clNone};
    Demain, si tu veux rajouter la coloration d'une autre lettre, suffira juste de modifier le tableau
    Tu peux même en réalité, créer un écran de configuration du tableau pour associer une couleur (TColorDialog) à une lettre !
    tu stockes la configuration dans ta base de données, dans une nouvelle table LetterColors(Letter CHAR[1], Color INTEGER)
    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

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Ah pas mal du tout cette écriture LettersColors[26] pour les 26 lettres de l'alphabet. Si je veux rajouter des couleurs a des lettres par la suite ( ce qui sera le cas avec X Y Z ) j'aurai juste a changer les 3 dernier clNone par les clxxx de mon choix.

    Encore faut il arriver jusqu'a là
    J'ai fais quelques essaie en reprenant quelques parties de ton code pascal que j'ai essayer de mettre en c++ mais il y a pas mal de choses floues encore.

    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
     
    char LetterColors[26];
    ////////
    for (i=0; i < nbligne; i++)
    {
    DWORD count = 0;                                       // Declare count
    AnsiString ligne;                                      // Declare ligne
    ligne=RichEdit1->Lines->Strings[i];                    // Ligne = La ligne numéro i dans richedit
    pstr = ligne.c_str();
     
    int Caret;
    Caret==0;
       while(*pstr)
       {
        //if(*pstr >'F' && *pstr<='G') count++;          // Si pointeur = G.
        if (*pstr=='G') count++;
        pstr++;
       }
     
    Memo1->Lines->Add(count);                           // Affiche Nombre de G par ligne dans Memo1
                                //a    //b    //c    //d    //e    //f   //g
    Color= LetterColors[26] = (clNone,clNone,clNone,clNone,clNone,clNone,clRed,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone);
     
    RichEdit1->SelStart=Caret;  
    RichEdit1->SelLength=1;
    RichEdit1->SelAttributes->Color;
    Caret++;                                  // Inc(Caret) j'ai donc mis Caret++
    }
    Le soucis avec Caret dans mon code je ne fais que l'initialiser , il ne me sers a rien pour le moment ?

    ----------------------------------------------------------------
    J'ai essayer également le TcolorDialogue dans un autre projet.
    J'ai reussi a faire en sorte qu'en cliquant sur un bouton on choisit une couleur et elle se met en fond dans le RichEdit.

    Mais donc le passage a la couleur se ferait obligatoirement manuellement ?
    J'ai même reussi a entrer du code pour forcer le fait que la couleur soit bleu puis on me demandait quand même la couleur de mon choix. Peut importe que je choisisse jaune ca sera bleu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(ColorDialog1->Execute())
     {
     RichEdit1->Color = ColorDialog1->Color;
     }
     // Pour mettre le fond de richedit en couleur
    Pour changer la couleur de la lettre G et non du fond Faudrait que je reussisse a ecrire la synthaxe correct qui aurait pour idée ceci.
    J'ai l'impression de retomber 1 mois plus tôt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RichEdit1->'G'->ColorDialog1->Color;
    Mais ca serait le bordel pour les lettres suivantes ensuite

    Je ne vois pas comment attribuer Une couleur a Une lettre avec un ColorDialog SANS que la fenetre s'ouvre nous demandant de choisir la couleur de notre choix

  19. #19
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 552
    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 552
    Points : 25 128
    Points
    25 128
    Par défaut
    Si LetterColors est un tableau global, tu peux l'utiliser de n'importe où !
    Tu as compris l'intéret, mais tu n'as pas encore compris comme l'utiliser

    Tu ne poses pas assez !
    Respire un coup ! boit un chocolat chaud ! sort un stylo et une feuille de papier !
    Ecrit un algo (en français)
    Tu bricoles des trucs, ça ne fonctionne pas comme ça la programmation !
    N'inventes pas de syntaxe qui n'existe pas !
    Pense aussi à une structure POO qui pourrait organiser ton code !

    Penses à la notion de fonction, pour regrouper un code dans un ensemble logique avec des paramètres et surtout réutilisable !
    La fonction de coloration du RichEdit doit pouvoir être appelé librement après un ColorDialog Execute si tu veux montrer le changement de couleur d'une lettre


    Pense à indenter ton code, pour nous pour le lire, pour toi pour le relire, pour tes profs pour le noter !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Globale (ou membre d'un objet facile d'accès comme un singleton)
                               //a    //b    //c    //d    //e    //f   //g
    TColor LetterColors[26] = {clNone,clNone,clNone,clNone,clNone,clNone,clRed,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone};
    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
     
    for (i=0; i < nbligne; i++)
    {
      DWORD count = 0;                                     
      AnsiString ligne = RichEdit1->Lines->Strings[i];
      pstr = ligne.c_str();
     
      int Caret = 0;
      while(*pstr)
      {
        if (*pstr == 'G') 
        {
          RichEdit1->SelStart=Caret;  
          RichEdit1->SelLength=1;
          RichEdit1->SelAttributes->Color = LetterColors[*pstr - 'A']; 
        }
        Caret++; 
        pstr++;
       }
      // Saut de Ligne
      Caret += 2; 
     
    }
    Pour gérer M, Y, Z, modifie le test ... == 'G' par 'A' <= ... <= 'Z' plus en testant clNone !

    ce code serait dans une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ColoriseRichEdit(TRichEdit *RichEdit)
    et tu ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char Letter = 'G'; // Utilise par exemple un TValueListEditor contenant A..Z (OnDrawCell de la seconde colonne pour afficher la couleur par exemple)
    if (ColorDialog->Execute())
    {
      if (LetterColors[Letter - 'A']  != ColorDialog->Color)
      {
        LetterColors[Letter - 'A']  = ColorDialog->Color;
        ColoriseRichEdit(RichEdit1);
      }  
    }
    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

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Ahh ça va mieu au petit matin

    Alors voila ce que ça donnerai

    J'ai redéclarer mes variables audessus du void.

    J'ai remplacer le ...='G' par A<....<Z

    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
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     
    int i;                                  // Declare i et l
    AnsiString nbligne;                       // Declare nbligne           // Compte le nombre de ligne dans richedit1
    char tampon[100], *pstr;                  // pointeur
    AnsiString ligne;
    TColor LetterColors[26] = {clNone,clNone,clNone,clNone,clNone,clNone,clRed,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone,clNone};
     
    void fonction(TRichEdit *RichEdit1,TMemo *Memo2)
    {  //Debut Void
       for (i=0; i < nbligne; i++)
       {
        DWORD count = 0;
        int Caret = 0;
        ligne=RichEdit1->Lines->Strings[i];                     // ligne = La ligne numéro i dans richedit
        pstr = ligne.c_str();
          while(*pstr)
          {
           if(*pstr >'A' && *pstr<='Z')         // Si pointeur = G  , count
           //if (*pstr=='G') count++;
           RichEdit1->SelStart=Caret;
           RichEdit1->SelLength=1;
           RichEdit1->SelAttributes->Color = LetterColors[*pstr - 'A'];
           Caret++;
           count++;
           pstr++;
          }
         Caret += 2;
         Memo2->Lines->Add(count);                             // Affiche Nombre de G par ligne dans Memo1
      }
    }  // Fin Void
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
     : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    nbligne=RichEdit1->Lines->Count;
    Memo1->Lines->Add(nbligne);                // affiche nbr lignes du code dans memo 2
     
    char Letter = 'G'; 
    if (ColorDialog1->Execute())
      {                            // Il sert a quoi ce !    ?
         if (LetterColors[Letter - 'A']  != ColorDialog1->Color)
            {
               LetterColors[Letter - 'A']  = ColorDialog1->Color;
               fonction(RichEdit1,Memo2);
             }
       }
    }
    Par contre gros soucis, maintenant il me compte le nombre total de caracteres par lignes. Espace y compris.
    Je recherche en même temps des infos sur Tvaluelist

    Voila donc Le composant se compose de 2 colonnes
    Clé et Valeurs
    J'ai fais 26 clés de A a Z , mais Valeurs je mets quoi ? J'ai mis des 0 a coté de toutes les lettres sauf G M X Y Z ou j'ai mis 1.

    Là mon côté curieux se reveille j'aurai pas mal de questions a te poser encore sur le bout de code que tu m'as envoyé.

    La je ne vois pas ou tu veux en venir avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValueListEditor1->OnDrawCell
    OnDrawCell

Discussions similaires

  1. [JavaScript] Changer le style de tous les éléments d'une même classe en javascript
    Par dragonno dans le forum Contribuez
    Réponses: 1
    Dernier message: 12/10/2018, 19h09
  2. changer la couleur de tous les contrôles
    Par Peanut dans le forum IHM
    Réponses: 10
    Dernier message: 11/12/2006, 13h26
  3. Définir la couleur de tous les backgrounds
    Par karatepla dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/06/2005, 14h54
  4. Est-ce que les fichiers .obj sont tous les mêmes?
    Par Bubonik software dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 30/12/2003, 21h04
  5. Les Langages ne sont pas tous les mêmes ......
    Par Max Payne dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/08/2003, 13h51

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