Tabulation de texte dans RichTextBox [Résolu]

Signaler
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
-
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
-
Bonjour,
J'essaye en vain depuis un bout de temps de faire une sorte de tabulation dans un RichTextBox, mais je n'y arrive pas.

J'ai trouver la fonction String.Format({0,-3} {1,-25},str1,str2) qui est sensé aligner mon str1 à gauche dans un champ texte de 3 caractères puis mon str2 aussi à gauche mais dans une zone de 25 caractères.

Hélas je ne sais pas pourquoi mais quand je fais :

compteur = 3
string1() = {3,4,6}
string2() = {Bière,Pizza 4 fromages,Sandwich}
string3() = {6.30,40.90,18.62}
StringFinal = Nothing

For i as integer = 0 to compteur -1
StringFinal += VbCrlf & String.Format({0,-3} {1,-25} {2,10}, str1(i), str2(i), str3(i))
Next


Il m'affiche :
http://pastebin.com/RWXs2fbG
3   Bière                   6.30
4 Pizza 4 fromages 40.90
6 Sandwich 18.62

Au lieu de :
http://pastebin.com/fmcPfSuw
3   Bière                       6.30
4 Pizza 4 fromages 40.90
6 Sandwich 18.62



Je ne comprend pas pourquoi cela ne fonctionne pas, et je comptais sur vous pour m'éclairer.

Merci de votre réponse.

4 réponses

Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1
Résolu par vb95 :

Bonjour Arnoid ainsi qu'à Ucfoutu

Le contrôle dans lequel s'affiche le texte doit avoir une Font proportionnelle, c'est-à-dire que les espaces doivent occuper autant de place qu'une lettre .
Essayes avec le Font "Consolas" dans la propriété Font du contrôle où le texte est affiché

Une Form, une TextBox multiligne avec sa propriété Font sur "Consolas" et le code suivant

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim string1() As String
        Dim string2() As String
        Dim string3() As String

        string1 = {"3", "4", "6"}
        string2 = {"Bière", "Pizza 4 fromages", "Sandwich"}
        string3 = {"6.3", "40.9", "18.62"}

        For i As Integer = 0 To 2
            TextBox1.Text += String.Format("{0,-3} {1,-25} {2,10}", string1(i), string2(i), string3(i)) & Environment.NewLine
        Next

    End Sub
End Class
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
225
Bonjour,
J'ai :
1) mis ton code entre balises code
2) déplacé ta discussion vers le sous-forum (VB.Net) adéquat
3) ajouté des représentations graphiques de tes résultats pour éviter des va-et-viens entre tes deux liens.
Un VB.Nettiste devrait passer par là (je n'en suis pas un)
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1 >
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020

J'ai quand même un problème je n'arrive pas à imprimer mon RichTextBoxPrintCtrl avec une police différente ..
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020
109 >
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016

Salut
As-tu accès à la propriété Font depuis le contrôle RichTextBoxPrintCtrl ?
D'où sort ce contrôle ?

Autre chose : ton problème de tabulation est résolu !
Il serait judicieux d'ouvrir un nouveau post avec un lien sur celui-ci : un problème à la fois
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1 >
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020

Re,
Oui mais cela ne change rien au final, j'ai trouver comment faire grâce à ce lien : https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6ecc5b1e-ffcd-4f8c-afe7-2248b1b26082/create-richtextboxprintctrldll-in-vbnet-2012?forum=netfxbcl

Mais maintenant j'ai l'impression en double en arrière plan le texte sans police proportionnelle et par dessus le texte avec ma police proportionnelle. Je vais devoir trouver ou est ce que l'impression ce fait dans mon code .. (pas gagner :') )

Voici le code de
PrintDocument1.PrintPage


        Dim font1 As New Font("Courier New", 10, FontStyle.Regular)
        e.Graphics.DrawString(TicketFinal.Text, font1, Brushes.Black, 0, 0)

        ' Print the content of the RichTextBox. Store the last character printed.
        checkPrint = TicketFinal.Print(checkPrint, TicketFinal.TextLength, e)

        ' Look for more pages
        If checkPrint < TicketFinal.TextLength Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If



Finalement j'ai trouver le problème était juste devant moi, il suffit de mettre cela dans la propriétée
PrintDocument1.PrintPage
:

        Dim font1 As New Font("Courier New", 10, FontStyle.Regular)
        e.Graphics.DrawString(TicketFinal.Text, font1, Brushes.Black, 0, 0)

Car le RichTextBoxPrintCtrl prend déja en compte l'impression à ce stade et en faisant
TicketFinal.Print(checkPrint, TicketFinal.TextLength, e)
une deuxième impression se colle dessus.

Merci d'avoir répondu à mes questions : PROBLEME RÉSOLU
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020
109 >
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016

Bonsoir
Retour après la promenade en famille
C'est la bonne j'espère ce coup là ?

petit bémol tu as écrit : Finalement j'ai trouver le problème était juste devant moi, il suffit de mettre cela dans la propriété

PrintDocument1.PrintPage


Ce n'est pas une propriété : c'est un Sub ( Sous-programme) et en étant pointilleux c'est même un Evenement
Les propriétés sont associées aux contrôles : la propriété Text d'une RichTextBox par exemple
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1 >
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020

Bonsoir,
Oui cette fois tout fonctionne, désolé pour la faute j'ai écris cela un peu précipitamment (faut dire que ça fais 3 jours que je bloque sur ça).

En tout cas cela marche parfaitement, pour preuve : https://1drv.ms/i/s!ArJuty0iDx8-jkJxaoQruFJtiKKE

Merci de m'avoir aider à résoudre ce problème, à bientôt sur le forum j’espère.
Bonne soirée !

Ps : Je n'arrive plus à modifier mon ancien post, donc si un modo passe par là, cela serait sympas pour les autres de corriger mon erreur. Merci !
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1
J'ai aussi découvert depuis peu la fonction
vbTab.PadRight(nbr)
qui aligne la chaîne soit à droite soit à gauche en rajoutant des espaces.

Mais toujours le même problème ..
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020
109
Le problème vient du fait que la police de caractères utilisée n'est pas proportionnelle !
Que tu alignes avec String.Format ou PadRight ou PadLeft ou une fonction codée par toi-même le problème restera toujours !
Tu dois travailler avec une RichTextBox classique avec une Font proportionnelle puis ensuite pour imprimer envoyer le contenu de cette RichTextbox dans RichTextBoxPrintCtrl
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
9
Bonjour,

Juste trop tard mais bon.

Si tu fais comme ceci, (c'est du c# mais facile a traduire) cela devrait fonctionner avec toutes les polices de caractères.

http://stackoverflow.com/questions/154204/modifying-default-tab-size-in-richtextbox

Je n'ai pas testé.

Bonne journée
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1 >
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017

Bonjour cgandco

Merci de votre réponse, j'ai regarder cela pourrais m'aider pour la suite de mon programme, merci !

Bonne journée
Messages postés
2166
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juillet 2020
109 >
Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017

bonjour cgandco

Ton code en C# ne fait que poser des taquets de tabulation
Ce qui fait que les différents éléments seront tous alignés à gauche à partir du taquet : il n'est pas possible de faire de l'alignement à droite sauf si on utilise une police proportionnelle et que l'on calcule l'alignement pour chaque élément à droite ( soit le nombre d'espaces à inclure à gauche de l'élément)
De plus les offsets de tabulation sont exprimés en pixels
Beaucoup moins souple et performant que String.Format tel qu'utilisé plus haut

voir : https://msdn.microsoft.com/fr-fr/library/system.windows.forms.richtextbox.selectiontabs(v=vs.110).aspx
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
49
Bonjour

Pourquoi ne pas utiliser un datagridview pour afficher les
donnnées sous forme de tableau et ensuite imprimer le datagridview.

http://vb.net-informations.com/datagridview/vb.net_datagridview_printing.htm
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1
Bonjour,

Ce code imprime une sorte de photo du datagridview, moi je voudrais plutôt sous forme de texte basique.

Merci quand même.
Bonne journée
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
49 >
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016

Cela imprime ton dgv comme il est
fais un petit test
ajoute à ta form 3 controls
PrintDocument
PrintPreviewDialog
et un button

Button1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseClick

PrintPreviewDialog1.Document = PrintDocument1
PrintPreviewDialog1.WindowState = FormWindowState.Maximized

If PrintPreviewDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PrintPreviewDialog1.Document.Print()
End If

End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim bm As New Bitmap(DataGridresult.Width, DataGridresult.Height)
DataGridresult.DrawToBitmap(bm, New Rectangle(0, 0, DataGridresult.Width, DataGridresult.Height))
e.Graphics.DrawImage(bm, 0, 0)
End Sub


ps DataGridresult c'est le nom de ta datagridview
Messages postés
35
Date d'inscription
mardi 17 février 2015
Statut
Membre
Dernière intervention
5 novembre 2016
1 >
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019

Merci ShayW

J'avais déjà testé précédemment mais je doit rajouter une en tête centrer et cela ne m'arrange pas pour le datagridview.

Mon ticket :

https://1drv.ms/i/s!ArJuty0iDx8-jkJxaoQruFJtiKKE

Bonne journée !