elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Recorrer datos de un ListView y imprimir con Printer.Print
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recorrer datos de un ListView y imprimir con Printer.Print  (Leído 4,013 veces)
jack06

Desconectado Desconectado

Mensajes: 133


anarkia99-Soft.


Ver Perfil
Recorrer datos de un ListView y imprimir con Printer.Print
« en: 31 Agosto 2018, 00:34 am »

Muy buenas tardes amigos.

Una consulta, no se si alguien de usted a trabajado con Impresoras de Tiqueteras.

Pues bien estos usando el Metodo Ptinter.Print lo que neceseto es recorrer un Listview y imprimir directo, pero eh estado probando un codigo que encontre aca:

http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/111-imprimir-listview.htm

El problema es que me sale muy separado los espacios de las filas estuve modificando algo el codigo pero me salen muy separadas no logro cuadrarlas, me quedan asi mas o menos para que tengan la idea.



Y uso esta parte de codigo:

Código:
'A esta función se le envía el control LV a imprimir
Public Sub Imprimir_ListView(ListView As ListView)
 
    Dim i As Integer, Espacio As Integer, X As Integer
    Dim Item As ListItem
   
    'Encabezado de ejemplo
    Printer.Print ""
    Printer.Print "                                   ~DON MEGIA~ "
    Printer.Print "                              POLLOS A LA BRASA"
    Printer.Print "                  CAL. MORALES BERMUDEZ N° 323"
    Printer.Print ""
    Printer.Print "                                 TICKET DE VENTA"
    Printer.Print
    Printer.Print "  Recibo:          "
    Printer.Print "  Fecha:           " & Date & "  " & Time
    Printer.Print "  Mesa:            "
    Printer.Print "  Atendido Por:    "
   
    Printer.Print
    Printer.Print "  Descripcion                                 Precio       Cant        Total"
    Printer.Print "  -----------------------------------------------------------------------------"

    With ListView
   
        'Este bucle recorre los items y subitems del ListView  y los imprime
        For i = 1 To .ListItems.Count
           
            Espacio = 0
         
            Set Item = .ListItems(i)
   
            'Recorremos las columnas
            For X = 1 To 4
                Espacio = Espacio + CInt(.ColumnHeaders(X).Width)
'                Printer.CurrentX = Espacio
                Printer.Print "  " & Item.SubItems(X);
            Next
         
            'Otro espacio en blanco
       Printer.Print
  Next
   
  End With
   
  Printer.Print

  Printer.Print
  'Texto del pie
  Printer.Print "               ¡¡¡GRACIAS POR SU PREFERENCIA!!!"
   
  'Comenzamos la impresión
  Printer.EndDoc
End Sub

O quizas aya otra forma de hacerlo esto trabajadno con base de datos con access eso quiero que se imprima cuando le doy en un boton cobrar y directo lo imprima por la ticketera, desde ya muchas gracias, haber si alguien tiene experiencia en eso y me oriente.

Gracias....


En línea

(̅_̅̅_̅(̅_̅_̅_̅_̅() ڪ €l $åßîø nø d nµn¢å tødø lø qµ£ Þî£n$å, Þ£®ø $î£mÞ®£ Þî£n$å tødø lø qµ£ d (̅_̅̅_̅(̅_̅_̅_̅_̅() ڪ
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Recorrer datos de un ListView y imprimir con Printer.Print
« Respuesta #1 en: 31 Agosto 2018, 12:42 pm »

Las filas ocupan el espacio entre una fila y la siguiente.
Las columnas ocupan el espacio entre un carácter y el siguiente...

Y digo esto, porqué no a cuál te refieres exactamente, yo veo bien las filas.

En cualuqier caso es algo que depende de la fuente utilizada, así que puedes probar con diferentes fuentes para el  objeto printer:

Código
  1. printer.font = "verdana"

Y también puedes jugar con el tamaño:
Código
  1. printer.font.size = 12

y por último y más interesante, si estás satisfecho con la fuente y tal... simplemente puedes indicarle que la siguiente línea la imprima algo más arriba...

Esto es crea una función tal que así CambiarFuente, que invocaremos cada vez que queramos cambiar la fuente o su tamaño, y que nos devolverá el alto de la fuente (simepre actualizado), para luego usar una función 'Saltar... puesta más abajo...

...yo te pongo código, esto antedicho y algo más que te explico más abajo, tu lo pruebas en otro proyecto aparte, cambiar lo que proceda, lo pruebas de nuevo y entonces que quedes satisfecho, lo integras en tu proyecto)...

Añade un botón y un listbox como se muestra en la imagen capturada ...

Código
  1. Dim AltoLinea As Single  ' en píxeles
  2.  
  3.  
  4. Private Sub Command1_Click()
  5.    Call IntentaCambiarFuenteEInforma("Verdana")        ' 13
  6.    Call IntentaCambiarFuenteEInforma("Arial")          ' 14
  7.    Call IntentaCambiarFuenteEInforma("8514oem")        ' 20
  8.    ' Esta dará error, porque su nombre es 'Monospac' sobra la 'e'... para probar...
  9.    Call IntentaCambiarFuenteEInforma("Monospace821 Bt", 22) ' monoespaciada
  10.    Call IntentaCambiarFuenteEInforma("Agatha")         ' 21
  11.  
  12.    Call IntentaCambiarFuenteEInforma("Fixedsys")       ' 20
  13.    Call IntentaCambiarFuenteEInforma("Impact")         ' 22
  14.    Call IntentaCambiarFuenteEInforma("Lucida Console") ' 18 monoespaciada
  15.    Call IntentaCambiarFuenteEInforma("Math B", 32)     ' 13--> 49
  16.    Call IntentaCambiarFuenteEInforma("Mini Pics Lil Edibles") ' 43 esta tiene comida, que tal un símbolo en cada artículo ?
  17.  
  18.    With Me
  19.        .CurrentX = 3200
  20.        .CurrentY = 45
  21.        .ForeColor = vbRed
  22.        Print ("%*lq8Dev") ' hamburguesa, pizza, espaguetis?, perrito caliente, helado, fruta, pollo, bebida
  23.    End With
  24. End Sub
  25.  
  26. Private Sub IntentaCambiarFuenteEInforma(Optional ByRef Nombrefuente As String, Optional size)
  27.    Dim fuenteprevia As String, fuenteReasign As String, fuenteFinal As String
  28.    Dim sizePrevio As Single, sizeActual As Single
  29.    Dim cmb As String
  30.  
  31.    fuenteprevia = Me.FontName: sizePrevio = Me.FontSize
  32.  
  33.    If Me.CambiarFuente(Nombrefuente, size) Then
  34.        'MsgBox "Nueva fuente. Alto de una línea con la fuente '" & Nombrefuente & "':  " & CStr(AltoLinea)
  35.        fuenteFinal = Nombrefuente
  36.        cmb = "Cambiada"
  37.    Else
  38.        fuenteFinal = Me.FontName
  39.        cmb = "Forzada"
  40.        'MsgBox "Alto de una línea con la fuente reasignada '" & CStr(Me.FontName) & "':  " & CStr(AltoLinea)
  41.    End If
  42.    sizeActual = Me.FontSize
  43.  
  44.  
  45.    linea = Concatena(cmb, fuenteprevia, CStr(sizePrevio), Nombrefuente, fuenteFinal, CStr(sizeActual))
  46.    List1.AddItem (linea)
  47. End Sub
  48.  
  49. Private Function Concatena(a As String, b As String, c As String, d As String, e As String, f As String) As String
  50.    Dim c1 As String, f1 As String
  51.  
  52.    a = FijarNumchars(a, 10)
  53.    b = FijarNumchars(b, 17)
  54.    c = FijarNumchars(c, 10, vbRightJustify)
  55.    d = FijarNumchars(d, 17)
  56.    e = FijarNumchars(e, 17)
  57.    f = FijarNumchars(f, 10, vbRightJustify)
  58.  
  59.    Concatena = Join(Array(a, b, c, d, e, f), " | ")
  60. End Function
  61.  
  62. ' Devuelve texto truncado al número de caracteres indicado (corta o añade espacios).
  63. Private Function FijarNumchars(ByRef Valor As String, ByVal Numchars As Byte, Optional Lado As AlignmentConstants = vbLeftJustify) As String
  64.    Dim size As Byte, par As Byte
  65.  
  66.  
  67.    size = Len(Valor)
  68.    If (size > Numchars) Then
  69.        FijarNumchars = Left$(Valor, Numchars)
  70.    ElseIf (size < Numchars) Then ' Hay q ue añadir espacios en alguna o más partes...
  71.        Select Case Lado
  72.            Case vbLeftJustify
  73.                FijarNumchars = Valor & (Space$(Numchars - size))
  74.            Case vbRightJustify
  75.                FijarNumchars = (Space$(Numchars - size)) & Valor
  76.            Case Else ' centrado
  77.                par = (size And 1) ' si es par= 0, si no suma 1
  78.                size = ((Numchars - size) \ 2)
  79.  
  80.                FijarNumchars = (Space$(size) & Valor & Space$(size + par))
  81.        End Select
  82.    Else
  83.        FijarNumchars = Valor
  84.    End If
  85. End Function
  86.  
  87. Private Sub Form_Load()
  88.    Dim linea As String
  89.  
  90.    Call CambiarFuente
  91.  
  92.    linea = Concatena("Cambio", "Actual", "Alto", "Solicitada", "Final", "Alto")
  93.    With List1
  94.        .Font = Me.Font
  95.        .Width = Me.TextWidth(linea & "  ")
  96.        Me.Width = .Width + (.Left * 2) + 60  ' suma 4 píxeles del margen de la ventana...
  97.  
  98.        .AddItem (linea)
  99.        Call .AddItem(String(100, "-"))
  100.    End With
  101. End Sub
  102.  
  103.  
  104. ' Intenta cambiar la fuente... en caso de hacerlo devuelve TRUE.
  105. '   aunque no se produzca ningún cambio, SIEMPRE calcula el alto para la fuente actual.
  106. ' OJO: Cambiar la fuente puede cambiar el alto, ya que cada fuente tiene su propia altura específica.
  107. Function CambiarFuente(Optional ByRef Nombrefuente As String, Optional size) As Boolean
  108.    Static basta As Boolean
  109.    Dim intentoFallido As Boolean
  110.    On Error Resume Next  ' por si no existe la fuente...
  111.  
  112.    ' Cambia la fuente
  113.    If (Len(Nombrefuente) > 0) Then
  114.        Me.Font = Nombrefuente
  115.  
  116.        If (Me.FontName = Nombrefuente) Then
  117.            CambiarFuente = True ' la fuente cambió.
  118.        Else
  119.            intentoFallido = True ' ha habido un intento de cambiod e fuente fallido...
  120.            ' pero un fallo en esto, implica que asigna una fuente del parent
  121.            MsgBox "Nueva fuente: " & Me.FontName & vbCrLf & "Reasignada por intento fallido de : " & Nombrefuente & vbCrLf & "Ha habido un intento de cambio de fuente fallido... quizás no esté instalada en tu sistema (o el nombre de la fuente esté mal redactado)."
  122.            ' OJO: La reasignación de fuente, cambia la fuente, pero deja el tamaño previo que hubiere (truncado al más próximo que permite la nueva fuente).
  123.        End If
  124.    End If
  125.  
  126.    ' Size se deja como variant, para preguntar si se recibió valor para dicho parámetro.
  127.    If IsMissing(size) = False Then
  128.        ' si hubo error al tratar de cambiar de fuente, no se deja cambiar el tamaño...
  129.        If (intentoFallido = False) Then
  130.            ' No necesariamente se cambiará al valor reclamado, cada fuente tiene sus tamaños, así que se ajusta al más 'similar'.
  131.            If (Me.FontSize <> size) Then
  132.                Me.Font.size = size
  133.                MsgBox "tamaño de fuente cambiado a: " & CStr(Me.FontSize)
  134.            End If
  135.        End If
  136.    End If
  137.  
  138.    ' Y obtiene el alto de cada línea (en realidad basta con un carácter, pués se basa en la fuente)
  139.    '   En realidad si solo es una línea (de alto) una cadena vacía es suficiente...
  140.    AltoLinea = (Me.TextHeight("Whisky para todos.") / Screen.TwipsPerPixelY)
  141.  
  142.  
  143.    If (basta = False) Then ' es suficiente con mostrarlo una vez...
  144.        ' OJO: Si el texto se compone de varias líneas (porque lleva CRLF), devuelve el alto acumulado entre todas ellas.
  145.        ' ejemplo:
  146.        Dim x As Single
  147.        x = ((Me.TextHeight("Whisky" & vbCrLf & " para" & vbCrLf & " todos.") / 3) / Screen.TwipsPerPixelY)
  148.        MsgBox "¿el alto de una línea es el mismo que el de tres si dividimos su alto entre tres?" & vbCrLf & vbTab & CStr(x = AltoLinea)
  149.  
  150.        basta = True
  151.    End If
  152. End Function
  153.  

Bien, hay varias cosas que decir del código previo, pero antes vamos a lo que te urge...
El código anterior nos ofrece el alto de línea... (en el ejemplo es para el form, pero cambiando en la función deseada (CambiarFuente), Me. por Printer. donde procede, llegamos a los mismo, no tengo impresora conectada a este equipo)...


Código
  1. ' Función: Reposiciona el puntero de escritura.
  2. ' Parámetros:
  3. '    AvanceUnitario: es la cantidad de píxels (u otro tipo de medida, esto debes consensuarlo con el "ScaleMode" que tengas), que sube o bajas sobre el alto de una fila. Un valor 0 señala que es el alto que ofrece la fuente.
  4. '    AvanceLineas: es para cuando debas saltar más de una línea (típicamente porque dejas alguna en blanco), pero por defecto tiene valor de 1 linea.
  5. '    IncHorizontal: valor de Incremento horizontal.
  6. '    Absoluto: Señala si el valor es absoluto o relativo (que se suma (o se resta si es menor que 0) a la posiciópn horizontal actual).
  7. Private Sub SaltarLinea(ByVal AvanceUnitario As Byte, Optional AvanceLineas As Byte = 1, Optional ByVal IncHorizontal As Integer = 0, Optional ByVal Absoluto As Boolean = True)
  8.    Dim x As Integer
  9.  
  10.    Printer.CurrentY = Printer.CurrentY + ((AltoLinea + AvanceUnitario) * AvanceLineas)
  11.  
  12.    ' Puede que queramos saltar de línea arriba abajo, pero seguir en la posición horizontal, o cambiarla...
  13.    If (IncHorizontal <> 0) Then
  14.        x = IncHorizontal
  15.        If (Absoluto = True) Then
  16.            Printer.CurrentX = IncHorizontal
  17.        Else
  18.            Printer.CurrentX = (Printer.CurrentX + IncHorizontal)
  19.        End If
  20.    Else
  21.        If (Absoluto = True) Then Printer.CurrentX = 0
  22.    End If
  23. End Sub
  24. ' Para saltar 3 líneas, con un alto de 2 píxeles más de alto entre cada línea)
  25. SaltarLinea(2, 3)
  26.  
  27. ' Para saltar a la siguiente línea con 1 píxel más arriba de lo que tiene cada línea:
  28. SaltarLinea(-1, 1)
  29.  
  30. '  Recuerda Si ya saltaste la línea ...
  31. ' SaltarLinea( x, AvanceLineas: =0 )
  32. SaltarLinea(-3 , 0) ' de la línea actual sube 3 pixels.
  33.  

Recuerda que  'print' tiene la siguiente sintaxis:
print {Spc(n) | Tab(n)} expression charpos

- Spc(n): es opcional y quiere decir que pudes indicar x espacios (columnas)
- Tab(n): es opcional y quiere decir que puedes imprimir en la columna x de dicha línea (incluso más atrás de la actual, donde apunte currentX, es decir es un valor absoluto).
En realidad Tab es lo adecuado, cuando tienes varias columnas, pués conociendo el punto de comienzo de cada ciolumna, puedes escribirlas en cualquier orden... ya que controla el punto de escritura en la línea con el 'tabulador' ...
- expression: se refiere al texto que vas a escribir.
- charpos: son opciones que indican adónde apuntar tras escribir la 'expressión'. Si se omite (por defecto es así), se salta de línea, si se pone "," (una coma), equivale a añadir vbtab al texto. Si se pone ";",  simplemente avanza a la posición dle siguiente carácter... es decir es lo adecuado si quieres usar la función "saltarLinea", indicando cuantas líneas y el resto de parámetros, etc......





Y una vez aclarado tu problema...
Por lo demás, veo que las columnas no coinciden... tienes columnas de artículo, precio, cantidad total...
Tu primer trabajo es determinar la posición donde termina cada una de las columnas, o mejor darles formato y señalar cuantas columnas ocupa cada una...
Es decir, la columna artículo, se imprime alineada a la izquierda (se hace así con el texto), pero las otras columnas son numéricas y los números se alinean a la derecha...
Sabiendo la delimitación de un campo (punto de comienzo y fin), como te he indicado más arriba puedes usar Tab(x), para empezar a imprimir ahí...

...en el código he puesto también ejemplo para alinear texto sobre columnas... que espero te sirvan de ayuda para mejorar la presentación, como se ve en la imagen.



cuestiones menores... puedes usar negrita para algún campo dentro de la etiquetas de factura.
Incluso la veleidad de que si seleccionas la fuente "Mini Pics Lil Edibles", que contiene símbolos de comida, podría antecerse el texto de la columna del artículo con un carácter...  para diferenciar por ejemplo comida de bebidas, postre, café, licores, etc...


p.d.:
No uses instrucciones de esta forma:
Código
  1.  Printer.Print "               ¡¡¡GRACIAS POR SU PREFERENCIA!!!"
  2.  

Usa mejor la función como la que te he pasado....
Código
  1. dim Gracias as string
  2.  
  3. gracias = "¡¡¡GRACIAS POR SU PREFERENCIA!!!"
  4. printer.print FijarNumchars(gracias, printer.width, vbCenter)
  5.  
Recuerda siempre el ScaleMode, para ejemplos de código, sin probar uno no va a estar poniendo cada cosa meticulosamente , eso corresponde al interesado... Si printer.width, no te ofrece valores traduce desde  printer.papersize, y si no establece un valor manualmente al cargar la aplicación sabido el ancho del papel...


« Última modificación: 31 Agosto 2018, 13:14 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines