23 mayo 2007

¿Y qué objeto tiene imprimir?

En esa era postmoderna llena de circuitos electrónicos y bits de información que hostigan información por las vías digitales de la comunicación moderna, ¿todavía es importante tener documentos impresos? ¿Qué no se había acabado eso cuando se petatearon los dinosaurios y esa onda? ¿Acaso me mintieron cuando me dijeron que el internet y las bases de datos movían información sin necesidad de papel?

Ciertamente los documentos han perdido importancia con el advenimiento de las maravillas digitales, sin embargo los documentos impresos son todavía imprescindibles. Se usa para los documentos realmente importantes (como el pasaporte, acta de nacimiento, etc.), de las que se tiene que asegurar que le llegue a las personas (se sorprenderían las veces que a la gente nunca le llegan los correos los documentos que mando por i-meil... échenle la culpa al i-meil...) o autorizar cosas (cheques, permisos, etc.) o que necesiten acuse de recibido (como la boleta de calificaciones de la primaria).

Para dejar a un lado tanto choro mareador, los documentos impresos son importantes y son fundamentales para los sistemas que usan bases de datos. Siempre se necesitan usar reportes impresos. Siempre.

Hay muchas estrategias para imprimir desde Visual Basic 6.0. Han desarrollado programas externos que se "pegan" a VB (como el Crystal Reports), crear formas con arreglos de controles (como labels) y usar la función PrintForm, y otras mil maneras diferentes (bueno, pue' que exageré un poco con las mil maneras, pero seguramente llegan a 999, jeje). Hoy voy a explicar la manera de usar el objeto Printer para crear documentos impresos.

El objeto Printer tiene todos los métodos y propiedades necesarias para imprimir (la explicación "oficial" del objeto Printer, sus propiedades, métodos, eventos y demás monerías, lo puedes encontrar aquí). Haz de cuenta que dibujas sobre una hoja (le pones círculos, logos, líneas, texto, etc.) y cuando ya está listo, le dices que imprima la hoja. El objeto se refiere a la impresora instalada por defáult. Si quieres acceder a otra impresora que haya instalado en el sistema, se hace uso de la colección Printers. Haz de cuenta que una colección es un arreglo de objetos, en este caso, un arreglo de objetos Printer.

Para que veas como funciona esto, preparé un programa explicatorio que da las explicaciones necesarias para explicar cómo se puede usar el objeto Printer en una aplicación de manera explicada. ¿Me explico?

Este programa consta de tres ventanas: la principal desde donde se imprime, otra que te permite configurar la impresora y la última nunca se ve, pero contiene la foto de Wally que vamos a usar más adelante. Al ejecutar el programa se ve esta pantalla:


Aquí apareden varas cajas de texto donde le usuario puede escribir lo que se le pega la gana (siempre y cuando no sean pelangochadas ni vituperios espantosos). A un lado hay una cajita donde el usuario puede "tachar" la caja a un lado de la línea que quiere ver en negritas. Hasta a bajo hay otras tres "cajitas". Una te imprime un círculo en la hoja, otra dibuja un rectángulo y el tercero dibuja la imagen de mi buen amigo (y casi casi mi doble) Wally (conocido también como Waldo en otros lugares). Como es solo un ejemplo, dibujé el círculo donde se me pegó la gana, al igual que el rectángulo y el lugar donde pongo la foto de Wally. En un caso real, usa el mismo código, pero acomoda las cosas donde se vean estéticamente placenteras. Este es el ejemplo de una ventana con datos:


En este caso, escirbe un renglón en negritas y otros dos en texto normal. También le especifiqué que dibujara el círculo, el recftángulo y que pusiera la foto de mi buen amigo Wally. Al darle click al botón que tiene la impresora volando con una carpeta atrás, genera una hoja como ésta:


Yo sé que no es nada del otro mundo, pero es suficiente para demostrar como funciona esta onda. Esto se imprime a la impresora que el usuario tiene especificada como predeterminada. Pero, ¿qué sucede si quiere cambiar de impresora? Una solución sería decirle al usuario que se decida y ponga como predeterminada la impresora que quiere usar y si lo quiere imprimir en otra, que vaya al Panel de Control - Impresoras o directamente a la opción Impresoras y faxes del menú de Windows y establezca la impresora defáult y le mueva a las opciones. Sería una solución, pero te verías demasiado chafa y probablemente te manden por un tubo debido a tu poca pericia informática (digo, es un enfado entrar a configurar las impresoras cada vez que quieras moverle algo a la impresora... que hueva).

Una mejor solución, de hecho la que usan todos los programas que te permiten imprimir, sería darle una ventana donde pueda configurar la impresora (o cambiar de impresora). Para esto es la segunda ventana, misma que aparece cuando el usuario le pica al botón que tiene una impresora sobre una mano extendida. Esta es la segunda ventana:


En el primer combo box, lo inicializo con los nombres de todas las impresoras instaladas en el sistema, abajito muestro el número de copias que va a imprimir, luego puede elegir el tamaño del papel (yo le dejé las opciones de carta y oficio, pero se pueden programar otros tamaños), la calidad de impresión y te muestra la orientación del papel. Abajo están dos botones y, como eres un empollón (bueno, tal vez no tanto), podrás deducir que el botón que tiene la palomita verde cierra la ventana guardando los cambios y el que tiene la espantosa X roja, sirve para cerrar la ventana sin guardar los cambios hechos.

Ahora que ya vista como funciona, vámonos al código. Vamos empezando con la primera ventana. Solamente voy a poner aquí el código que sea interesante para lo relacionado a la impresión (o sea, no esperes que explique el código para cerrar la ventanita o terminar el programa).

Al presionar el botón que imprime el documento, se ejecuta el siguiente código:


Comienzo con la instrucción On Error que le dice a VB 6.0 que si se traba con alguna bronca, se vaya a la etiqueta llamada "fin" que puse al final. O sea que en cuantro encuentre un problemita o problemón (cosa que esperamos nunca suceda), va a interrumpir el proceso de impresión, imprimiendo solo aquello que alcanzó a hacer antes del error. Se quedará en la memoria de la impresora lo que intentó hacer hasta el error.

Después de asegurarnos que no hay problema en caso que algo falle, me fijo si el usuario quiere dibujar un círculo sobre la hoja. En mi caso, el Checkbox que me indica si quiere el círculo se llama chkCircle. Si es así, uso la función Circle del objeto Printer para dibujarlo. Lo único que le tengo que dar son las coordenadas del centro del círculo y el radio del mismo. Tiene otros parámetros que se pueden especificar para hacer semicírculos, llenarlos de color, etc. , pero por lo pronto con estos bastan. Recuerda que es solo un ejemplo, ya te toca a ti experimentar un poco más. Después uso las propiedades CurrentX y CurrentY para posicionarme en esas coordenadas sobre la hoja y en esa posición escribo el texto Círculo mediante la función Print que sirve para escribir texto sobre la hoja. Puedes ver estas ligas para infomación acerca del uso de la función Circle y de las propiedades CurrentX y CurrentY (esta documentación está en inglés, pero no creo que tengas problemas en agarrar la onda).

Después hago algo muy similar con el rectángulo, solo que aquí el CheckBox se llama chkRect, y se usa la función Line, aunque está hecho para dibujar líneas al especificar las coordenadas donde comienza y donde termina, al final le escribí el parámetro B que indica que es una caja (box). Dejé dos paréntesis porque el parámetro que sigue de las coordenadas es la del color de la línea, que en mi caso no quería modificar. Para más informes acerca del uso de la función Line, haz click aquí.

Para dibujar una imagen, que es la condición que sigue, puedo usar el contenido de un PictureBox que ponga sobre una ventana. En mi caso tengo una tercera ventana en mi proyecto que nunca es vista por el usuario que sirve para este fin. La forma se llama frmImagen que tiene un PictureBox con la foto de Wally (llamado picWally). Entonces cargo la forma a la memoria (Load frmImagen), dibujo la foto en la hoja (Printer.PaintPicture frmImagen.picWally 600,900) y quito la ventana de la memoria (Unload frmImagen). La función PaintPicture recibe como parámetros las coordenadas donde se va a dibujar la imagen. Tiene mil otros parámetros para hacer chuchulucos y monerías diversas y si quieres verlo más a fondo, haz click aquí. La ventana frmImagen en la vista diseño, es esta:

Después de todo este alboroto, toca escribir las líneas de texto. Para esto mis cajas de texto son un arreglo de Textboxes, llamados txtTextLine, que consta de 10 elementos. También tengo los Checkboxes que me indican si la línea va en negritas en otro arreglo llamado chkNegritas, también de 10 elementos. Entonces compiezo un ciclo, controlado por la variable i, que va de 0 a 10 para recorrer las cajas de texto y cajas de opción. Inicializo la posición de Y (para los posicionarse en los renglones) en 1300 para que comience desde allí. Mientras i sea menor a 10 y haya algún texto en la caja de texto (valga la redundancia), establece la posición en X en 500 (todos los renglones comienzan donde mismo, en mi ejemplo) y se fija si va en negritas o no. Si lo quiere más negrote, establece la propiedad FontBold en verdadero. Luego escribe el texto, como ya se explicó antes, con la función Print, incremento i y pongo en falso la propiedad FontBold para que no siga escribiendo en negritas. Y el ciclo se repite, y repite, y repite, y repite...

Al terminar de imprimir las líneas de texto, uso la función EndDoc que sirve para decir que ya terminó el trabajo y que escupa la hoja que ya dibujé. Si se tienen que imprimir muchas hojas, puedes usar la función NewPage que escupe una hoja y te deja otra "en blanco" para que sigas dibujando.

Hasta allí todo parece felicidad y alegría. Lo que nos falta ver ahora es la manera de que aparezca la ventana que permite elegir y configurar las impresoras. Al cargar la ventana a la memoria, lleno un ComboBox con las impresoras instalados en la compu del usuario y lleno los otros controles. Es muy sencillo, así que ni lo explico (bueno, lo explicaré abajo del código). Este es el código:


Comienzo con un ciclo desde 0 hasta el número de impresoras instaladas menos uno. ¿Por qué le resto uno? Porque consideramos la primera impresora instalada como la número cero. La propiedad DeviceName es una cadena con el nombre de la impresora (por ejemplo, "HP LaserJet 1200"). El siguiente ciclo me sirve para establecer la impresora default como la impresora seleccionada en el ComboBox (cboPrinters). Para lograr esto, hago un ciclo recorriendo la lista de impresoras (de la colección Printers) hasta encontrar el que tiene el mismo nombre (DeviceName) que el de la impresora predeterminada (el objeto Printer es la impresora predeterminada).

Después de esto, inicializo mis ComboBoxes de tamaño y calidad en 0 (para asegurar que hay algún elemento seleccionado y no me de broncas después), muestro el número de copias que tiene especificada (usando la propiedad Copies) y la orientación del papel. Para la orientación del papel, usa la constante vbPRORPortrait la cual es simplemente un número que guarda la propiedad Orientation. ¡Listo! Ya está.

Ahora vamos a guardar la configuración. Este es el código del botón que acepta los valores y cierra la ventana (es lo que sucede cuando presionan el botón cmdPrint_Click):


Esta está sencillo. Establezo que Printer sea igual a la impresora seleccionada (Set Printer = Printers(cboPrinters.ListIndex)), cambio el tamaño de papel al que eligieron (Printer.PaperSize = Right(cboTmno.List(cboTmno.ListIndex), 1)). Para especificar la calidad, uso un Case y según el elemento elegido, le establezco la calidad (con el vbPRPQDraft, vbPRPQLow, vbPRPQMedium y vbPRPQHigh). Al final cierro la ventana (Unload Me). ¡Listo!

Creo que es todo. Les dejé ligas a páginas que tienen las referencias a todo lo habido y por haber. Si hay dudas, mándame un emilio y deja un mensaje aquí. ¡Hasta la próxima!

27 comentarios:

Anónimo dijo...

Hola... necesito imprimir un proyecto en visual 6.0 pero tengo que seleccionar los componentes que deseo imprimir... con el print se me complica mucho porque son muchos los obj q deseo imprimir.... necesito saber si hay alguna forma de seleccionar o de imprimir mediante el word solo los obj que deseo.

Tony Valderrama dijo...

Todo dependas de lo que quieras imprimir. Por ejemplo, si es código, solo selecciona la parte que necesitas, copialo y págalo en Word. Te recomiendo que uses el tipo de letra Courier para que se vea más o menos.

Si quieres imprimir elementos visuales, cuando aparezca la ventana con lo que quieres imprimir, presiona ALT-Imprimir Pantalla. Eso copia la ventana en la memoria. De allí puedes pegarlo en un nuevo dibujo en Photoshoip o hasta Paint para recortar la parte que necesitas.

Este artículo no se trata precisamente de eso. Se trata de imprimir desde mi aplicación hecha en Visual Basic 6 algo que se vea más o menos decente sin usar programas externos (como el Crystal Reports, etc.).

Espero que te haya sido útil el comentario...

Anónimo dijo...

hola...necesito hacer una impresion a doble cara en vb6... Sabes como lo puedo hacer?

Tony Valderrama dijo...

Nunca lo he hecho porque mi impresora no tiene la capacidad de Duplex, pero el objeto Printer tiene la propiedad Duplex que creo que te puede ayudar.

Revisa esta liga:
http://msdn.microsoft.com/en-us/library/aa267284(VS.60).aspx

Espero que te sea útil. ¡Saludos!

Anónimo dijo...

Tony !
soy Naranjo,
tendras este codigo por ahi ??
si puedes, te lo encargo!!
saludos

manuel_n3@hotmail.com

Anónimo dijo...

Hola Tony soy Brito

Ya lei el articulo y me parecio un poco complicado, sobretodo eso de la ventana de propiedades de impresora
pero bueno la primera parte si la entendi y se me hizo muy efectiva para q el usuario pueda elegir de entre
diferentes opciones q es lo q quiere imprimir, al igual q la funcion On Error me parecio muy util por si surge
un error q este no nos arruine toda la impresion.

Bueno eso seria todo, adios tony

Anónimo dijo...

Tony...hola soy fany... oie esta medio confunso esto...Si es util y todo porke siempre habemos personas que la impresión nos hace hacer corejes Xd...pero, no entendi muy bien, entendi hasta imprime, pero no entendi si primero le tienes que dar imprimir y vas haciendo lo que vas a imprimir o es alreves...y lo demas como que masomenos capte..jiji..
oie cambiando drasticamente de tema... lo que hemos estado viendo en clase, la ves que te pusiste en el salon con la lap a explicar apenas y alcance a copiar el codigo de la primera ventana(y cuando lo trate de hacer charchar no sirvio Xd)me quede a medias del tema; no tienes aqui el tema que nos diste en clase para ver que le corrijo a mi programa y que me falto de codigo???... porfas...xD
Bueno pues nos vemos dentro de 2 semanas... CuIdAtE!!!!!!!
xD....xoxo

Anónimo dijo...

k onda tony aki chong comentando que este es un tema un poco medio confuso, la verdad le entendí masomenos ya aver si con la practica le hayo un poquito más, lo que entendí fue que los documentos impresos son muy importantes y ademas fundamentales para poder usar y realizar una base de datos, además el código es algo laboriosos y complicado con todo eso del onerror y todo lo demás pero aver si con la practica se nos da a entender mejor este tema. Bueo tony cuidate d la influenza y nos vemos el 6 d mayo zas

Anónimo dijo...

hola tony soy isaac lei el articulo para mi punto de vista sera un poco complicado comprender a mi pero pues me parecio divertido el printer es como dibujor pero un poco ma spractico , comenzando con figuras base
me despido

Anónimo dijo...

Alejandro Fabregas Tejeda
4-TPO

Bueno cabe resaltar que el objeto printer es realmente util ya que la impresion es un metodo importantisimo de intercambio de informacion y aunque como tu mencionas la epoca de la informatica se encuentra destituyendo al "papel" como distribuidora de datos, no podemos dejar a un lado que todavia existen personas que encuentran el medio escrito como algo menos "tedioso" que un archivo digital.

Israel Alejandro Cuevas Gutiérrez dijo...

Que onda Tony.
Pues principalmente usando ese metodo es muy complicado hacer reportes impresos extensos,ya que una mejor manera seria automatizando el proceso con tus propias funciones o bien usando otra manera de imprimir de las cuales no conosco peor me imagino que debe de haber una menos complicada.
Israel Alejandro Cuevas Gutiérrez
4°TPO

Anónimo dijo...

Hola TonyluU!!
-Estela Ortiz Màrquez-
De tu post entendi asi como el 50% es que yo creo que esta facil pero a la hora de la practica es en donde salen todas mis dudas y eso S:
Pero creo que cuando lo haga va a estar bien padriuriX si si funciona. :)
Y yo tambien amo a Wally Tony!
ja, ja!

Anónimo dijo...

k onda tony
La verdad es algo muy util, si me habia preguntado muchas veces komo le hacia para imrimir kosas pro la verdad el komo hacerle no me kedo muy klaro
espero k kuando esta epidemia se akabe(si no akabamos komo resident evil) nos pueda explicar kon ejemplos.
pako 4°TPO

Anónimo dijo...

What's aaaaaaaaaaaaaa Tony!!
ps k t puedo decir de tu escrito?
esta interesante, nunca habia entendido como estaba todo el royo de hacer que las cosas se impriman (ni aun lo entiendo) pero al menos tenemos las clases para que nos des ejemplos y podamos entender mejor esta cosa. Si sobrevivimos a esta enfermedad que saca los ojos y voltea la piel (o al menos esa es la exageración de la gente) nos vemos en clase para que nos quede mas claro. Sas Tony. D rato!!

Axel _*ÄkU$3rU*_

Anónimo dijo...

k pues ese tony
pues despues de leer toooodo en lo ke consiste imprimir en visual me doy una idea de el desmadre k es inicializar las impresoras y los objetos (si asi los podemos llamar)pero da comodidad al usuario de elegir diferentes opciones de impresion y eso es muy util

cendejas 4tpo

Anónimo dijo...

holaaaaaaa tony oy christian su alumno mas trabajador junto con martun jajajajaja ya pues buen chiste
pues lei el articulo y me parecio un poco complicado, sobretodo eso de la ventana de propiedades de impresora
pero bueno la primera parte si la entendi y se me hizo muy efectiva para que el usuario pueda elegir
diferentes opciones que es lo que quiere imprimir la funcion On Error se me hizo chida esa funcion por si cometes un error
que no arrunie todo lo echo o la imprecion

bueno tony pues me despido uy que este bien y aguas con la venganza de los cerdos

Anónimo dijo...

Jesus Ruben Villarreal Favela
4TPO
qe onda tony ps se oye facil eso de hacer para que imprima aunqe se me ase muy extenso y confuso el codigo pero creo qe a la hora d la hora va a resultar complicado pero bueno ojala i le entienda mas cuando llegemos d las vacas jaja

Anónimo dijo...

Pues sobre tu escrito...
Se me hizo facil, la explicacion no estuvo tan mal, pero espero q despues con un ejercicio reafirmes eso para que ya no tengamos dudas de coso se realiza todo este tipo de cosas.
Bueno grax Tony

Atte:
Gaby Ramírez
4°TPO

Anónimo dijo...

Hola tOny!!! sOii zeydii!! =D
esperoO qe estes biien jeje
Acerca de tu articulo se me hizoO algo confuzo ya que no le entendi muy bien sobre todo las propiedades de imprimir peroO creoO qe lo primero fue lo mas facil de entender!!! espero que en clase no lo expliques mas a detalle y todo para que quede muy claro!!! =D
saluuudoOs toOny!!! =D

Anónimo dijo...

hola tony soy carlos2 de 4ºtpo
bueno leyendo su articulo
iba todo bien
asi de que le pone negritas luego su imagen de walle, y el circulo y eso...
pero al llegar con ,las propiedades
y su explicacion del codigo
me trabe
:s
si se para que sirve tener todo eso
pero lo empeso a explicar y explicar
y ya no supe bien
masomenos tengo una vaga idea
pro me gustaria una explicacion mas detallada en clases :p

Fitux dijo...

Tony al parecer ya se dio cuenta que este tema esta muy confuso... a lo q lei le entendi a medias la verdad pero prefiero lo que son los archivos ditales la verdad jajajaja odio tener q imprimir la cosas xD
la verdad no le entendere al tema asta no ponerlo en practica por que la verdad no entiendo nunk la teoria es lo que me falla

Luis Felipe Sanchez Cuevas (Fitux)
4°TPO

Anónimo dijo...

que tal tony si se be k esta facil de decir el hecho es hacerlo claro con el codigo y la explicacion ps igual y si le agarramos el pedo pero digamos si aremos esto en laboratorio como podremos mandar a imprmir sin k esekiel nos cobre ehh jja muy buena no pero si esta un poco razonable lo k intentamos hacer en este programa alomejor no quedo muy claro pero espero k regresando de esto de la influenza pueda dar una mayor explicacion a este tema gracias
Hector ontiveros de 4tpo

Anónimo dijo...

ey tony k pasa si se k esto era ayer pero tengo una buena justificacion para averla entregado hoy se lo aseguro pero no se la dire por aki para k nadie diga nada. pues lei su artikulo k komo ala mitad me aburrio pero tenia la dificil tarea de salvar al mundo leyendo asi k segui hasta lo infinito. pero hasta eso k me parecio interesante kien lo diria imprimir desde visual basic k bizarro, jaja buen post tony mejor k otros, luego le digo k me paso de rato tony se kuida.atte:stickydick

Edgar Leonel Peña Rodriguez dijo...

Edgar Leonel Peña Rodriguez 4°TPOTony este tema esta muy confuso (como todos los temas que nos dejas en tu blog) y yo creo ke lo voy a entender mas en tu klase...
aunque estaria padre imprimir lo que hagamos en nuestros programas.
lo confuso fueron las propiedades de objetos print... ojala en clase lo explikes a detalle

sale tony nos vemos

Anónimo dijo...

miguel gutierrez 4 TPO

k pasa tony como esta en esta epidemia de tanta influencia jajaja ps espero k este bien profe....
pos ahi medio le entendi a lo de impresiones no mucho pero espero en las clases entenderlo bien bien

Anónimo dijo...

Pues por fin se para que se utliza el famoso Crystal Reports aunque se me hace un trabajo demasiado extenso simplemente para imprimir documentos aunque en su codigo incluye muchas posibilidades de arreglar las cosas en caso de errores

Andros Mendoza Martin 4TPO

Anónimo dijo...

Tocayo.. como sta?

El codigo esta algo raro pero creo q medio le entendi a eso del Crystal.

Jose DesidERIO Martinez

4tpo

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...