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

VB.NET Discussion :

Passer en bold une partie de chaine délimitée dans un RichTextBox


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 308
    Points : 185
    Points
    185
    Par défaut Passer en bold une partie de chaine délimitée dans un RichTextBox
    bonjour,

    Je cherche à colorer et passer en bold une chaine de caractère compris entre deux chaines "1." et "!"

    L'exemple du programme ci-dessous répond bien à la question pour la première occurrence de ses caractères : "1.Cb5-c7+ !" mais ne détecte pas la deuxième : "1.Tg6-g8 !" (c'est logique puisque première occurrence)
    Il faut bien sur éliminer toutes les occurrences "1." ne répondant pas au cahier des charges.

    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
     'Sélectionne la font de la solution
                RichTextBoxSolution.Font = New Font("Century Gothic", 10, FontStyle.Regular)
     
            Dim testA as string = "1.Cb5-c7+   !      1...Rd5-e4 2.Cc7-e8  menace  3.Ce8-f6#              
               2...Re4-d5 3.Fb6-g1  blocus                     
               3...Rd5-e4 4.Ce8-f6#  3.Fb6-f2  blocus          
               1...Rd5*d6 2.Tg6-g8  blocus             
               2...Rd6-e7 3.Cc7-b5  menace  4.Fb6-d8# 
               1.Tg6-g8  !     menace  2.Tg8-c8  blocus     "        
     
                'Détecte la position des premières occurrences des chaines "1." et "!" dans la chaine testA
     
                Dim Premier As Integer = InStr(testA, "1.")
                Dim Dernier As Integer = InStr(testA, "!")
                RichTextBoxSolution.Select(Premier - 1, Dernier)
                RichTextBoxSolution.SelectionColor = Color.Blue
                RichTextBoxSolution.SelectionFont = New Font(RichTextBoxSolution.Font, FontStyle.Bold)
    Malgré une longue recherche, je n'arrive pas à trouver la solution.

    Par avance merci pour vos idées.

    A vous lire

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Avec une boucle et la méthode String.IndexOf(), tu devrais pouvoir t'en sortir.

    Tu as aussi la solution de l'expression régulière avec la méthode Regex.Matches qui sera peut-être plus élégante.

  3. #3
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 308
    Points : 185
    Points
    185
    Par défaut
    Bonsoir

    Regex est la bonne solution et j'obtiens le code suivant (mettre dans une form avec un textbox et un bouton) :

    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
    Imports System.Text.RegularExpressions
     
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim outputtext As New String("")
            Dim getLiteratura As String = "1.Cb5-c7+   !      1... Rd5-e4 2.Cc7-e8 menace  3.Ce8-f6#    1.Dh1-h8 !
               2...Re4-d5 3.Fb6-g1  blocus                     
               3...Rd5-e4 4.Ce8-f6#  3.Fb6-f2  blocus          
               1...Rd5*d6 2.Tg6-g8  blocus             
               2...Rd6-e7 3.Cc7-b5  menace  4.Fb6-d8# 
               1.Tg6-g8  !     menace  2.Tg8-c8  blocus     "
            Dim Pattern As String = "1.(.*?)\!"
            Dim ReturnedMatches As MatchCollection = Regex.Matches(getLiteratura, Pattern)
            For Each ReturnedMatch As Match In ReturnedMatches
                outputtext = outputtext + vbCrLf + ReturnedMatch.Groups(1).ToString
                TextBox1.Text = outputtext
            Next
     
        End Sub
     
    End Class

    Le résultat sera :

    Cb5-c7+
    .. Rd5-e4 2.Cc7-e8 menace 3.Ce8-f6# 1.Dh1-h8
    Tg6-g8


    Commentaires : ligne 1 et 3 sont ok.
    Par contre la ligne deux contient bien le résultat Dh1-h8 mais dans une chaine commençant trop tôt c-a-d au "1." précédent dans la chaine ! d'où sa longueur inutile : " .. Rd5-e4 2.Cc7-e8 menace 3.Ce8-f6# 1.Dh1-h8 "

    Comment empêcher ce cas particulier ?

    Merci pour le tuyau et à vous lire.

  4. #4
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 308
    Points : 185
    Points
    185
    Par défaut
    Il suffit de tromper la boucle en supprimant les "1..." avec la ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       'supprimer les 1...
            getLiteratura = Replace(getLiteratura, "1...", ".")
    C'est plus simple qu'un fastidieux montage while not wend etc....

    Bien entendu getLiteratura ne doit pas être le texte finale !

  5. #5
    Membre habitué Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 308
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    Voici le code complet :

    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
     'avec grande quantité d'info utiliser Regex
                Dim outputtext As New String("")
     
                'charge le contenu de chaine testA 
                Dim getLiteratura As String = testA
     
                'supprimer les "1..." en les remplaçants par un leure pour ne pas perturber la recherche des "1."
                getLiteratura = Replace(getLiteratura, "1...", "££££")
     
                'supprime les vbLF pour mettre en concordance le système Instr() et Regex
                testA = Replace(testA, vbLf, "")
     
                Dim Pattern As String = "1.(.*?)!"  ' (.*?)\
                Dim ReturnedMatches As MatchCollection = Regex.Matches(getLiteratura, pattern)
                'Dim PositionClef(1000) As Integer : Dim indexN As Integer = 0
                Dim Premium As Integer
                Dim Dernum As Integer
     
                For Each ReturnedMatch As Match In ReturnedMatches
                    Dim Clef As String = "1." + ReturnedMatch.Groups(1).ToString + "!"
     
                    Premium = InStr(testA, Clef)
                    Dernum = Len(Clef)
     
                    'recherche le nb d'occurences de la chaine vbCrLf jusu'à la position Premium. Par défaut 0 pour le premier.
     
                    RichTextBoxSolution.Select(Premium - 1, Dernum) : RichTextBoxSolution.SelectionColor = Color.Black
                    RichTextBoxSolution.SelectionFont = New Font(RichTextBoxSolution.Font, FontStyle.Bold)
     
                    outputtext = outputtext + Clef + " " + Str(Premium) + " " + vbCrLf
                    TextBox1.Text = outputtext
                Next
    Je marque résolu.

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

Discussions similaires

  1. [Débutant] Mise en gras d'une partie d'un texte dans un RichTextBox
    Par sergelagier dans le forum Windows Forms
    Réponses: 7
    Dernier message: 05/06/2013, 16h26
  2. Réponses: 5
    Dernier message: 24/02/2006, 10h12
  3. [Tableaux] Rechercher une partie de chaine
    Par kirbs dans le forum Langage
    Réponses: 2
    Dernier message: 08/12/2005, 21h44
  4. Remplacer une PARTIE de chaine de caractères dans un champ
    Par Turlututuchapopointu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/08/2005, 11h57
  5. Réponses: 4
    Dernier message: 18/05/2004, 13h58

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