Programación General > Visual Basic 6.0 e inferiores

 Objeto Printer

(1/1)

9tnix:
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!

Nebire:
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 ---       with vb.printer           .scalemode=6           call  .scaleX( 210)           call  .scaleY( 297)     end with  
Las cordenadas del cursor se definen con:

--- Código: Visual Basic ---     with vb.printer        .scalemode=6        call  .scaleX( 210)        call  .scaleY( 297)                 ' igual que un formulario, picture,etc... no has pintado nunca líneas sueltas o círculos...???        .CurrentX= 30:  CurrentY= 49 : .Print Ucase(Txtemopresa.Text)        .CurrentX= 160:  CurrentY= 49 : .Print txtRuc.Text             '.            '.           '.          '.  etc ...         end with  
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 ---     Dim Ac As single ' Alto de un Caracter con el tipo de letra actual    Ac = VB.Printer.TextHeight("Wy")         ' .         ' .         ' .                                   división entera        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'   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 ---      dim fuentes() as Ifontdisp, k as byte , Actual as single    redim fuentes(0 to 4) ' vamos a usar 5 fuentes diferentes...     fuentes(0)= LabelCabecera.font  ' texto y fuente que se utiliza para el título y/o cabecera del documento    fuentes(1)= TxtParrafos.Font     ' texto y fuente 'base' del documento.    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   fuente(3)=  ........ etc..       '.       '.           vb.printer.font=Fuentes(1)  ' fuentes(0) no se mezcla con los párrafos, por tanto se deja aparte      Ac = VB.Printer.TextHeight("Wy")     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.          vb.printer.font=Fuentes(k)          Actual= VB.Printer.TextHeight("Wy")          if Actual > Ac then Ac= Actual     next             ' fuentes(0) no se mezcla con los párrafos, por tanto se deja aparte      ' caso donde queramos, meter el 1 dentro del bucle, conviene poner Ac a 0 por si tuviera un valor distinto de trabajo previo      Ac=0      for k= 1 to ubound(fuentes)                            vb.printer.font=Fuentes(k)          Actual= VB.Printer.TextHeight("Wy")          if Actual > Ac then Ac= Actual     next  
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...

9tnix:
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

Navegación

[0] Índice de Mensajes

Ir a la versión completa