none
[ VB 2005 Ex ] Impression VB6 et VB 2005 [ Resolu ] RRS feed

  • Question

  • Bonjour,

    Le code en VB 6:

    printer.ScaleMode=6 ' Unité en millimètre.
    '
    printer.line(0,145)-(1,145) 'Pliage paysage.
    printer.line(102,0)-(102,1) 'Pliage Portrait.
    '
    Printer.FontBold=True ' Gras.
    Printer.FontSize=12 ' Taille police.
    Printer.FontName="Arial" ' Type police.
    Printer.CurrentX= 70:Printer.CurrentY= 20 ' Position de l'impression.
    printer.Print" MON TEXTE ICI " ' Texte.
    '
    printer.line(10,45)-(196,141),,B ' 1er cadre.
    printer.line(10,145)-(196,241),,B ' 2 eme cadre.

    L'equivalent en VB 2005

    Dans un printdocument()

    e.Graphics.PageUnit = GraphicsUnit.Millimeter ' Unité millimètre
    '
    e.Graphics.DrawLine(Pens.Black, 0, 145, 1, 145) 'Pliage paysage.
    e.Graphics.DrawLine(Pens.Black, 102, 0, 102, 1) ' Pliage Portrait.
    '
    e.Graphics.DrawString(" MON TEXTE ICI", New Font("Arial",
    12, FontStyle.Bold), Brushes.Black, 70, 40)
    e.Graphics.DrawRectangle(Pens.Black, 10, 45, 186, 96) ' 1er cadre.
    e.Graphics.DrawRectangle(Pens.Black, 10, 145, 186, 96) ' 2 eme cadre.


    Mon probleme:
    1 ) c'est que les cadres sont avec des traits épais, et je ne sais pas comment les reduires ?.
    2 )J'amerais que mon texte soit aussi souligner ?.
    3 ) Pour imprimer en paysage j'ai essaye e.PageSettings.Landscape = True, mais cela ne change rien toujours en portrait.

    Edit:

    Pour le point n°2 j'ai trouvé la solution.

    Il suffit de mettre un OR et l'autre type de style

    e.Graphics.DrawString(" MON TEXTE ICI", New Font("Arial",
    12, FontStyle.Bold Or FontStyle.Underline), Brushes.Black, 70, 40).

    Mais le point 1 et 3 je seche toujours. Avez vous une idée ???

    D'avance merci.
    mardi 28 novembre 2006 14:17

Réponses

  • Pourtant dans le cas de l'impression c'est tout de même plus simple en VB2005. Les difficultés que tu rencontres viennent du fait qu'en VB6 on regroupait tout le code d'impression dans une procédure alors que la gestion en VB 2005 est plus évènementielles.

    Généralement quand on imprime en VB2005, on sépare le code de définition du code d'impression. Par exemple, quelque chose du genre :

    Code de définition :

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim ValMarge As Integer = Printing.PrinterUnitConvert.Convert(100, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.Display)

        With Me.PrintDocument1.DefaultPageSettings

            .Landscape = False

            .Color = False

            .Margins = New Printing.Margins(ValMarge, ValMarge, ValMarge, ValMarge)

        End With

        FichierTexte = New StreamReader("d:\.....\fichier.txt")

        Me.PrintDocument1.Print()

        FichierTexte.Close()

    End Sub

    code d'impression (c'est à dire l'évènement PrintPage)

        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

     

            Dim YPos As Single = 0

            Dim cmpt As Integer = 0

            Dim MargeG As Single = e.MarginBounds.Left

            Dim MargeH As Single = e.MarginBounds.Top

            Dim LigneEnCours As String = Nothing

            Dim Police As New Font("Arial", 11)

            Dim RectSortie As New SizeF

     

            YPos = MargeH

            While YPos < MargeH + e.MarginBounds.Height

                LigneEnCours = FichierTexte.ReadLine()

                If LigneEnCours Is Nothing Then

                    Exit While

                End If

                RectSortie = e.Graphics.MeasureString(LigneEnCours, Police, e.MarginBounds.Width, New StringFormat())

                e.Graphics.DrawString(LigneEnCours, Police, Brushes.Black, New RectangleF(MargeG, YPos, e.MarginBounds.Width, RectSortie.Height), New StringFormat())

                YPos = YPos + RectSortie.Height

            End While

            If Not (LigneEnCours Is Nothing) Then

                e.HasMorePages = True

            Else

                e.HasMorePages = False

            End If

     

        End Sub

    mercredi 29 novembre 2006 13:33

Toutes les réponses

  • 1) il faut remplacer Pens.Black par New Pen(Pens.Black, tailledutrait)

    3) Il faut utiliser l'évènement QueryPageSettings

     

    mardi 28 novembre 2006 16:39
  • Merci de tes réponses.Le point fonctionne bien j'ai du juste changer (pens.black, ) par color.black, vu que cela n'a pas était proposer par VB.Par contre le QueryPageSetting, je le place ou ???.On dit que VB 2005 est facile, par rapport à VB6, pour ma par j'en doute.Mais bon je m'accroche...Encore merci.
    mercredi 29 novembre 2006 12:14
  • Pourtant dans le cas de l'impression c'est tout de même plus simple en VB2005. Les difficultés que tu rencontres viennent du fait qu'en VB6 on regroupait tout le code d'impression dans une procédure alors que la gestion en VB 2005 est plus évènementielles.

    Généralement quand on imprime en VB2005, on sépare le code de définition du code d'impression. Par exemple, quelque chose du genre :

    Code de définition :

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim ValMarge As Integer = Printing.PrinterUnitConvert.Convert(100, PrinterUnit.TenthsOfAMillimeter, PrinterUnit.Display)

        With Me.PrintDocument1.DefaultPageSettings

            .Landscape = False

            .Color = False

            .Margins = New Printing.Margins(ValMarge, ValMarge, ValMarge, ValMarge)

        End With

        FichierTexte = New StreamReader("d:\.....\fichier.txt")

        Me.PrintDocument1.Print()

        FichierTexte.Close()

    End Sub

    code d'impression (c'est à dire l'évènement PrintPage)

        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

     

            Dim YPos As Single = 0

            Dim cmpt As Integer = 0

            Dim MargeG As Single = e.MarginBounds.Left

            Dim MargeH As Single = e.MarginBounds.Top

            Dim LigneEnCours As String = Nothing

            Dim Police As New Font("Arial", 11)

            Dim RectSortie As New SizeF

     

            YPos = MargeH

            While YPos < MargeH + e.MarginBounds.Height

                LigneEnCours = FichierTexte.ReadLine()

                If LigneEnCours Is Nothing Then

                    Exit While

                End If

                RectSortie = e.Graphics.MeasureString(LigneEnCours, Police, e.MarginBounds.Width, New StringFormat())

                e.Graphics.DrawString(LigneEnCours, Police, Brushes.Black, New RectangleF(MargeG, YPos, e.MarginBounds.Width, RectSortie.Height), New StringFormat())

                YPos = YPos + RectSortie.Height

            End While

            If Not (LigneEnCours Is Nothing) Then

                e.HasMorePages = True

            Else

                e.HasMorePages = False

            End If

     

        End Sub

    mercredi 29 novembre 2006 13:33
  • C'est vrai que c'est deroutant.

    L'exemple, et qu'il faut créé un évenement QueryPageSettings pour pouvoir mettre dans mon petit bout de code en format paysage, ce que VB6 pouvais mettre au même endroit.

    Il est vrai que je suis habitué à un certain basic ( cela remonte depuis mon oric  ), et que la transition entre deux  basic ( VB6 et VB 2005 ), me demanderas de changer beaucoup de mes réflexes de codage.

    Mais merci encore de cette aide, pour l'instant j'ai trouve*é mon " bonheur " .


    jeudi 30 novembre 2006 14:43
  • bonjour,
    je suis debutant en vb, j'ai testé ce petit bout de code bien utile sur un fixhier texte de ce type :

    texte1
    texte2
    texte3

    texte4
    texte5
    texte6

    ...

    il marche tres bien. mais le probleme, c'est que ça n'imprime pas le saut de ligne entre texte3 et texte4. quelqu'un pourrait m'aider?

    mardi 13 février 2007 15:26