Un Listado muy chapado a la antigua

Muchos de los que nos acostumbramos al uso de ‘Printer.Print’ en visual Basic 6, padecemos de ciertas dificultades para adaptarnos al nuevo uso de ‘PrintDocument’.

Con la intención de responder a numerosas preguntas sobre el tema y facilitar esas transiciones que finalmente nos aportan un montón de beneficios, me complace compartir con vosotros este pequeño ejemplo de cómo generar un listado usando el ‘moderno’ PrintDocument, dandole un estilo muy chapado a la antigua J.

Espero que os sea útil!

©Pep Lluis

‘Este ejemplo se ha compilado con la versión Beta 1 del compilador FW 4.0, aunque no tendréis dificultad alguna en adaptar el concepto a cualquier versión anterior del framework.

Imports System.Drawing.Printing

Public Class Form1
    ‘Crear el PrintDocument
    Private ListadoDeArticulos As New PrintDocument
    ‘Simulación tabla de Artículos
    Private Articulos As New DataTable(«Articulos»)

    Private Sub Form1_Load() Handles MyBase.Load

        ‘Función de imprimir paginas
        AddHandler ListadoDeArticulos.PrintPage, AddressOf Me.ImprimirListado

       
        ‘ Simular tabla Artículos
       
        Articulos.Columns.Add(«Codigo»)
        Articulos.Columns.Add(«Descripcion»)
        Articulos.Columns.Add(«Precio»)
        Articulos.Rows.Add(«001», «Resistencia 100ohms», «0,15»)
        Articulos.Rows.Add(«002», «Transistor 2n2234», «1,00»)
        Articulos.Rows.Add(«003», «Microprocesador Z80», «5,40»)
        Articulos.Rows.Add(«004», «UART 16C450», «3,45»)
        Articulos.Rows.Add(«005», «Resistencia 200ohms», «0,12»)
        Articulos.Rows.Add(«006», «Transistor 2n2222», «1,22»)
        

       ‘ Lanzar la ejecución del listado
        ListadoDeArticulos.Print()

    End Sub

 

    ‘Seleccionar la fuente para el listado
    Dim Fuente_Pagina As New Font(«Lucida Console», 10)
    ‘Fijar los márgenes Derecho / Izquierdo
    Dim Margen_Izquierdo As Single = 0
    Dim Margen_Superior As Single = 0
    ‘Controlar la posición Vertical/NºPagina
    Dim PosicionLinea As Single = 0
    Dim ContadorLinea As Single = 0
    Dim Numero_Pagina As Single = 1
    ‘Memorizar la posición en curso dentro del Dataset
    Dim Puntero As Single = 0

   
    ‘ Imprimir el Listado de Artículos
   
    Sub ImprimirListado(ByVal sender As Object, ByVal Pagina As PrintPageEventArgs)

        ‘Ajustes para el Control de Pagina
        Dim Lineas_Pagina As Single = Pagina.MarginBounds.Height / Fuente_Pagina.GetHeight(Pagina.Graphics)
        ContadorLinea = 0
        Margen_Izquierdo = Pagina.MarginBounds.Left
        Margen_Superior = Pagina.MarginBounds.Top

        ‘Cabecera del Listado
        ImprimirUnaLinea(Pagina, «Electronica NAVI»)
        ImprimirUnaLinea(Pagina, «Listado de Artículos sin ningún orden ni concierto»)
        ImprimirUnaLinea(Pagina, «Vic (Barcelona) a fecha : « + DateTime.Now + » ,Pagina : « + Numero_Pagina.ToString)
        ImprimirUnaLinea(Pagina, «»)
        ImprimirUnaLinea(Pagina, «Código Descripción                                               Precio»)
        ImprimirUnaLinea(Pagina, «—— ——————————————————— ——–«)
        Dim Articulo As DataRow
        Dim Linea As String = Space(80)
       
        ‘Recorrer la tabla de artículos / imprimir una línea por fila
        For Indice As Single = Puntero To Articulos.Rows.Count – 1
            Articulo = Articulos.Rows(Indice)
            If ContadorLinea < Lineas_Pagina Then
                ‘posicionar la columna según item/articulo
                Mid(Linea, 2) = Articulo.Item(«Codigo»)
                Mid(Linea, 8) = Articulo.Item(«Descripcion»)
                Mid(Linea, 66) = Articulo.Item(«Precio»)
                ‘imprimir la linea
                ImprimirUnaLinea(Pagina, Linea)
            Else
                Exit For
            End If
        Next
        ‘Memorizar la posicion del primer artículo/siguiente Pagina
        Puntero = Articulos.Rows.IndexOf(Articulo)
       
        ‘Comprobar si existen artículos para listar
        If Puntero < Articulos.Rows.Count – 1 Then
            Numero_Pagina += 1          ‘Incrementar numero de página
            Pagina.HasMorePages = True  ‘SI tengo más paginas a imprimir
        Else
            ImprimirUnaLinea(Pagina, «—— ——————————————————— ——–«)
            Numero_Pagina = 1           ‘Numero de pagina a 1 (Para el proximo listado)
            Pagina.HasMorePages = False ‘No Tengo mas paginas para imprimir
        End If
    End Sub
   
    ‘ Imprimir una linea
   

   ‘Lambda para con el cálculo de la posición de la línea
    Dim Pos = Function() As Single
                Return Margen_Superior + ContadorLinea * Fuente_Pagina.GetHeight(Pagina.Graphics)
             
End Function

    Sub ImprimirUnaLinea(ByVal Pagina As PrintPageEventArgs, ByVal Linea As String)
        ‘Imprimir la línea con la fuente seleccionada y en Negro
        Pagina.Graphics.DrawString(Linea, Fuente_Pagina, Brushes.Black, Margen_Izquierdo, Pos())
        ‘Incrementar el contador de líneas
        ContadorLinea += 1
    End Sub

End Class

PD. Me gustara recibir vuestros comentarios, opiniones y aportaciones.

6 pensamientos en “Un Listado muy chapado a la antigua”

  1. Una consulta con respecto a la impresión en hojas continuas para una impresora matricial: por ejemplo, cuando se tiene hojas continuas de facturas y se termina de imprimir una factura, por lo general el papel en la impresora no queda en la posición requerida para que la siguiente impresión de una nueva factura se realice sin problemas, sino que se descuadra porque el rodillo de la impresora lo avanza un poco y la factura se empieza a imprimir más abajo del encabezado de página. Se puede arreglar este problema con printDocument o talvez con Crystal Reports?

  2. Hola Paty,

    Creo que te refieres a la situacion, en que se requiere que la impresora retroceda el carro para situarse justo en la linea de inicio de la siguiente factura. Puedes conseguirlo enviando la secuencia de caracteres especifica. El manual de la impresora debe indicarte como fijarlo y el caracter de salto.

    De hace muchos años recuerdo que se trataban de secuencias de escape… tipo <Esc><A><0>… por poner un ejemplo. Esto traducido a codigo era una imprimir una linea que contenia en VB… Chr$(27)+Chr$(«A»)+Chr$(«0»)…

    Debes buscar esta secuencia en la especificacion del fabricante.

    Saludos,

    Pep Lluis,

  3. Estimado me podria ayudar me sale un error en la linea

    Dim Pos = Function() As Single
    Return Margen_Superior + ContadorLinea * Fuente_Pagina.GetHeight(Pagina.Graphics)
    End Function

    exactamente en :
    (Pagina.Graphics) no esta declarada pagina
    gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *