Tabulation de texte dans RichTextBox [Résolu]

Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 16 août 2016 à 19:12 - Dernière réponse : Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention
- 17 août 2016 à 18:22
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.
Afficher la suite 

21 réponses

Répondre au sujet
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 13:53
+1
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Arnoid
ucfoutu 18022 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 16 août 2016 à 19:27
0
Utile
10
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)
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention > vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 août 2016 à 15:07
J'ai quand même un problème je n'arrive pas à imprimer mon RichTextBoxPrintCtrl avec une police différente ..
vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 15:17
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
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention > vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 août 2016 à 15:22
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
vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 18:16
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
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention > vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 août 2016 à 18:22
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 !
Commenter la réponse de ucfoutu
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 13:34
0
Utile
4
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 ..
vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 17 août 2016 à 13:54
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
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 17 août 2016 à 14:34
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
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention > cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 17 août 2016 à 14:48
Bonjour cgandco

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

Bonne journée
vb95 1386 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 17 août 2016 à 15:02
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
Commenter la réponse de Arnoid
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 17 août 2016 à 14:49
0
Utile
3
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
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 14:51
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
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention > Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention - 17 août 2016 à 15:45
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
Arnoid 35 Messages postés mardi 17 février 2015Date d'inscription 5 novembre 2016 Dernière intervention > cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 17 août 2016 à 15:59
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 !
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.