Imprimer texte en colonnes - justifier un texte

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 494 fois - Téléchargée 26 fois

Contenu du snippet

Je vous propose trois petites procédures pour imprimer du texte dans une colonne dont on a défini la largeur au préalable en centimètres.

Faites un copier coller du code ci-dessous et voyez....

Remarques :
La procédure Imprime1 envoie le texte dans une colonne tel quel sans se soucier des mots.
La prcédure Imprime2 ne coupe pas les mots et les renvoie à la ligne si nécessaire

La procédure Justifier justifie le texte...

Je ne prétends pas faire là un travail digne d'être introduit dans un module mais je me suis donné quelques contraintes interessantes:

Je ne voulait pas travailler avec des tableaux, je n'ai travaillé que sur le texte directement, c'est moins lourd.
J'ai limité le nombre d'instructions à 2, à savoir Mid() et Printer.TextWidth. Pourquoi me direz-vous ? Pourquoi pas en fait !!;-)

Pour vous faire gagner un peu de temps, j'ai commenté mes 3 procédures .
Le principe est très simple (sauf qu'il faut s'amuser un peu avec les indices i, j ...) :

On découpe le texte en paquets (lignes) d'une longueurs définie en centimètres.
On affiche chaque ligne les une en dessous des autres.

Pour la JUSTIFICATION, il faut en plus recalculer pour chaque ligne un espace moyen entre les mots pour ajuster la ligne à la bonne longueur.

Voilà, il me semble que ce code est assez simple...mais on peut sans doute faire mieux, à voir !!

Source / Exemple :


Private Sub Form_Load()
'------------Taille de la Police = 15---------------------
Printer.FontSize = 15

Call IMPRIME1("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large ...", 5, 7, 4)
Call IMPRIME2("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large   .....", 9, 10, 4)
Call JUSTIFIER("Petit test pour voir ce texte s'imprimer dans une colonne de 4 cm de large   .....", 13, 13, 4)
Printer.EndDoc

End Sub

'----------- Procédure de base (code optimisé) qui découpe le texte pour le faire tenir dans une colonne

Public Sub IMPRIME1(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j As Integer
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0
'---------------On découpe le texte en lignes, chaque ligne mesurant "Largeur" cm------
    Do
        j = j + 1
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))

'-------------------On supprime les éventuels espaces au début de la ligne obtenue---------------
    
    Do While Mid(Texte, i, 1) = " "
        i = i + 1: j = j - 1
    Loop

' -----------------On envoie la ligne vers l'imprimante----------------
    Printer.CurrentX = X
    Printer.Print Mid(Texte, i, j)
    i = i + j: j = j - 1
Loop While i < Len(Texte)

End Sub

'---------- Première évolution : les mots ne sont pas coupés et sont renvoyés à la ligne.

Public Sub IMPRIME2(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j, k As Integer
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0: k = 1
'---------------On découpe le texte en lignes, chaque ligne mesurant "Largeur" cm------
    Do
        j = j + 1
        If Mid(Texte, i + j - 1, 1) = " " Then k = j
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))
    Printer.CurrentX = X

'------------------- Si on coupe un mot en fin de ligne alors on renvoie ce mot à la ligne-------------
    If (i + j < Len(Texte)) And (Mid(Texte, i + j - 1, 1) <> " ") And (Mid(Texte, i + j, 1) <> " ") And (k > 1) Then j = k

'-------------------On supprime les éventuels espaces au début de la ligne obtenue---------------
    
    Do While Mid(Texte, i, 1) = " "
        i = i + 1
    Loop
' -----------------On envoie la ligne vers l'imprimante----------------
    Printer.Print Mid(Texte, i, j)
    i = i + j
Loop While i < Len(Texte)

End Sub

'------------ Comme son nom l'indique, elle justifie "Texte" ------------------------

Public Sub JUSTIFIER(Texte As String, X As Currency, Y As Currency, Largeur As Currency)

Dim i, j, jaux, k, c, nbespace As Integer
Dim PosX, PosY, Emoyen As Currency
Printer.ScaleMode = vbCentimeters
Printer.CurrentY = Y
i = 1
Do
    j = 0: k = 1: nbespace = 0
'-------------------Découpage du texte en lignes de "largeur" cm----------------
    Do
        j = j + 1
        If Mid(Texte, i + j - 1, 1) = " " Then
            k = j
        End If
    Loop While (Printer.TextWidth(Mid(Texte, i, j + 1)) <= Largeur) And (i + j <= Len(Texte))
'------------------- Si on coupe un mot en fin de ligne alors on renvoie ce mot à la ligne-------------

    If (i + j < Len(Texte)) And (Mid(Texte, i + j - 1, 1) <> " ") And (Mid(Texte, i + j, 1) <> " ") And (k > 1) Then j = k

'-------------------On supprime les éventuels espaces au début et en fin de ligne---------------

    PosX = X: PosY = Printer.CurrentY
    jaux = j
     Do While Mid(Texte, i + jaux - 1, 1) = " "
        jaux = jaux - 1
    Loop
    Do While Mid(Texte, i, 1) = " "
        i = i + 1: jaux = jaux - 1
    Loop
'------------------On détermine le nombre d'espaces restants dans la ligne---------------

    For c = 1 To jaux
        If Mid(Texte, i + c - 1, 1) = " " Then nbespace = nbespace + 1
    Next c
'-----------------On détermine l'espace moyen entre chaque mots pour JUSTIFIER la ligne -------------
    If nbespace <> 0 Then Emoyen = (Largeur - Printer.TextWidth(Mid(Texte, i, jaux)) + nbespace * Printer.TextWidth(" ")) / nbespace

'----------------On envoie vers l'imprimante la ligne lettre par lettre avec les espaces calculés-----------

    For c = 1 To jaux
        If (Mid(Texte, i + c - 1, 1) = " ") Then
            PosX = PosX + Emoyen - Printer.TextWidth(" ")
        Else
            Printer.CurrentY = PosY
            Printer.CurrentX = PosX + Printer.TextWidth(Mid(Texte, i, c - 1))
            Printer.Print Mid(Texte, i + c - 1, 1)
        End If
    Next c
'--------------et zou...ligne suivante---------------------
    i = i + j
Loop While i < Len(Texte)

End Sub

A voir également

Ajouter un commentaire

Commentaires

logidey2000
Messages postés
6
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
10 novembre 2005
-
Super ton code tu me sauve la vie. Avec quelques petites modifications et ça sera le top.
cs_pfft
Messages postés
18
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
30 janvier 2004
-
c'est juste une idée...si tu crées une image BMP où tu ne dessines qu'un carré noir avec fond blanc, tu la balances dans un picturebox et ensuite tu l'envoies vers l'imprimante avec :

Printer.Paintpicture picture1.picture,PosX,PosY,Largeur,Longueur

Posx,PoxY : coordonnées du coin supérieur gauche
Largeur et Longueur définissent la taille de ton image sur le papier. Tu peux donc encadrer facilement ton texte.

Tu peux définir la qualité d'impression à 150 dpi par exemple avec
Printer.PrintQuality = 150.

En tout cas, moi, je fais comme ça pour mes tableaux. Je créee un BMP avec Illustrator que j'envoie aux dimensions voulues sur l'imprimante...
lucky2222
Messages postés
92
Date d'inscription
dimanche 14 juillet 2002
Statut
Membre
Dernière intervention
2 octobre 2006
-
je viens de trouver sue ce site une source qui serai complementaire a la tienne pour ceux qui comme moi desirent l'utiliser avec une mise en page, tableau etc.. voici l'adresse de cette source!
http://www.vbfrance.com/code.aspx?ID=8209
merci a tout ceux qui comme toi pfft, participe a l'evolution des débutants!
lucky2222
Messages postés
92
Date d'inscription
dimanche 14 juillet 2002
Statut
Membre
Dernière intervention
2 octobre 2006
-
je profite de cette source pour poser mes questions sur l'impression!
serait il possible de faire un cadre tout autour de chaque texte en colone?
cs_pfft
Messages postés
18
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
30 janvier 2004
-
pour l'aperçu, c'est bien sûr très simple...tu configures sous windows ton imprimante par défaut pour qu'elle fasse un aperçu et hop, c'est fait !! il faut évidemment que tu puisses configurer l'aperçu !! J'ai d'ailleurs fait tous les tests de ces procédures grace à l'aperçu sue Epson 760, je ne me suis pas amusé à imprimer des feuilles et des feuilles... sinon,... à voir du côté des API peut-être ?? et pour le form, c'est moyen car il faut respecter les dimensions du papier, donc faire une mise à l'échelle de la police....

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.