|
|
|
Este proyecto, muy simple, muestra algunas técnicas de mucha utilidad en los sistemas reales:
¿Ya les dije que el proyecto era simple? Si no me creyeron, vean la ventana principal (y única):

Ya pueden empezar por hacer la ventana en un nuevo proyecto de tipo CLX. He renombrado los componentes para que sea más fácil seguir el código:
El ComboBox se llama cbImpresoras
El botón 'Imprimir' se llama bImprimir
El botón 'Cancelar' se llama bCancelar
Para manipular la impresión usamos las funciones y objetos provistos en la unit Printers, por lo que habrá que agregarla al proyecto.
En esta unit se define una clase: TPrinter. También se declara una variable de esta clase (Printer) que referenciará a una instancia creada automáticamente al comenzar el programa. Es decir: sin nada más que agregar la unit Printers a la cláusula uses, tenemos disponible una variable llamada Printer que apunta a una instancia de la clase TPrinter y encapsula muchas de las características y funcionalidad del subsistema de impresión. Practiquen un poco y no sigan hasta que puedan decir la frase anterior rápidamente y sin equivocarse con los nombres.
Esta tarea se reduce a una asignación, gracias a la 'propiedad' Printers del objeto Printer. Esta función nos devuelve un TStrings con la lista de impresoras en el mismo orden que figuran en el sistema; se la asignamos a la propiedad Items del Combo al iniciar la aplicación, en el evento OnCreate del Form:
procedure TForm1.FormCreate(Sender: TObject);
begin
//Llena el combo con las impresoras instaladas en el sistema
cbImpresoras.Items.Assign(Printer.Printers);
end;
Esto nos mostrará los nombres de las impresoras, incluyendo el path de red
cuando la impresora no sea local.
Cuando el usuario ha seleccionado el destino de la impresión en el ComboBox, direccionamos a ese dispositivo la salida impresa asignando el nro. de orden de la impresora a la propiedad PrinterIndex del objeto Printer:
procedure TForm1.cbImpresorasChange(Sender:
TObject);
begin
Printer.PrinterIndex:=
cbImpresoras.ItemIndex;
end;
Gracias a que la lista está ordenada igual que las impresoras en el sistema,
solamente tenemos que asignar el nro. de orden de la selección para direccionar
la salida a esa impresora.
Hay dos maneras de imprimir directamente (sin usar componentes como los de QuickReports): asignando la salida estándar a la impresora o usando el objeto Printer. Usaremos la primera opción para imprimir el texto escrito en el memo, y la segunda para dibujar un círculo en otra página impresa.
Para direccionar la salida estándar a la impresora usamos la función AssignPrn con una variable de tipo textfile; sí, es la misma que usamos para acceder a archivos de texto. De hecho, esta función nos permite trabajar con la salida impresa como si fuera un archivo.
Los pasos son los mismos que para un archivo:
En el proyecto que nos ocupa, lo hacemos en respuesta al OnClick del botón bImprimir:
procedure TForm1.bImprimirClick(Sender:
TObject);
var
f: textFile;
i: integer;
begin
//Impresion de texto
AssignPrn(f);
Rewrite(f);
for i:=
0 to pred(memo1.Lines.Count)
do
writeln(f,memo1.lines[i]);
CloseFile(f);
Notemos que no he terminado el procedimiento, porque agregaré la impresión de gráficos a continuación:
//Impresion de graficos
Printer.BeginDoc;
Printer.Canvas.Ellipse(10,10,300,300);
printer.EndDoc;
end;
Ahora si termina el procedimiento. Notemos que en esta segunda parte iniciamos un nuevo trabajo de impresión, que se hará en una hoja nueva, y esta vez usamos el Canvas del objeto Printer. Este objeto es una instancia de la misma clase que la que se utiliza en los controles de pantalla, por lo que tenemos disponibles las mismas propiedades y métodos. Por supuesto que la resolución dependerá de la impresora, y se puede consultar mirando las propiedades del objeto Printer, tales como PageWidth, PageHeight, Orientation, XDPI, YDPI, etc.
Por último, al terminar el dibujo debemos indicar al sistema de impresión que hemos acabado llamando al método EndDoc del objeto Printer.
Aplicando estas técnicas, podemos permitir al usuario final de nuestra aplicación que direccione la salida impresa a diferentes dispositivos sin preocuparnos por la tecnología de impresión, el puerto al que está conectado o si es una impresora local o de red. El sistema operativo y Delphi se encargarán de eso por nosotros.
Qué cómodos nos estamos volviendo...
Hasta la próxima!