Autor Tema: Objeto printer y salto de linea  (Leído 2656 veces)

0 Usuarios y 1 Visitante están viendo este tema.

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Objeto printer y salto de linea
« en: Enero 14, 2016, 03:06:21 am »
HOLA, despues de tiempo retomanto un proyecto.
El siguiente codigo hace o simula una especie de salto de linea cuando el ancho del nombre del articulo es
demaciado ancho para ser exactos corta la cadena tomando los 1ero cuarenta caracteres y luego crea una
2da linea con el resto del nombre del producto.

El problema esta en que ya 2 lineas no son sufientes ya que necesito imprimir textos pudiendo ser 3 o 4 lineas y no he podido solucionarlo he probado de muchas formas pero siempre falta algo, haber si me pueden ayudar.

Código: (VB) [Seleccionar]

Public Sub Imprime_doc(rsT As Recordset, f As Form)

Dim sImp0, sImp1, sImp2, sImp3 As String
Dim Linea, Linea1, Linea2 As String

On Error GoTo Impresion

With Printer
    .ScaleMode = vbCentimeters
    .FontName = "LinePrinter"
End With
       
Printer.CurrentY = CDbl(1) 'Horizontal

rsT.MoveFirst
Do Until rsT.EOF
   With rsT

        sImp0 = Format(Trim(!nomProd))
        Linea = Mid(Len(Trim(!nomProd)), 1) 'Numero de caracteres del producto
        If Linea >= CDbl(40) Then 'Si sobrepasa los 40 caracteres
           Linea1 = Left(sImp0, CDbl(40)) '1ºlinea
           Linea2 = Right(sImp0, CDbl(Linea) - CDbl(40)) '2ºlinea
        Else
           Linea1 = sImp0
           Linea2 = ""
        End If
        Printer.CurrentX = CDbl(1) 'Vertical
        Printer.Print Linea1;
       
        sImp1 = Format(!precioVenta, "Fixed")
        Printer.CurrentX = CDbl(10) - (Printer.TextWidth(sImp1)) 'Alinea los decimales a la derecha?
        Printer.Print sImp1;
       
        sImp2 = Format(!Cantidad)
        Printer.CurrentX = CDbl(12) - (Printer.TextWidth(sImp2))
        Printer.Print sImp2;
       
        sImp3 = Format(!SubTotal, "Fixed")
        Printer.CurrentX = CDbl(14) - (Printer.TextWidth(sImp3))
        Printer.Print sImp3;
       
        'Si existe una 2da linea "osea si no esta vacio"
        If Not Linea2 = Empty Then
           Printer.CurrentX = CDbl(1)
           Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
           Printer.Print Linea2;
           Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items(se refiere a cuando cambia de items)
        Else
           Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
        End If
   End With
   rsT.MoveNext
Loop
Printer.EndDoc

Exit Sub
Impresion:
MsgBox "error"
Err.Clear
End Sub


AxioUK

  • Megabyte
  • ***
  • Mensajes: 108
  • Reputación: +17/-1
  • Modulos GSL
    • Ver Perfil
Re:Objeto printer y salto de linea
« Respuesta #1 en: Enero 14, 2016, 10:58:59 am »
Hola lucius
          me tomé la libertad de hacer una leves "correcciones", prueba con esto y nos comentas:

Código: (VB) [Seleccionar]
Public Sub Imprime_doc(rsT As Recordset)
Dim sImp0, sImp1, sImp2, sImp3 As String
Dim Linea() As String
Dim TotalLin, I As Integer
 
On Error GoTo Impresion
 
With Printer
    .ScaleMode = vbCentimeters
    .FontName = "LinePrinter"
End With
       
Printer.CurrentY = CDbl(1) 'Horizontal
 
rsT.MoveFirst
Do Until rsT.EOF
   With rsT
      '-.-.CORREGIDO.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
        sImp0 = Format(Trim(!nomProd))
        TotalLin = Len(Trim(!nomProd)) 'Numero de caracteres del producto
        If TotalLin >= CInt(40) Then 'Si sobrepasa los 40 caracteres
           'DIvidir Lineas
           TotalLin = TotalLin / 40
           ReDim Linea(TotalLin)
           For I = 0 To TotalLin
               Linea(I) = Mid$(sImp0, (40 * I) + 1, 40)
           Next I
        Else
           Linea(0) = sImp0
        End If
        Printer.CurrentX = CDbl(1) 'Vertical
        Printer.Print Linea(0);
      '-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
     
        sImp1 = Format(!PrecioVenta, "Fixed")
        Printer.CurrentX = CDbl(10) - (Printer.TextWidth(sImp1)) 'Alinea los decimales a la derecha?
        Printer.Print sImp1;
       
        sImp2 = Format(!Cantidad)
        Printer.CurrentX = CDbl(12) - (Printer.TextWidth(sImp2))
        Printer.Print sImp2;
       
        sImp3 = Format(!SubTotal, "Fixed")
        Printer.CurrentX = CDbl(14) - (Printer.TextWidth(sImp3))
        Printer.Print sImp3;
       
        '-.-.CORREGIDO.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
        'Si existe una 2da linea "osea si no esta vacio"
        If UBound(Linea) >= 1 Then
           Printer.CurrentX = CDbl(1)
           Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
           For I = 1 To UBound(Linea)
             Printer.Print Linea(I);
             Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador entre Items(se refiere a cuando cambia de items)
             Printer.CurrentX = CDbl(1)
           Next I
        Else
           Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
        End If
      '-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
   
   End With
   rsT.MoveNext
Loop
Printer.EndDoc
 
Exit Sub
Impresion:
MsgBox "error"
Err.Clear
End Sub

Solo faltaría resolver el detalle de que las palabras que queden justo en el salto de linea se cortarán abruptamente...
te lo dejo de tarea... (estoy en el trabajo, pero no resistí la tentación del desafío xDD)
« última modificación: Enero 14, 2016, 11:04:35 am por AxioUK »

_____________________________
Sé un poco de todo y mucho de nada... ;)

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Objeto printer y salto de linea
« Respuesta #2 en: Enero 15, 2016, 01:55:05 am »
Hola, se fue el dia y no tuve tiempo de probar, tendre que esperar a mañana, te pasaste doc ojala y mañana me ilumine y lo solucione jeje

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Objeto printer y salto de linea
« Respuesta #3 en: Enero 15, 2016, 02:24:50 pm »
HOLA podrias re-explicar o a que te referias con cortar las palabras justo despues del salto de linea, he probado el codigo y aparentemente crea el numero de lineas indicado y las corta correctamente tomando 40 caracteres por linea pero si el siguiente item(producto) solo tiene 1 Linea entonces rellena las siguientes lineas tomando el contenido del item anterior, probe vaciando la variable dentro del bucle y funciono pero me deja tremendo hueco entre cada item.

Código: (VB) [Seleccionar]
        If UBound(Linea) >= 1 Then
           Printer.CurrentX = CDbl(1)
           Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador de filas(se refiere a cuando el nombre es demaciado largo)
           For i = 1 To UBound(Linea)
             Printer.Print Linea(i);
             Printer.CurrentY = Printer.CurrentY + CDbl(0.3) 'Separador entre Items(se refiere a cuando cambia de items)
             Printer.CurrentX = CDbl(1)
             
             Linea(i) = "" 'ADICIONAL

           Next i
        Else
           Printer.CurrentY = Printer.CurrentY + CDbl(0.5) 'Separador entre Items
        End If


« última modificación: Enero 15, 2016, 02:27:40 pm por lucius »

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Objeto printer y salto de linea
« Respuesta #4 en: Enero 15, 2016, 03:04:27 pm »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

AxioUK

  • Megabyte
  • ***
  • Mensajes: 108
  • Reputación: +17/-1
  • Modulos GSL
    • Ver Perfil
Re:Objeto printer y salto de linea
« Respuesta #5 en: Enero 15, 2016, 03:25:21 pm »
Lo que pasa es que si, por ejemplo, la palabra "zapato" queda justo en los 40 caracteres te quedará "zap" en una linea y "ato" en la otra... esop...

probé el bucle y no me deja los "tremendos huecos" entre items, aunque dependerá de la cantidad de lineas resultantes de cada item que agregues y dividas en lineas.




Amigo ENTER, en el ejemplo que das, cuando es más de una página a imprimir el texto se desordena....


« última modificación: Enero 15, 2016, 04:51:23 pm por AxioUK »

_____________________________
Sé un poco de todo y mucho de nada... ;)

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Objeto printer y salto de linea
« Respuesta #6 en: Enero 15, 2016, 05:28:44 pm »
Hola a todos, bueno Axio lo que sucede es que en tu ejemplo utilizas el mismo texto pero si
ITEM 1 tiene 5 linea
ITEM 2 tiene 2 linea
            Aqui agrega 3 lineas adicionales y las toma del anterior
ITEM 3 tiene 1 linea

Lo que probado directamente en mi proyecto quiza sea por eso.
Enter ahora reviso tu link, saludos

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Objeto printer y salto de linea
« Respuesta #7 en: Enero 17, 2016, 11:12:54 am »
Aca otro ejemplo justamente dice una parte del codigo respetando las palabras completas y ajustando sea necesario.

http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/99-ejemplo-impresion.htm

Yo no los pude probar no tengo ahora el VB6 instalado. pero creo que es lo que estas buscando.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo