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
Ir a la versión completa