Autor Tema: Centrar con Printer.Print "Hola Mundo"  (Leído 14031 veces)

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

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Centrar con Printer.Print "Hola Mundo"
« en: Enero 09, 2012, 08:21:15 pm »
Como puedo centrar con el comando Printer.Print, Tengo una impresora ticketeadora que se usa en los supermercados.

Ejemplo de la Hoja:



Link para ver mas grande
http://www.subeimagenes.com/img/ticket-144953.html

Yo utilizaba este método para centrar:

Código: (VB) [Seleccionar]
cPort = "LPT3:"
Open cPort For Output As #

Print #1, Tab((40 - Len("SERVICAR CENTRO AUTOMOTIVO")) \ 2); "SERVICAR CENTRO AUTOMOTIVO"
Print #1, Tab((40 - Len("DE FAUSTINO DANIEL CHAMORRO")) \ 2); "DE FAUSTINO DANIEL CHAMORRO"
Print #1, Tab((40 - Len("R.U.C: 65656565-2")) \ 2); "65656565-2"


Print #1, Tab(1); String(40, "=")
Print #1, Tab(15); "TOTAL : "; Tab(40 - Len(Format(CantidadTotal, "##,###"))); Format(CantidadTotal, "##,###")

Print #1, Tab(1); "Exenta    : " & IExenta
Print #1, Tab(1); "I.V.A 5%  : " & I05
Print #1, Tab(1); "I.V.A 10% : " & I10

Print #1,
Print #1, Tab((40 - Len("GRACIAS POR SU COMPRA!")) \ 2); "GRACIAS POR SU COMPRA!"

For i = 1 To 10
    Print #1,
Next i
           
Close #1

Ahora no puedo mas usar este método por que la impresora es a USB el otro era por puerto paralelo.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #1 en: Enero 09, 2012, 11:22:56 pm »
Hola mira un ejemplo

Código: (vb) [Seleccionar]

Private Sub Form_Load()
PrintCenter "hola mundo"
PrintCenter "GRACIAS POR SU COMPRA!"
Printer.EndDoc
End Sub


Private Sub PrintCenter(sText As String)
    Printer.CurrentX = (Printer.Width / 2) - (Printer.TextWidth(sText) / 2)
    Printer.Print sText
End Sub

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #2 en: Enero 09, 2012, 11:25:20 pm »
no entiendo por que imprimis con Print, por lo menos nunca tuve que recurrir a imprimir un reporte con Print, ni conozco a alguien que imprima de esa forma.

la posta es: si queres imprimir , te creas un reporte y listo, con el formato que vos quieras y tamaño que vos quieras, despues eso sale por la impresora , ya sea USB o lo que sea, y aparte te ahorras una chorrada de codigo que me hace mal los ojos jaja.

el reprote lo podes hacer con DataReport o Crystal Reports, yo por consejo uso este ultimo.

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #3 en: Enero 10, 2012, 12:16:45 am »
Tengo una inquietud acerca de este tema
Si la impresión que harás es bajo demanda con corte entonces yo usaría el objeto Printer y no el DataReport.
¿A que me refiero bajo demanda? Si haces una venta de 3 items y totalizas y cortas tendrás una impresión de un ticket suponte de 10 cms de alto y el total aparecerá al pie de esa hojita de 10 cms que la impresora cortó.
Si un cliente lleva 30 items entonces tendrás (x ejem) una tira 60 cms y la impresora ticketera cortará al final de esa medida y el total estará al pie.
¿Como hacer esto con DataReport? si el DataReport exige que tengas una hoja con tamaño predefinido. Uso el DataReport para Facturas que usan hojas preimpresas y de tamaño fijo. He concluido que con DataReport no se puede imprimir en el tamaño de alto de papel que quieras, la impresion te hara salto de pagina y queda feo, ¿Se puede esto con Crystal? ¿se puede crear un formato en el que NO SE SEPA el alto de la hoja con Crystal??? y poder ordenar que corte justo en la siguiente linea donde termina la impresión, si eso se puede con Crystal seria excelente, me quedaría sorprendido y por demás agradecido, pero estoy seguro que con DataReport no se puede y casi seguro que con Crystal tampoco se puede.

Saludos


Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #4 en: Enero 10, 2012, 01:11:15 am »
Hola, YAcosta, pues si se puede, por ejemplo yo he realizado impresiones en impresoras de etiquetas Zebra, por ejemplo esta:



aqui el usuario puede imprimir 1 registro o 1000 y es lo mismo.

supongamos el ancho del papel son 10 cm y el largo de cada etiqueta es de 5 cm, pues para imprimir eso, hice un reprote en crystal reports donde el tamaño del papel viene dado por la impresora que tengas seleccionada en las propiedades del reporte, obviamente para que te tome los tamaños de papel de la impresora debes instalar los drivers de la impresora, TODAS las impresoras de tickets tienen su driver y ahi estan los tamaños de papel que la impresora soporta.

entonces yo seleccione el tamaño que tenia que ser, diseñe el reporte, con los campos correspondientes de la base de datos, y el reporte del crystal me quedo de 10 cm de ancho y 5 cm de alto (seria una etiqueta) digamos un reporte muy chico, antes de mandar a imprimir le asigno un recordset temporal donde tengo todos los articulos, y el reporte imprime en cada etiqueta el articulo que corresponde (o sea es como si se imprimiera por cada etiqueta un reporte).

ahora si el tema es una impresion sin etiquetas, un ticket por ejempo, como en este caso, que varia la cantidad de lineas, pues nunca lo he probado, pero me imagino es lo mismo, si el detalle se expande automaticamente a la cantidad de items, aca lo importante es tener seleccionado el papel de la impresora, en las propiedades del proyecto, porque si tenes seleccionado una A4, obviamente va a terminar el reporte en el tamaño de la A4, pero teniendo seleccionado el papel de la impresora no tenes que tener problema, justamente para eso viene.

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #5 en: Enero 10, 2012, 02:04:59 am »
Asi es doc, tal como lo explicas lo hago para todos los documentos que imprimo y usando DataReport pero siempre que no sea ticket, osea, diseño el papel (por ejemplo) a 5 cm de alto y ya, imprimo lo que necesite sobre el con el limite de 5cm porque luego hará quiebre de pagina, pero para el asunto de tickets no es lo mismo, ese mismo tipo de impresora que muestras es la que también usan varios de mis clientes y la impresora imprime "por demanda" y corta cuando termina de imprimir  (logicamente este es posible porque los drivers de la impresora ticketera están debidamente instalados), pero no hay un alto predefinido, con DataReport y CrystalReport necesitas saber previamente el alto de papel (osea lo creas antes) para diseñar el reporte y sobre el imprimes, entonces no me resulta posible hacer un ticket de alto variable y que el corte se haga donde termina la impresión, en otras impresoras ticketeras no corta pero tampoco te hace desperdiciar el papel porque deja el ticket en el "área de corte" que es uno o dos centímetros mas después de la ultima linea impresa.
La única forma que pude encontrar y quedo perfecto es usando el objeto printer, eso si que el código queda asqueroso no lo niego, pero no queda de otra, ojo, no es necesario diseñar papel previamente porque la chamba justamente de estas impresoras es cortar o poner en el area de corte donde termine de imprimir, ni un poco mas ni un poco menos.

Te lo comento porque le he dado decenas de vueltas al tema y lo tengo ya en vivo y hacer una impresión de alto variable sea con DataReport o CrystalReport no es posible ya que esto requiere un alto de papel prefijado sea por Windows o sea por el driver de la impresora pero requiere un tamaño predefinido, no se si me explique bien, ojala esté equivocado y si se pueda porque seria excelente.

Saludos
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #6 en: Enero 10, 2012, 06:32:00 pm »
Hola, Ivan, es Ivan tu nombre no ? es que te tengo en el facebook tambien pero no veo el nombre, perdona que te llame por el nick, no me gusta llamar por el nick sino por el nombre verdadero. 8)

mira he consultado con otra persona que tambien sabe de este tema y me dijo tambien lo que yo pensaba que si se puede, para ponerlo en claro lo que yo te estoy diciendo, aca hice algo muy basico en crystal reports, de lo que seria un reporte.



fijate que el reprote tiene solo 5 centimetros de alto, supongamos que en la linea de detalle le paso unos 100 items para imprimir, lo que va a hacer esto antes de imprimir, en la vista previa, es mostrarme varias ojas (ya que no entran los 100 items en esos 5 centimetros), entonces va a mostrar algo asi:

HOJA 1:

encabezado
detalle1
detalle2
detalle3

HOJA 2:

detalle 4
detalle 5
detalle 6

etc...

HOJA 10 (la ultima)
detalle 99
detalle 100
PIE DEL REPORTE

al mandar a imprimir me va a imprimir todas las hojas de 5 cm, una detras de otra, como si fuera un solo reporte y entonces va a quedar el detalle como si hubiera sido impreso todo seguido.

mi pregunta es si eso es lo que estamos hablando o yo entendi mal  8)

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #7 en: Enero 10, 2012, 09:12:19 pm »
Si, mi nombre es Yvan (pero con Y, ocurrencias de mi padre) y si estamos en el face.

Si, si hablamos de lo mismo, el problema que hay (al menos en DataReport, quizá en Crystal si se pueda) es que entre la Hoja1 y Hoja2 y siguientes, dejará un espacio de margen, muy mínimo pero igual lo deja asi le ponga cero, como te dije no lo probé con Crystal pero al menos con DataReport logré reducir el margen inferior y superior y lo máximo que pude conseguir es reducir el espacio entre "hoja" y "hoja" a 1cm +/- (una luz como dicen los carpinteros) y al final se ve feo, antiestetico, son tonteras, pero el usuario y todos sus clientes estarían jodiendo de porque cada 3 items queda un pequeño espacio.

Si con Crystal se elimina ese margen (superior e inferior) y se viera así:

Encabezado
detalle 1
detalle 2
detalle 3
detalle 4
detalle 5
detalle 6
detalle 7
etc...

detalle 98
detalle 99
detalle 100
Total

Y no se notara para nada el margen que habría entre cada grupo de 3 items y todos estarían "pegaditos" entonces la solución estaría dada, recomendaría absolutamente a Enter que lo haga con Crystal y yo por mi lado vería que hacer la migración para tirar al tacho el Print.
En todo caso (se me acaba de ocurrir) seria haciendo una hoja menos alta (3cms) de tal manera que quepa un solo detalle y por tanto entre detalle y detalle siempre habría el mismo espacio... pero, y el Encabezado? ... los mandaría como detalle usando un Union para chantarlo a la force (pensado en voz alta)

Gracias por las luces.

Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #8 en: Enero 11, 2012, 06:10:34 pm »
El código que me paso Leandro funciono perfecto. Yo no imprimo con DataReport ni CrystalReport, por que la impresora no trae el driver para win7 lo uso como genérico.  Por eso uso el Metodo Printer.Print.

Otra consulta.
Como hago para alinear los números de esta forma.

Código: (VB) [Seleccionar]
Articulo1       : 1.000.000
Articulo1       :   500.000
Articulo1       :    10.000
Articulo1       : 1.200.000
Articulo1       : 5.000.000
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #9 en: Enero 11, 2012, 06:23:44 pm »
Eso de la alineación de los números es una joda, hasta que alguien te de alguna solución mejor te paso la que yo uso:
Seguro que debes tener un loop para agregar el detalle, te paso el que hago a partir de un Grid. En esa parte tengo una funcion que llamo FormateoNumero

Código: (VB) [Seleccionar]
      For i = 1 To Grid1.Rows - 1
          Printer.Print _
          FormateoNumero2(Format(Grid1.TextMatrix(i, 4), "#,##0")); _
          Tab(8); Left(Grid1.TextMatrix(i, 2), 28); _
          Tab(45); FormateoNumero(Format(Grid1.TextMatrix(i, 5), "#0.00")); _
          Tab(56); FormateoNumero(Format(Grid1.TextMatrix(i, 6), "#0.00"))
      Next i

Código: (VB) [Seleccionar]
Public Function FormateoNumero(MiNum As String) As String
If MiNum <> "" Then
   Select Case Len(MiNum)
   Case 1:      FormateoNumero = "           " & MiNum     '
   Case 2:      FormateoNumero = "        " & MiNum
   Case 3:      FormateoNumero = "      " & MiNum
   Case 4:      FormateoNumero = "     " & MiNum             '    9.00
   Case 5:      FormateoNumero = "    " & MiNum              '   99.00
   Case 6:      FormateoNumero = "  " & MiNum               '  999.00
   Case 7:      FormateoNumero = MiNum                      '9,999.00
   End Select
End If
End Function

Espero te sirva
Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #10 en: Enero 11, 2012, 07:05:15 pm »
Lo hice así y funciona bien, si hay otra manera sería bueno.

Código: (VB) [Seleccionar]
Printer.Print; Tab(26 - Len(Format(Text1.Text, "##,###0"))); Format(Text1.Text, "##,###0")
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #11 en: Enero 11, 2012, 09:36:27 pm »
Podes usar FormatNumber$ que es mas comodo para mi. Y para que te quede todo bien usaria una fuente mono-espacio (courier por ej).

erbuson

  • Kilobyte
  • **
  • Mensajes: 75
  • Reputación: +11/-1
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #12 en: Enero 12, 2012, 11:34:14 am »
Hola a todos, el tema del ajuste por la derecha es muy simple si utilizamos el TextWidth, y permite sin ningun problema ajustar sea cual sea el tipo de letra que tengamos, Negrita, Italica, etc, incluso de espaciado variable.

Lo normal al utilizar el objeto Printer es posicionar la x (columna) donde deseamos escribir con lo que conseguimos la alineación completa.

Supongamos por ejemplo que queremos imprimir Referencia, Artículo, Precio en las x 200, 1000 y 4000, yo lo que hago en primer lugar es que Precio contiene el valor Formateado tal como lo deseo, por ejemplo 1.125,12 €

Printer.CurrentX = 200
Printer.Print Referencia

Printer.CurrentY = 1000
Printer.Print Articulo

Printer.CurrentX = 4000 - Printer.TextWidth(Precio)  'De este modo ajustamos por la derecha en 4000
Printer.Print Precio

Es un breve ejemplo, que espero os sirva.

Un saludo
« última modificación: Enero 12, 2012, 11:36:02 am por erbuson »

ElmerCamacho

  • Bit
  • Mensajes: 1
  • Reputación: +0/-0
    • Ver Perfil
Re:Centrar con Printer.Print "Hola Mundo"
« Respuesta #13 en: Mayo 30, 2013, 08:55:27 pm »
TE DEJO UN EJEMPLO CON PRINTER  alineado a la derecha:::


Printer.CurrentX = 10000 + (1000 - Printer.TextWidth(Me.txtSubTotal))
Printer.CurrentY = 10700
Printer.Print Me.txtSubTotal



Printer.CurrentX = 10000 + (1000 - Printer.TextWidth(Me.txtIGV))
Printer.CurrentY = 11100
Printer.Print Me.txtIGV


Printer.CurrentX = 10000 + (1000 - Printer.TextWidth(Me.txtTotal))
Printer.CurrentY = 11500
Printer.Print Me.txtTotal

'---------------------------------

Elmer Camacho.