BUG RICHTEXBOX ?

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 8 juil. 2010 à 19:12
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 12 juil. 2010 à 20:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52001-bug-richtexbox

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 juil. 2010 à 20:49
ok pour un post d'un editeur montrant cette fonctionnalite...

je me tiens a ta disposition pour la suppression le moment venu
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 juil. 2010 à 20:37
Bonsoir,

Okay, c'est sympa. Mais de mon point de vue ce code ne doit pas rester pour la qualité de Code-Sources. De plus, difficile ensuite, de critiquer "bidule machin" qui dépose quelques choses qui ne ressemble à rien... Comme je l'ai annoncé dès la mise en ligne, "Ce code en n'est pas un. (Il sera retiré dans quelques temps)". IL était (je crois) intéressant de soulever le problème et je ne pouvais pas l'expliquer autrement. LE forum me semble pas adapté à ce type particulier, ni la section des codes d'ailleurs, mais c'était le seul où je pouvais faire partager cette bizarrerie. LA tolérance des admins est tout à leur honneur, comme tu l'as bien relevé ADN56 : "indulgence"...

Maintenant, il est vrai que cette "enquête" (je ne sais pas exactement comment le qualifier) est porteur d'information sur le RTF et pas seulement... Mais cela me semble pas assez structuré pour un tutoriel...

Ce que je vous propose, c'est de déposer prochainement une source pour un petit traitement de texte, pouvant être inséré comme modèle dans tout projet VB.NET, basé sur une RichTexBox et mettant en oeuvre non seulement le code VB.NET, mais aussi l'utilisation des modifications des codes RTF... On pourra de cette façon retrouver non seulement le code nécessaire pour la justification de paragraphe, mais également l'application d'un style (Gras, Italic, exposant...) sur n'importe quelle sélection avec plusieurs polices de caractères, chose (presque) inaccessible en VB.NET pure. Donc on retrouvera d'une certaine manière la solution mise en évidence ici.
Pour tout dire, j'ai cherché une telle source sur VBF pour un projet, et je me suis aperçu que cela n'était pas présent... enfin, il y en a quelques unes, mais ne résous pas les problèmes énoncés, et sont ni conçus pour être utilisées "prêtes à l'emploi" pour un projet (ou dans une certaine mesure "prêtes à l'emploi)... C'est la raison pour laquelle je me suis lancé dans ce RichTexBox plus à fond, et de fil en aiguille... je suis là.

Merci encore...

Amicalement,
Us.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
12 juil. 2010 à 11:58
clair pas simple cette suptilitée !
En tout cas tu as sû transformer une simple question en un tuto sur le RTF ! Bravo et merci.
Je trouve que ce code méritte aussi de rester, mais peut être plus dans la section tuto.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 juil. 2010 à 11:45
content de voir que tu as pu solutionner ce souci ^^

Merci d'avoir pris le temps de le decrire, etc.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 juil. 2010 à 11:28
Oupsss...

Lire :
"Cela marche comme ça, voilà tout"
"précisé par ADN56"
"Et je me coucherais MOINS bête ce soir..."

Au lieu de :
"Cela marche encore ça, voilà tout"
"préciser par ADN56"
"Et je me coucherais bien bête ce soir..."

Si c'est encore incompréhensible, c'est normal, j'ai pris le pli... j'écris en RTF... -:);

Amicalement,
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 juil. 2010 à 10:52
Bonjour à tous,

J'ai enfin trouvé !

Pour que cela fonctionne il faut rajouter à la balise "\qj" la balise "\rtlch"... Mais en réalité rien d'évident, et je serais encore incapable de comprendre pourquoi. Cela marche encore ça, voilà tout. Après avoir trouvé, j'ai cherché une explication, sur la documentation de Microsoft préciser par ADN56, sur Google avec ces balises clés associés avec d'autres mots en correspondances (et de différentes façons) mais rien, absolument rien !

Je vais un peu détailler, maintenant...

Pourquoi cette balise n'est apparue lors de la lecture du RTF après le coller d'un caractère venu de WORD?
----------------------------------------------------------------------------------------------------------

- En effet, je vous ai dit que lorsqu'on colle un (ou plus) caractère venu de WORD, la richTexbox appliquait ensuite correctement la justification du paragraphe. Mais ce qu'il faut aussi savoir, c'est qu'à chaque ré-interprétation du RTF, le code est remis en forme... c'est un avantage en réalité... En autre, il supprime également les balises inconnues, etc... mais là, où le bas blesse, c'est qu'il supprime (dans ce cas précis?) la balise "\rtlch". C'est pas de chance pour la repérer -:(...

- Ensuite, autre curiosité, c'est que si la richtexbox a exécuté au moins une fois la "\rtlch" alors qu'elle soit ensuite présente ou pas, la balise "\ql" est correctement exécutée. Donc même si on repart à zéro... (sauf si on ferme puis on relance la richtexbox, bien sur). Bizarre en réalité ! puisque la balise par défaut "\ltrch" qui fait opposition à "\rtlch" ne désactive par cette dernière... D'ailleurs, les autres alignements de paragraphe ne s'en trouvent pas perturbés. Je pense à priori qu'il faut passer "\rtlch" systématiquement à la richtexbox pour assurer son bon fonctionnement.

Pourquoi mettre la balise "\rtlch" avec "\qj"
----------------------------------------------------------------------------------------------------------

- Parce que ça marche avec ?!
Dans la documentation de Microsoft sur le RTF, il n'y aucune explication de cette association (ni d'exemple), la balise "\rtlch" reçoit le commentaire très épuré : "Character data following this control word is treated as a right-to-left run." . Bon, déjà j'ai du mal à bien comprendre le bien fondé du traitement "Droite-Gauche" plutôt que "Gauche-Droite", mais en plus cette propriété s'applique au "Formattage des cractères" et "\qj" au formattage des paragraphes... Ouais, ben, faire l'association des deux n'a rien d'évident... Puisque dans le premier on trouve les soulignements, gras, etc... Dans l'autre tous ce qui concerne un bloc de caractère, donc le paragraphe limité par les balises "\par" ou autres... Faire l'association des deux, pour que "\qj" fonctionne ? non, mais là c'est carrément introuvable !

On peut se poser la question, pourquoi elle n'a pas été incluse dans "\qj" ? Puisque cette dernière ne peut fonctionner seul ?... et il y en a combien comme ça ? D'autant que "\rtlch" n'est pas une fonction de formatage visible et n'a aucun effet seul... ?! Bref, encore un truc ou seul Microsoft peut en connaitre la raison, mais où la raison seul ne peut comprendre... (compliqué cette phrase -:); )

Comment j'ai trouvé cette balise magique ?
----------------------------------------------------------------------------------------------------------

- Suite à l'indice donné par Renfield, j'ai soupçonné que la ré-interprétation du RTF devait cacher des choses. Et comme dit plus haut, le chargement d'un RTF venu de WORD exclusivement avait le même effet (bénéfice) sur la justification d'un paragraphe. J'ai donc regardé le code du fichier RTF à l'aide d'un logiciel HexData... Bon, tâche légèrement ingrate puisqu'en enregistrant un simple texte "Essai pour CodeSource", on se retrouve tout même avec un fichier de 5 Ko... Cela fait pas mal de mot clé à éplucher avant de cerner celui qui faut (par chance il n'en avait qu'un)... Mais bon... on est habitué avec Microsoft d'avoir des gros volume pour rien...

Le mot de la fin...
----------------------------------------------------------------------------------------------------------

- Premier enseignement sur le RTF, pour en connaitre les subtilités du codage, il faut passer par WORD, et étudier son code... En effet, aucun autre logiciel ne fait correctement la justification...

- Et je me coucherais bien bête ce soir...

Merci à tous pour vos réactions et soutient...

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2010 à 13:12
si ca avance et qu'une solution est trouvee, pas de raison de supprimer le code
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
10 juil. 2010 à 12:21
Bonjour à tous,

Renfield, que c'est intéressant ce que tu me dis là... Nécessairement la solution du bug se trouve dans les données du COPIER/COLLER, puisque cela fonctionne avec... Comme je le disais un peu avant, c'est bien dans cette voie que je vais rechercher encore un peu...

Bon 3 jours sont passés, "Ce code [qui] en n'est pas un" s'auto-détruira à minuit... Enfin, dès que les Admins le feront...

Merci à tous pour vos réactions, et à bientôt pour une prochaine Mission Impossible... Ouais, ben, cela rime avec l'auto-destruction... -:);

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 juil. 2010 à 03:38
pour cette histoire de copier coller avec Word...
il y a une chose a prendre en compte :

Quand tu copies depuis Word (ou Excel, ou tout un tas d'autres applications)
tes donnees se retrouves copies de nombreuses fois, dans un grand nombre de formats.

le texte seul, a destination de zones de texte
une version RTF
une image bmp
une version HTML
une version Unicode
...

quand tu colles, c'est a chacun de prendre le format qu'il souhaites, selon sa propre liste de priorites.

Ca m'a deja ete utile par le passe. Je copiais un tableau de donnees depuis VB6. Je generais une version Texte, avec des tabulations, etc ; et une version HTML, pour sortir un beau tableau pour les mails ou Excel.

tu devrais prendre ou coder un Clipboard Viewer pour constater ce phenomene assez interessant.

Ou je veux en venir ?

la correction de ton bug viens peut etre d'un format de clipboard en particulier...

Faurais eliminer une de ces version des donnees et voir lequel fais mouche.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
9 juil. 2010 à 21:37
Bonsoir,

Pour le bug, j'ai trouvé qlq forums (très très peu, mais c'est assez logique vu le sujet) qui dénote exactement le même problème que j'ai constaté. Par exemple, en anglais dans le texte :

"then have a look at this sample project and search for qc in the second Rtf....
once you find it, substitute the "c" of "\qc" with "l" or with "r" (so to have "\qr" or "\ql" ) and then press the commandbutton on the bottom right of form...

By the way:
"\qj" (justified) does not work with rtfBox control: it makes text left alligned. "

Ce que je constate effectivement. En clair quand je remplace \qc (paragraphe centré) par \qr (para. à droite), cela fonctionne bien et inversement (idem si on utilise \ql (à gauche). Toutes les combinaisons fonctionnent bien sauf par \qj (para. justifié) ou on observe l'alignement à gauche... c'est donc un BUG... MAIS ma trouvaille donc, je me répéte, c'est que coller un caractère (ou plus) de WORD dans la RichTexBox annule le BUG, et la RichTexBox se met à fonctionner normalement ?... On peut ensuite faire toutes les combinaisons d'alignement qu'on veut, ça marche...

EN toute logique, je me suis posé la question : Qu'est-ce que WORD fait de plus que les autres quand on colle un texte ?? Question, sans réponse... J'ai tenté une réflexion (et des essais) en ce concerne le codage du caractère... Le jeu de caractère étant étendu sous WORD... Mais je n'y arrive pas vraiment à faire ce que je veux pour mener à bien ces tests... C'est à dire COPIER/COLLER un caractère codé de façon similaire à WORD (sans passer par WORD)... Si vous avez une idée, car je suis un peu perdu avec ce genre de manipulation (et je ne suis plus très chaud avec l'UNICODE).

J'ai alors fait un autre test, qui consiste à programmer cette manipulation de COPIER/COLLER pour voir si cela fonctionne encore... Et au miracle cela marche. Voici le bout de code :

=
Dim WordApp As Object
Dim WordDoc As Object
Dim WordRng As Object

=

WordApp = CreateObject("Word.Application")

WordApp.visible = True
WordDoc = WordApp.documents.add()
WordDoc.range.text = "*"
WordRng = WordDoc.range.copy()

Edit_HTML.Paste()
Edit_HTML.Clear() ' Efface ce qui fait une espèce d'initialisation

WordApp.DisplayAlerts = 0 ' Ben... laisse le message de sortir ? je verrai plus tard...
WordApp.quit()

ENSUITE, il est à noter que ce bug existe depuis... Windows 95... Est-ce aussi la raison pour laquelle, MicroSoft n'a pas mis la possibilité de justifié un texte dans les instructions de VB.NET ?... En tout cas, cela leur évite bien des remarques sur ce point... Comme bizarrement...
Pour revenir encore un peu dessus... NE pensez pas que le problème vient du codage en RTF, j'ai fait de nombreux tests, même repris le code de WORD en justifié, et rien n'y fait... Exemple de codage RTF de WORD :

{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1036\deflangfe1036\deftab708{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}
\viewkind4\uc1\pard\ltrpar\qj\f0\fs24 Essai pour CodeSource\par
\pard\ltrpar\par
}

Si on modifie la balise \qj par \qc, alors aucun souci, le parapgraphe est centré, par contre en prenant la précaution de mettre un peu plus grand que ci-dessus, le laisser en \qj ou en revenant dessus, n'importe cela n'a pas l'effet souhaité...

C'est peut-être long et compliquer à me suivre... donc j'abrège...

Enfin des autres tests que j'ai pas totalement finis, car je regarde dans tout les petits coins :); c'est le chargement d'un fichier en RTF fait par WORD... Cela semble débloquer la RichTexBox aussi... Peut-être une bonne solution... reste à confirmer mais j'en ai marre pour aujourd'hui (1 journée à creuser, j'ai des ampoules partout)...
Adn56, le lien est sympathique... mais bon, j'ai pas trouvé de raison à ce bug... Ensuite, non les {} ne permettent rien, et ne sont pas interprétées, et même retirées après l'envoi à la richTexBox... Comme tous mauvais formatage d'ailleurs... Une RichTexBox reformate son code à chaque ré-interprétation et corrige également l'organisation interne des balises. Par exemple, si on met \qc en plein milieu d'un paragraphe, Il sera remis en bonne place juste au début du paragraphe... D'où l'explication de l'anglais "These control words can appear anywhere in the body of the paragraph, not just at the beginning."... JE chasse encore demain, et pis ce sera ou pas la conclusion finale pour ce dépôt...

Renfield, Ouais moyennement clair... Mais, en fait l'intervention dans le RTF et bien plus pratique, et évite bien des noeuds au cerveau... On met la balise \b au début de la sélection et \b0 à la fin de la sélection et le tour est joué... C'est de loin la solution la meilleure que j'ai trouvé. (je le dis après 3 jours de casse tête dessus). De plus, cela à bien d'autre avantage... Par exemple, de la même manière on peut faire les exposants et Indice, qui je crois ne sont pas accessible par VB.NET... etc...
Amicalement,
Us.
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
9 juil. 2010 à 15:22
Salut, tu as essayé en rajoutant les {} ?
Car en sommes tu écris /qc puis {sjdsncnjscnjs}
peut être que cela ne lui plait pas ?
Ex : {\f0\fs24 avec des caractères {\b gras},}
si je justifie cela devrait être comme cela non ?
{\qc \f0\fs24 avec des caractères {\b gras},}

http://www.microsoft.com/downloads/details.aspx?FamilyID=dd422b8d-ff06-4207-b476-6b5396a18a2b&DisplayLang=en#RelatedLinks
Paragraph Formatting Properties
These control words (described as in the paragraph-text syntax description) specify generic paragraph formatting properties. These control words can appear anywhere in the body of the paragraph, not just at the beginning.

bonne chasse au bug ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 juil. 2010 à 14:21
pour cette histoire de grad, faudrait traiter la selection par range de caractère ayant la même police appliquée...

pas clair ?
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
9 juil. 2010 à 00:48
Hum... jack, tu ne vois pas le problème ? Seulement si on impose toute une police... Oui mais, si on sélectionne du texte, il n'est pas obligatoirement avec une seule police... Donc les mettre en gras sans changer leur police... Gros problème ! (A ta réponse mi-figue, mi-raison, je pense que tu as pris conscience de la difficulté, en réalité...). J'ai trouvé 2 parades pour régler définitivement ce problème dû à limitation de VB.NET, mais qui n'est pas un BUG, mais plutôt une difficulté.

Mais tout ça, n'est pas du tout en rapport avec le BUG de la Richtexbox pour la justification d'un texte. La raison (éphémère) de ce dépôt...
Revenons donc plutôt à ça...

Amicalement,
Us.
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 juil. 2010 à 23:35
Je ne vois pas le problème :
Si tu attribue une police à toute la RTB, il suffit de bien répéter le nom de la fonte.
Par contre, j'admets que la manipulation des Font est un peu délicate.
Ils ont fait ça parce que c'était trop facile avant et comme .Net complique tout ...
Condoléances.

With Me.RichTextBox1
.Text = "N'importe quoi Private Sub Button2_Click(ByVal sender As System.Object, " & _
"ByVal e As System.EventArgs) Handles Button2.Click"
.SelectionStart = 10
.SelectionLength = 15
.SelectionFont = New Font(.Font.Name, .Font.SizeInPoints, FontStyle.Bold, _
GraphicsUnit.Point, .Font.Unit) ' .Font.Name corrigé
End With
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 à 22:21
Ah, Jack, tu vas penser qu'il suffit donc de préciser la Font dans le code... Mais problème, si tu as des polices différentes, tu vas pas pouvoir conserver leurs Styles... Et ensuite, en ce qui me concerne, j'ai tourné en rond... car VB.NET ne permet pas d'utiliser .SelectionFont.Bold en écriture, mais en lecture seulement (contrairement à VB6)... Bref, c'est pour finir avec ça...

Amicalement,
Us.
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 à 22:09
Ah ! Jack, aussi ton code n'est pas bon !! si...si... je sais ce que je dis... Tu crois que cela fonctionne, mais non, hélas... J'explique :

Fait ce que je décris, et tu comprendras mieux qu'un discours évasif :

- Ouvre un nouveau projet, met une Richtexbox + 1 bouton + Ton code au bouton.
- Lance ! Et là tu vois la partie du texte en gras qui part de la 11ième position et d'une longueur 15... Et là tu te dis, que us_30 est en plein délire !... mais attends une seconde...
- Retourne sur IDE, et change la police met en "Courrier News", normalement la richetexbox est en Mircosoft Sans Sérif taille 8, par défaut...
- Et choisi une taille un peu plus grosse (pour mieux voir, la taille 8 ne permet pas bien voir ce qui se passe)... Taille 14...
- Relance le tout, appuis sur ton bouton... Et là voit le résultat ! La partie de texte en gras est maintenant encore en Gras Microsoft Sans Sérif taille 8... et non en "courrier news Gras" taille 14... Et tout cas, chez moi... et le bug semble reproductible, puisse que j'ai utilisé le forum d'aide il y a que quelques jours, pour trouver une bonne solution... Et je ne suis pas au bout de mes peines, car si les polices sont différentes, d'autres codages, que le tient, sensés fonctionner (repris un peu partout et même sur le site de Mircosoft) bug lamentablement...

Alors, à moins, que tu m'expliques comment on s'en sort... Car je n'ai pas vu de codage performant en la matière... Dit moi si tu as la même chose...

Amicalement,
Us.
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 à 21:37
hé, non... mais ce n'est pas mettre un texte en gras, ce que je relève... J'aurais pas dû évoquer ce point car il n'y a rien à voir ici... Ne lisez donc pas trop en diago... c'est ma faute, je vous prie de relise avec plus de précision...

ADN56, "visiblement ya un souci !" => lequel ? Hormis l'astuce du repérage mais qui ne change rien en réalité... J'ai testé pas uniquement avec mon codage en entrée, mais par bien d'autres façons, notamment en utilisant directement .selectedRTF... c'est sur une autre source, j'ai donc qu'essayer de faire ressortir que l'essentielle... Ceci pour dire que je sais bien que le code n'est pas le plus propre, mais je ne pouvais pas mettre tout (déjà ce n'est pas fini, bref...)

Si vous pouvez alors jeter vos yeux aguerris...

Amicalement,
Us.

PS : Je ne compte pas laisser ce code bien longtemps surtout si vos réactions mène à une idée de résolution... mais vraiment je ne crois pas...
Adn56 Messages postés 1172 Date d'inscription jeudi 24 mai 2007 Statut Membre Dernière intervention 28 septembre 2013 1
8 juil. 2010 à 20:15
Je suis d'accord avec jack sur le fond (le forum est là pour cela ) mais comme US le dit lui même (source temporaire) donc indulgence, non ?
allez on répond, puis on déplace dans le fofo ^^ .
Mais en vrai que devient son bug ?
Il ne s'agit visiblement de placer un simple texte en gras, mais d'un texte justifié qui bug selon ...
j'ai pas le temps de tester, mais j'ai lu le code en diagonale et visiblement ya un souci !
@ vous lire.
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 juil. 2010 à 19:12
Pour mettre du texte en gras :
With Me.RichTextBox1
.Text = "n'importe quoi Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click"
.SelectionStart = 10
.SelectionLength = 15
If Not .SelectionFont.Bold Then
.SelectionFont = New Font(Me.Font, FontStyle.Bold)
End If
End With

Où est ton problème ?
Le forum est là pour te répondre.
Merci de ne pas utiliser le dépôt de source pour ce genre de question.
Rejoignez-nous