RichTexBox Application Style G S I sur selections multiples

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 4 juil. 2010 à 21:29
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 8 juil. 2010 à 23:02
Bonjour,

Je me casse les dents depuis plusieurs heures sur ce fameux RichTexBox, que je pensais être un classique, pourtant j'ai beau éplucher le WEB je ne trouve pas de réponse... C'est la raison pour laquelle je lance ce S.O.S.

Dans une petite application, j'ai donc les 3 boutons classiques : G I S, et je cherche simplement mettre le texte sélectionné en G I ou S, même quand le style des mots sélectionnés n'ont pas forcément le même style... C'est ici mon problème (sous VB.NET !).


C'est donc la manipulation qu'on rencontre dans WordPad par exemple.
- En détail simplifié : Si on sélectionne deux lettres formatées, une en italique, l'autre en souligné, puis qu'on appliqué ensemble le sytle Gras, qu'on obtienne Gras Italique, pour l'un, et Gras Souligné pour l'autre...

En vb6, il n'y avait aucune difficulté, mais en VB.NET, les propriétés .selectionFont.Bold sont qu'en Lecture, pas en écriture...

Avez-vous une Solution ? une Idée ? une Piste ? Merci d'avance.

Amicalement,
Us.

9 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
5 juil. 2010 à 02:07
Salut Us ;)

En vb6, il n'y avait aucune difficulté, mais en VB.NET, les propriétés .selectionFont.Bold sont qu'en Lecture, pas en écriture...


En passant en .Net, comme toi je me suis fait avoir, en vérité c'est la propriété Bold de la classe font qui est readonly. Pas la propriété SelectedFont de l'objet RichTextBox. Il faut donc le gérer comme suit :

RichTextBox1.SelectionFont = New Font(New System.Drawing.FontFamily("Arial"), 8.25, FontStyle.Bold)


C'est un peu bebête mais en regroupant ce code dans une procédure (ChangeSelectedText par exemple), les élements de ta toolbox n'ont plus qu'a appeler celle-ci (la même procédure pour les 3 éléments) puisse qu'il faut de toute façon recréer une nouvelle instance de la classe Font. Donc économie de code.

Private Sub ChangeSelectedText () Handles btn_B.Click, btn_S.Click, btn_I.click
   Dim F As New Font(....)
   With F
     '...
   End With
   RichTextBox1.SelectionFont = F
End Sub



Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
5 juil. 2010 à 12:32
Bonjour Mayzz,

Merci de m'avoir répondu. Mais j'avoue ne pas comprendre comment mettre en oeuvre le code que tu proposes, ni même comprendre pourquoi le style de la sélection sera conservé. Pour imposer un style à une sélection, cela ne me pose pas de problème. Mais mettre une surcharge lorsque la sélection est composé de différents Style, là ben, c'est mon problème. Je ne sais pas si tu m'as bien compris. Si oui, pourrais-tu me préciser mieux le code à mettre sous un bouton, l'utilisateur ayant mis une partie de texte en surbrillance, il clique sur gras... et... voici mon code actuel :

    Private Sub GrasToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GrasToolStripButton1.Click

        'bogue si fontes différentes sont sélectionnées
        Dim currentFont As System.Drawing.Font = Edit_HTML.SelectionFont
        Dim newFontStyle As System.Drawing.FontStyle
        newFontStyle = FontStyle.Bold
        Edit_HTML.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, Edit_HTML.SelectionFont.Style Or newFontStyle)

    End Sub


Si la sélection est composé d'un seul et même type de caractères, alors cela fonctionne. On rajoute transforme bien la sélection en gras (même tout était souligné par exemple)... Mais si, la sélection est composée de plusieurs caractères typés différemment, là cela marche plus.

Je comprend que ".SelectionFont.Style" ne peut pas renvoyer une seule valeur unique, d'où le problème, je pense.

(Écris d'une façon ou autre, mais revenant toujours au même, je n'ai pas réussi à voir un code différent...)

=

Peut-être une solution, c'est en vérifiant chaque caractère de la sélection, pour lui appliqué ensuite ce code, par morceau en quelque sorte. Mais, bon, je trouve cela un peu brouillon... (mais si y'a pas moyen...)

=

Amicalement,
Us.
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
5 juil. 2010 à 14:16
En gros si je comprends bien (désolé je préfère être sûr avant de dire des bêtises) :

Si tu as le texte : Je vais à la plage

Et qu'une partie de celui-ci est souligné : Je vais à la plage

Mais que lors ce que tu sélectionne la phrase entière pour la mettre en gras le gras n'est pas appliqué et le résultat est différent de ceci :

Je vais à la plage

C'est bien ça ?

Cela me parait logique, mais il faudrait étudier la valeur de la propriété FontStyle retournée pour essayer de comprendre, je suppose que tu as du essayer ? Quel est le résultat ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
5 juil. 2010 à 22:11
Bonsoir,

Oui tu comprends bien, mais le résultat n'est tout à fait ce que tu décris, mais bon, le principe est bien celui-là.
Si j'explique encore plus précisément...

- Si dans la RichTexBox, on a tapé donc ainsi :

"Je vais à la plage"
: et en police Arial (par exemple)

Lorsque que je sélectionne la phrase, et click pour la mettre en Gras... On obtient toute la phrase en Gras, mais le soulignement a disparu. Soit :

"Je vais à la plage"
... car c'est bientôt les vacances...

=> Ici FontStyle retourne bien les infos qui faut : [nom de la police, size, Units, GdiCarSet, GdiVerticalFont]


- Si j'écris cette phrase dans deux polices différentes, par exemple :
"Je vais à" : en Arial
"la plage" : en Courrier New Vacances Carte Postale pour déprimer les amis...

Lorsque que je sélectionne la phrase, et click pour la mettre en Gras... On obtient un bogue !

=> Ici FontStyle retourne Rien, puisque c'est l'objet du Bug... VB.NET ne peut (et ne veut) rien retourner. Visiblement FontStyle dans ce cas n'est pas défini, du moins je l'interprète comme ça. FontStyle ne peut pas contenir plusieurs type (comme une collection), mais qu'un seul et unique...

=

Mais les deux cas de figures ont la même cause en réalité. Je ne vois pas comment on peut faire. Sur la doc en ligne de microsoft, j'ai rien trouvé. Il donne toujours le même code, qu'on retrouve partout, semblable au mien, qui impose (en fait) un typage bien défini sur une sélection semblable. Autant dire, qu'ils se sont pas fait c.... "cassés"... Comment dépassé cela ?

Pourtant je cherche à faire qu'une manipulation classique sous traitement de texte. WordPad le fait, Word aussi, etc... Sous VB6, c'était simple aussi de le faire puisqu'on pouvait appliquer la "selection.bold true" (ou un truc du genre, je me rappelle plus bien) en écriture... Sous VB.NET, c'est la misère... Les quelques codes glanés sur VBF en traitement de texte avec richtexbox, n'ont donné aucune information sur ce point. Les auteurs (trop débutants) ne se sont pas penchés sur le problème (même ils l'ont pas vus...). Bref, passons.


Enfin, bref, je suis donc dans l'impasse. Si tu vois comment sortir de là, la tête haute, sans avoir détruit mon clavier, mon unité centrale et l'écran... mon portefeuille te remerciera...

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
5 juil. 2010 à 22:50
En effet c'est bien dans ces cas précis que l'on s'aperçoit que le managé n'a pas que du bon, mais tu dois bien le savoir toi qui est l'auteur du tuto "GRANDEUR ET DÉCADENCE DE VB2008"
J'ai testé mais apparemment aucune possibilité, ce qui enlève à notre cher RTB, l'essence même de ses fonctionnalités.

Franchement, au Framework 3.5 ne pas s'être aperçu d'un tel "Bug", car c'en est un (une mauvaise gestion des propriétés du contrôles empêchant son bon fonctionnement).

En vérité, si la sélection comporte par exemple, un texte gras et non gras, SelectedFont retournera toujours Bold = False, jusque la plutôt logique car même Word agit ainsi. La ou ça bloque c'est en effet lors ce que l'on doit obligatoirement recréer une nouvelle instance de Font, celle ci aura ses propriétés sur True ou False, ce qui aura pour effet d'appliquer tous les styles à la sélection (gras, italic, souligné, barré...). Bref une belle cata quoi, merci Microsoft !
Il faudrait pouvoir n'appliquer que le style mais comme tu le dis plus haut toutes les propriétés sont readonly.

Voila, maintenant vous savez, le RTB .Net, une belle M**** qui ne sert à rien !

Désolé de ne pouvoir être d'aucun secours.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
5 juil. 2010 à 23:12
Si tu es d'un secours, enfin en quelque sorte, c'est celui de savoir que la solution simple n'existe pas ou du moins est très difficile à trouver (au cas où elle existerait)...

Bon, je vais me rabatte vers le côté obscure de la force sur VB.NET ! La décadence, quoi... et appliquer l'idée que j'avais exprimée plus haut pour contrer le problème... Bon, ce sera la force de la hache au lieu de la tronçonneuse, mais dans le cas présent, j'ai en théorie pas besoin d'une puissance de traitement à couper du bois ! oui, c'est très verdure la fin de ce paragraphe...

Merci Mayzz, pour avoir pris le temps de te pencher sur mon problème.

[i]Ma foi, si quelqu'un a la solution, qu'il se fasse connaitre... On sera donc 2 intéressés, mais surement bien plus...

/i

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
6 juil. 2010 à 19:13
Bah, bonne nouvelle, j'ai trouvé une parade imparable... J'ai rajouté un RichTexBox version VB6 !
C'est plus vieux, mais ça marche mieux...


L'idée est tout simplement de passer le texte à changer à ce dernier, pour le récupérer ensuite dans la RichTexBox de VB.NET... Pourquoi garder les deux alors, me diriez-vous ? Ben, sur l'ancien la fonction Redo/unRedo n'est pas pris en charge et quelques autres petites améliorations. Par contre, pour la conversion du texte l'ancien contrôle le fait tellement plus simplement... et le tout reste très rapide. Car j'avais imaginer contrer le pb par une programmation du RichTexBox de VB.NET, mais l'accès à ce dernier est très lent; au point même que j'ai utilisé une astuce dans des fonctions perso en transférant le contenu dans une string... Bref, passons sur cette déplorable avancée de MicroSoft... qui ma faire vraiment beaucoup de temps...

Franchement, un truc si simple à programmer avant, qui devient un vrai enfer après plus de 15 années d'évolution... Faut croire que 15 ans de bière chez MicroSoft ça laisse des traces...

Pour ceux que cela intéresses, voici le code exemple sur le style Gras, à adapter aux autres style (size, italic, underline, etc...)

        ' POLICE EN GRAS

        If Edit_HTML.SelectionLength > 0 Then

            ' Garde position initiale
            Dim Depart As Integer = Edit_HTML.SelectionStart
            Dim LgString As Integer = Edit_HTML.SelectionLength

            ' Passage à la richtexbox de VB6 qui permet sans effort de mettre les styles sans bug !!
            With AxRichTextBox1
                .TextRTF = Edit_HTML.SelectedRtf
                .SelStart = 0
                .SelLength = .TextRTF.Length
                .SelBold (Edit_HTML.SelectionFont.Bold False)
                Edit_HTML.SelectedRtf = Edit_HTML.SelectedRtf.Replace(Edit_HTML.SelectedRtf, .TextRTF)
            End With

            ' Supression du retour automatique 
            With Edit_HTML
                .SelectionStart -= 1
                .SelectionLength = 1
                .SelectedText = ""
            End With

            ' Refait la surbrillance de la selection
            Edit_HTML.Select(Depart, LgString)

        End If


Edit_HTML : RichTexBox de VB2010.NET
AxRichTextBox1 : RichTexBox de VB6 SP4, mis en Visible=false...

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
6 juil. 2010 à 19:15
Ouppsss,

Lire :
"qui m'a fait perdre vraiment beaucoup de temps"

Au lieu de :
"qui ma faire vraiment beaucoup de temps"



Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
8 juil. 2010 à 23:02
J'en profite pour mettre un dernier message pour tous ceux que cela intéressent :

J'ai résolu ce problème de manière encore plus "propre" mais plus tortueux à programmer, tout simplement en agissant directement sur le codage RTF... Il suffit alors de mettre les balises "\b" et "\b0" pour le Gras, etc... et cela quels que soient les polices concernées... C'est en fait ce que fait mon astuce avec la richtexbox version VB6...

De plus cette méthode permet d'accéder à toutes les caractéristiques d'une RTF, car en la matière les propriétés et méthodes de VB.NET reflète qu'une infime partie des possibilités du RTF... Mais je n'ai pas encore l'idéal, car cette intervention demande en définitive de recréer la roue (roue que VB.NET se devait de fournir...)

Amicalement,
Us.
0
Rejoignez-nous