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 :

limiter les caractères dans lignes d'un richTextbox à 40


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut limiter les caractères dans lignes d'un richTextbox à 40
    bonjour,
    dans un richtextbox, je dois limiter les caractaires dans chaque ligne à 40 et passer à un nouvelle ligne et ainsi de suite...
    si le dernier mot sur la ligne va être coupé, il dois passer automatiquement à la ligne suivante ...
    en fin après toutes les 14 lignes faire un saut de page et passer à une nouvelle page...
    quelqu'un a une idée?
    merci de votre aide cordialement

  2. #2
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    bonjour,

    Propriétés MaxLength, WordWrap, ...

    voir lien http://www.vbdotnetheaven.com/UploadFile/mahesh/3032/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    je n'ai pas encore trouvé la solution!
    quelqu'un peut m'aider?
    merci bien

  4. #4
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    As-tu fait un essai avec ce que je t'ai donné ?

    Donnes un extrait de ton code.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    je te remerci bien,
    j'ai essayé le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim allLines() As String = note.Lines
     
    For lineCounter as intger = 0 To allLines.GetUpperBound(0)
     
        MessageBox.Show(allLines(lineCounter))
     
    Next
    mais ca donne le text de chaque ligne.

    aussi j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim curligne As Integer = note.GetLineFromCharIndex(positionCurseur)
                        Dim lastspace As Integer = 0
                        Dim newligne As Integer = note.GetFirstCharIndexOfCurrentLine() + lastspace
     
                        lastspace = note.Lines(curligne).LastIndexOf(" ")
     
                        If note.Lines(curligne).Length > 40 And note.Lines(curligne).Length > 0 Then
     
                            note.Lines(curligne) = Trim(note.Lines(curligne))
                                note.Text = note.Text.Insert(newligne, vbCrLf)
                        End If
    ca marche, mais il y a un problemme de curseur
    surtout si je vais modifier la ligne pressédante.

  6. #6
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    bonjour,

    est-ce que ce bricolage te suffirait ?
    il semble que ça fonctionne pour la saisie directe, reste à tester pour un chargement auto de la RichTextBox1 !

    Saut de ligne OK
    Saut de page (connais pas la commande)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
            If RichTextBox1.Lines.Last.Length = 40 Then RichTextBox1.AppendText(Environment.NewLine)
            If RichTextBox1.Lines.Count / 15 = RichTextBox1.Lines.Count \ 15 Then RichTextBox1.AppendText(Environment.NewLine)
        End Sub

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    il me donne une erreur!
    lst n'est pas membre de system.array et count n'est pas un membre de system.array!
    je suis sous vb.net 2005
    j'ai ajouté la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    imports system.array
    merci de ton aide.
    on va y arriver

  8. #8
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    essaies :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    imports system.drawing
    imports system.windows.forms

  9. #9
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    oups !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imports  system.windows.controls
    http://msdn.microsoft.com/fr-fr/library/ms229335.aspx

    mais c'est avec Framework 4 !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    le meme problemme!
    la meme erreur.
    est-ce-que ce code fonctionne chez toi?

  11. #11
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    comme je te l'ai dit ça fait un peu bricolage !

    mais ça fonctionne nickel

    mais je suis sous 2010.

  12. #12
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    recherche dans ta bibliothèque controls si tu dispose d'un contrôle RichTextBox avec les méthodes et propriétés que j'utilise dans mon exemple

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    ca ne marche pas chez moi!
    peut être il y a une solution pour cet erreur?

  14. #14
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    en fait en grattant un peu j'ai été un peu vte dans mes infos, c'est une implémentation d'un contrôle RichTextBox !

    cf lien :

    http://msdn.microsoft.com/fr-fr/library/k63c05yf.aspx

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    je ne vois pas comment ce code peux limiter la sesie à 40 chr!
    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
     
            Dim textBox1 As New TextBox()
     
            ' Set the Multiline property to true.
            textBox1.Multiline = True
            ' Add vertical scroll bars to the TextBox control.
            textBox1.ScrollBars = ScrollBars.Vertical
            ' Allow the RETURN key in the TextBox control.
            textBox1.AcceptsReturn = True
            ' Allow the TAB key to be entered in the TextBox control.
            textBox1.AcceptsTab = True
            ' Set WordWrap to true to allow text to wrap to the next line.
            textBox1.WordWrap = True
            ' Set the default text of the control.
            textBox1.Text = "Welcome!" & Environment.NewLine & "Second Line"
    il va limiter, mais à la largeur du control et pas à un nembre exacte...

  16. #16
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    bonjour,

    ce n'est pas ce bout de code qu'il faut regarder, c'est la classe :

    TextBoxBase possède les membres (méthodes et propriétés que j'ai utilisés dans mon code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
            If RichTextBox1.Lines.Last.Length = 40 Then RichTextBox1.AppendText(Environment.NewLine)
            If RichTextBox1.Lines.Count / 15 = RichTextBox1.Lines.Count \ 15 Then RichTextBox1.AppendText(Environment.NewLine)
        End Sub

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    une piste possible en passant par les Regex, pour le début de la question.
    Les explications sont dans le 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
    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
        Dim maxCarParLigne As Integer = 15 'Longueur des lignes.
        Dim pos As Integer 'Position actuel du curseur
        Dim lastPos As Integer 'Position antérieure du curseur
     
        Private Sub rtb1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtb1.TextChanged
     
            'On récupère le texte du RTB sur une seule ligne et
            'on lui ajoute un espace final. Ces espaces servant
            ' de délimiteurs des mots.
            Dim txt As String
            txt = rtb1.Text.Replace(vbLf, " ")
            txt += " "
     
            'On fige la position du curseur dans le texte.
            lastPos = pos
     
            'On remet en forme le nouveau texte et 
            'on repositionne le curseur à sa place.
            rtb1.Text = createLines(txt)
            rtb1.Select(lastPos, 0)
     
        End Sub
     
        Private Function createLines(ByVal txtSource As String) As String
     
            'Création d'une liste des espaces (=séparateurs des mots).
            Dim reg As New System.Text.RegularExpressions.Regex(" ")
            Dim mc As System.Text.RegularExpressions.MatchCollection
            mc = reg.Matches(txtSource)
     
            Dim i As Integer = 0 'Compteur d'espaces
            Dim j As Integer = 0 'Position du dernier espace de la ligne en cours.
            Dim k As Integer = 0 'Incrémentation des sauts de lignes (vbCrLf = 1 char)
     
            For Each mtch As System.Text.RegularExpressions.Match In mc
                i += 1
                'Recherche la position du dernier espace de la ligne en cours
                'respectant la longueur de ligne imposée.
                If mtch.Index > j + maxCarParLigne + 1 Then
                    j = mc.Item(i - 2).Index
                    'Suppression de cet espace et insertion d'un saut de ligne.
                    txtSource = txtSource.Remove(mc.Item(i - 2).Index + k, 1)
                    txtSource = txtSource.Insert(mc.Item(i - 2).Index + k, vbCrLf)
                    k += 1
                End If
            Next
            'suppression de l'espace de fin, créé au début.
            Return txtSource.TrimEnd(CChar(" "))
     
        End Function
     
        Private Sub rtb1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rtb1.SelectionChanged
            'Position actuelle du curseur.
            pos = rtb1.SelectionStart
     
        End Sub

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    je vous remercie bien vous les deux,
    je vais tester et je vous tiens au courent.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 48
    Points : 14
    Points
    14
    Par défaut
    bonsoir,
    le problemme de ce code qu'il éfface les espaces entre les mots....
    ainsi si le texte est mis en forme, (taille de la police son style....) sa mise en forme sera aussi éffacée.
    je ne vois pas comment je peux corriger ces problemmes...
    pouvez -vous m'aider?
    merci

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    voici un essai, toujours pour le début de la question :
    Imports System.Text.RegularExpressions

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    Public Class Form1
     
        Dim maxCarParLigne As Integer = 28 'Nombre cractères maxi par lignes.
        Dim longSource As Integer = 0 ' Nbre caract. du texte global.
        Dim debPlage As Integer = 0 'Index début et fin de la portion de texte à traiter.
        Dim finPlage As Integer = maxCarParLigne
        Dim pos As Integer = 0 'Position actuel du curseur.
        Dim lastPos As Integer = 0 'Position antérieure du curseur.
        Dim longCurrentLine As Integer = 0 'Nbre caract. de la ligne sélectionnée.
        Dim longCurrentLineEtMotSuivant As Integer = 0 'Nbre caract. de la ligne sélectionnée + le 1er mot de la ligne suivante.
     
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            'chargement éventuel d'un fichier texte (Rtf) existant.
            rtb1.LoadFile(IO.Path.GetFullPath("Expressions régulières1.rtf"))
     
        End Sub
     
     
        Private Sub rtb1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rtb1.SelectionChanged
     
            'Position actuelle du curseur.
            pos = rtb1.SelectionStart
     
            ' Regex correspondant à tout espace blanc (équivalent à [ \f\n\r\t\v]).
            Dim regNR As New System.Text.RegularExpressions.Regex("\s")
     
            'Calcul de la longueur de la ligne sélectionnée et de celle ci + le 1er mot de la ligne suivante.
            ' Recherche de l'index du début de la ligne suivante
            Dim debLineSuiv As Integer
            debLineSuiv = rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos) + 1)
     
            ' Si cette ligne existe.
            If debLineSuiv > -1 Then
     
                ' La différence entre les index de début des 2 lignes donne la longueur de la ligne en cours.
                longCurrentLine = debLineSuiv - (rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos)) + 1)
     
                'A partir de lindex de la ligne suivante, on recherche le 1er espace blanc = index de la fin de son 1er mot.
                ' Si la recherche est fructueuse le calcul se fait sinon on lui donne la valeur indiquée.
                Dim premMotLineSuivant As Match = regNR.Match(rtb1.Text, debLineSuiv)
                If premMotLineSuivant.Success Then
                    longCurrentLineEtMotSuivant = premMotLineSuivant.Index - rtb1.GetFirstCharIndexOfCurrentLine
                Else
                    longCurrentLineEtMotSuivant = maxCarParLigne + 1
                End If
     
                ' Sinon, on calcul à partir de la fin du texte.
            Else
                longCurrentLine = longSource - (rtb1.GetFirstCharIndexFromLine(rtb1.GetLineFromCharIndex(pos)))
                longCurrentLineEtMotSuivant = maxCarParLigne + 1
            End If
     
        End Sub
     
        Private Sub rtb1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtb1.TextChanged
            miseEnForme()
        End Sub
     
        Private Sub miseEnForme()
     
            lastPos = pos 'position du curseur au du changement de texte
            debPlage = rtb1.GetFirstCharIndexOfCurrentLine 'le début de la ligne cursée.
     
            'Si la ligne répasse le nombre de char autorisés ou si la ligne + le mot suivant est inf à cette valeur = traitement.
            If longCurrentLine > maxCarParLigne OrElse longCurrentLineEtMotSuivant < maxCarParLigne + 1 Then
     
                'On ajoute un espace en fin de texte, afin que tous les mots soient traités par la regex.
                If Not Char.IsWhiteSpace(rtb1.GetCharFromPosition(rtb1.GetPositionFromCharIndex(longSource))) Then
                    rtb1.AppendText(" ")
                End If
     
                ' Les regex :
                ' "[\p{P}\s\w]+(?=[\s])" représente une suite de mots entiers.
                ' "[\n\r]" représente un saut de ligne.
                Dim regMot As New System.Text.RegularExpressions.Regex("[\p{P}\s\w]+(?=[\s])")
                Dim regNR As New System.Text.RegularExpressions.Regex("[\n\r]")
     
                ' collection de suites de mots ou de sauts de lignes trouvés dans la plage fixée. 
                Dim mcMot As MatchCollection
                Dim mcNR As MatchCollection
     
                ' "longPlage" représentera la suite de mots maxi possible dans la plage fixée.
                Dim longPlage As Integer = 0
     
                ' Traitement.
                Do
                    ' Calcul de l'index du début de la plage à traiter et longueur du texte.
                    debPlage += longPlage
                    longSource = rtb1.TextLength
     
                    ' Traitement terminé, on sort de la boucle.
                    If debPlage >= longSource Then
                        Exit Do
                    End If
     
                    ' Calcul de la fin de la plage = au max autorisé sauf en fin
                    ' de texte = aux derniers caractères restants afin d'éviter un dépassement de capacité.
                    finPlage = Math.Min(maxCarParLigne + 1, longSource - debPlage)
     
                    ' Collection des sauts de ligne dans la plage, remplacés par des espaces.
                    mcNR = regNR.Matches(rtb1.Text.Substring(debPlage, finPlage))
                    For Each mNR As Match In mcNR
                        rtb1.SelectionStart = debPlage + mNR.Index
                        rtb1.SelectionLength = mNR.Length
                        rtb1.SelectedText = Regex.Replace(rtb1.SelectedText, mNR.Value, " ")
                    Next
     
                    ' Définit la position de la fin du dernier mot entier dans la plage 
                    ' et remplace l'espace suivant par un saut de ligne.
                    ' Définit la longueur de la chaine pour le départ de la plage suivante.
                    mcMot = regMot.Matches(rtb1.Text.Substring(debPlage, finPlage))
                    If mcMot.Count > 0 Then
                        Dim mcMotStr As String
                        mcMotStr = mcMot(mcMot.Count - 1).Value
                        longPlage = mcMot(mcMot.Count - 1).Index + mcMot(mcMot.Count - 1).Length
                        rtb1.SelectionStart = debPlage + longPlage
                        rtb1.SelectionLength = 1
                        rtb1.SelectedText = Regex.Replace(rtb1.SelectedText, rtb1.SelectedText, vbCrLf)
                        longPlage += 1
                    End If
     
                Loop
     
            End If
     
            ' Repositionne le curseur.
            rtb1.Select(lastPos, 0)
     
        End Sub

Discussions similaires

  1. Limiter les caractères "affichables" dans un Text
    Par Marvelll dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 27/04/2010, 17h26
  2. Limiter les caractères d'une Police
    Par tom42 dans le forum Flash
    Réponses: 2
    Dernier message: 29/03/2007, 12h20
  3. limitation de caractére dans une requête SQL sous Acces
    Par amka dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/08/2006, 15h15
  4. [JTextField]limiter les caractères ?
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/12/2005, 12h12
  5. Les caractères dans une application console
    Par maximedrouet dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2005, 16h44

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