• Sábado 20 de Abril de 2024, 08:59

Autor Tema:  Objeto Printer  (Leído 9129 veces)

9tnix

  • Miembro MUY activo
  • ***
  • Mensajes: 165
  • Nacionalidad: pe
    • Ver Perfil
Objeto Printer
« en: Sábado 19 de Septiembre de 2009, 02:44 »
0
Saludos colegas

Espero me puedan ayudar con este problema. Quiero imprimir usando el objeto Printer pero cuando le doy las coordenadas no las toma en cuenta.
Alguna idea de cual puede ser la razon?
Uso VB6 sp6
OS: XP sp2
Impresora HP PhotoSmart C3180 (multifuncional) es la impresora por defecto

el codigo:
   
    Printer.ScaleMode=6
    Printer.ScaleX 30: Printer.ScaleY 49
    Printer.Print UCase(txtEmpresa.Text) 'Nombre de Empresa
    Printer.ScaleX 160: Printer.ScaleY 49
    Printer.Print txtRuc.Text 'Ruc
    Printer.ScaleX 30: Printer.ScaleY 56
    Printer.Print txtDireccion.Text 'Direccion
    Printer.ScaleX 162: Printer.ScaleY 56
    Printer.Print Day(Date) 'Imprime Dia
    Printer.ScaleX 172: Printer.ScaleY 56
    Printer.Print Month(Date) 'Imprime Mes
    Printer.ScaleX 188: Printer.ScaleY 55
    Printer.Print "9"  'Imprimir Año

    'Detalle de Factura
    Printer.ScaleX 15: Printer.ScaleY 69
    Printer.Print lblDias.Caption 'Cantidad
    Printer.ScaleX 35: Printer.ScaleY 69
    Printer.Print "Por Servicio de Hoteleria" 'Descripcion
    Printer.ScaleX 158: Printer.ScaleY 69
    Printer.Print txtPrecio.Text 'Precio x Dia
    Printer.ScaleX 183: Printer.ScaleY 69
    Printer.Print lblHoteleria.Caption 'Importe
    Printer.ScaleX 35: Printer.ScaleY 75
    Printer.Print "F.Entarda: " & DTFechaInicio.Value & " - F.Salida: " & DTFechaFin.Value
    Printer.ScaleX 20: Printer.ScaleY 80
    Printer.Print "Otros consumos" 'Descripcion
    Printer.ScaleX 183: Printer.ScaleY 80
    Printer.Print lblConsumo.Caption 'Importe
    'Pie de Factura
    Printer.ScaleX 78: Printer.ScaleY 126
    Printer.Print Day(Date)
    Printer.ScaleX 95: Printer.ScaleY 126
    Printer.Print Format(lblFecha.Caption, "MMMM")
    Printer.ScaleX 134: Printer.ScaleY 126
    Printer.Print Year(Date)
   
    Printer.ScaleX 180: Printer.ScaleY 118
    Printer.Print lblSubTotal.Caption 'Total
    Printer.ScaleX 180: Printer.ScaleY 126
    Printer.Print lblIgv.Caption 'Total
    Printer.ScaleX 180: Printer.ScaleY 133
    Printer.Print lblTotal.Caption 'Total
    Printer.EndDoc

cada Printer.Print <texto>, lo imprime en una linea, pero sin seguir las coordenadas antes definidas
Saquenme de mi error

Salu2
zeekel
The knowledge is power!
TP-Systems
our knowledge is our power!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Objeto Printer
« Respuesta #1 en: Sábado 19 de Septiembre de 2009, 17:57 »
0
Qué son para ti las cordenadas ????...

Defines una escala en milímetros y luego le dices diviidimos el ancho del área en 30 partes y el alto en 49... imprimes un texto, lógicamente en 0,0
vuelves a decirle que repartes el área, ahora el ancho en 160 partes y el alto en 49... las cordenadas son las que quedaron tras imprimir lo anterior, no ha habido modificación.

Esto se llama escala, como su nombre indica  printer.ScaleX, printer.ScaleY, no cordenadas... Si el modo de escala lo usas en milimetro (6), entonces a lo sumo deberías definir las medidas del papel, por ejemplo si utilizas un 'DIN A4'
Código: Visual Basic
  1.  
  2.       with vb.printer
  3.            .scalemode=6
  4.            call  .scaleX( 210)
  5.            call  .scaleY( 297)
  6.      end with
  7.  
  8.  

Las cordenadas del cursor se definen con:
Código: Visual Basic
  1.  
  2.     with vb.printer
  3.         .scalemode=6
  4.         call  .scaleX( 210)
  5.         call  .scaleY( 297)
  6.          
  7.         ' igual que un formulario, picture,etc... no has pintado nunca líneas sueltas o círculos...???
  8.         .CurrentX= 30:  CurrentY= 49 : .Print Ucase(Txtemopresa.Text)
  9.         .CurrentX= 160:  CurrentY= 49 : .Print txtRuc.Text
  10.              '.
  11.             '.
  12.            '.
  13.           '.  etc ...    
  14.     end with
  15.  
  16.  

No olvides que la  impresora avanza hacia abajo, por lo que debes siempre imprimir en orden vertical de líneas (aunque no sea el 'orden lógico', del documento). Lo mismo sucede al avance horizontal.... De hecho en printer enddoc, lo que hace es readaptar las instrucciones para cumplir estos requisitos ( ordenando, subdividiendo una instrucción en varias, etc...)... Sin embargo le ahorras tiempo a esta fase cuanto mejor ordenado lo quedes tú, eso si, hay partes que entre un uso y otros puede ocupar una línea o varias (tiene un tamaño variable, no cuantificable a priori) en ese caso no le des más vueltas, que enddoc  se las apañe...

Otra cosa para evitar saltos raros entre distancias de líneas (sobre todo si son contínuas), dado un tipo de letra deberías preguntarle el alto del tipo y los CurrentY hacerlos múltiplos de este valor...

por ejemplo:
Código: Visual Basic
  1.  
  2.     Dim Ac As single ' Alto de un Caracter con el tipo de letra actual
  3.     Ac = VB.Printer.TextHeight("Wy")
  4.          ' .
  5.          ' .
  6.          ' .                                   división entera
  7.         vb.printer.CurrentY= Cint((133Ac)*Ac)  ' + Inicial si la 1ª línea no es múltiplo de Ac, en este caso:  'inicial = posY mod Ac'
  8.  
  9.  
Si es un documento 'complejo', con imágenes, cuadrículas, cambios de tipos de letra, etc... entonces esto debe aplicarse por bloques de texto contínuo, siendo para cada bloque un 'Ac' distinto y un 'inicial' distinto, según sea el caso... si un mismo párrafo utiliza diferentes fuentes, Toma el valor de 'Ac' con la fuente que dé mayor tamaño de alto de su texto. Esto lo puedes hacer haciendo un bucle y comprobar cual tiene el alto mayor,  recuerda que el alto no sólo depende de 'fontsize' también del tipo de letra....

Un ejemplo de cálculo, imagina que las fuentes las tomamos de objetos del formulario, donde cada objeto es representativo de la fuente que el cliente quiere usar para imprimir (esto le permite definiri mejor el resultado final).
Código: Visual Basic
  1.  
  2.      dim fuentes() as Ifontdisp, k as byte , Actual as single
  3.     redim fuentes(0 to 4) ' vamos a usar 5 fuentes diferentes...
  4.  
  5.     fuentes(0)= LabelCabecera.font  ' texto y fuente que se utiliza para el título y/o cabecera del documento
  6.     fuentes(1)= TxtParrafos.Font     ' texto y fuente 'base' del documento.
  7.     fuentes(2)=  LabelResalte.Font   ' texto y fuente que se resalta dentro de los párrafos, típicamente será negrita, pero puede que también cambie el tamaño de la fuente y el tipo
  8.    fuente(3)=  ........ etc..
  9.        '.
  10.        '.
  11.      
  12.       vb.printer.font=Fuentes(1)  ' fuentes(0) no se mezcla con los párrafos, por tanto se deja aparte
  13.       Ac = VB.Printer.TextHeight("Wy")
  14.      for k= 2 to ubound(fuentes)                  ' la fuente 1 se realiza fuera del bucle, para disponer del valor inicial de comparación, en el siguiente bloque, se muestra el caso dentro del bucle.
  15.           vb.printer.font=Fuentes(k)
  16.           Actual= VB.Printer.TextHeight("Wy")
  17.           if Actual > Ac then Ac= Actual
  18.      next
  19.        
  20.       ' fuentes(0) no se mezcla con los párrafos, por tanto se deja aparte
  21.       ' caso donde queramos, meter el 1 dentro del bucle, conviene poner Ac a 0 por si tuviera un valor distinto de trabajo previo
  22.       Ac=0
  23.       for k= 1 to ubound(fuentes)                  
  24.           vb.printer.font=Fuentes(k)
  25.           Actual= VB.Printer.TextHeight("Wy")
  26.           if Actual > Ac then Ac= Actual
  27.      next
  28.  
  29.  

Como es obvio, esto sólo se aplicará  en auqellas líneas donde semezclan diferentes fuentes, o  tamaños... ya que si un párrafo tiene pongamos 40 líneas y en la línea 33 hay un realte de letra de mayor tamaño, no vamos a guardar esa altura para todas las líneas... sólo para esa línea 33 y en aquellas en las que aparezca. Desde luego lo mejor es, en lo posible no mezclar fuentes que produzcan altos de línea diferente, esto te simplifica mucho trabajo, y en general endproc, resuelve muchos casos, por lo que sólo tendrás que ceñirte a casos concretos... con las explicaciones que he dado deberían servirte para resolver esos pequeños fallos que uno nunca sabe como resolver....

Finalmente te recuerdo que para pulir pequeños detalles, es muy acertado antes de imprimir hacer una vista  previa para asegurarte que queda realmente como lo tienes pensado...
Saludos...
«Ma non troppo»
----> ModoVacaciones = False<----

9tnix

  • Miembro MUY activo
  • ***
  • Mensajes: 165
  • Nacionalidad: pe
    • Ver Perfil
Re: Objeto Printer
« Respuesta #2 en: Martes 29 de Septiembre de 2009, 21:55 »
0
Hola Nebire

Gracias por responder a mi inquietud.
No nunca he hecho nada con el objeto Printer, pero ahora gracias a tu explicacion entiendo su uso, hare unas pruebas.
Lo anterior logre imprimir usando el DataReport pero lo que queria era usando el objeto Printer.

Gracias de antemano
Salu2
TP-Systems
our knowledge is our power!