PDA

Ver la Versión Completa : Impresora Pre-Definida con FR


lbidi
09-05-2012, 20:03:42
Estimados foristas.

Necesito imprimir un reporte de Fast Report en una impresora definida por el nombre de la misma.

Tengo el siguiente codigo pero no me imprime nada.



AIndex := frxPrinters.IndexOf(Printer.Printers[Printer.PrinterIndex]); <--- Devuelve la imp x defecto
AIndex := frxPrinters.IndexOf('HP PSC 750'); <--- Nombre de la impresora definida

Rep_Estudio.PrintOptions.ShowDialog := False;
if AIndex <> 0 then
begin
frxPrinters.PrinterIndex := AIndex;
Rep_Estudio.PrintOptions.Printer := frxPrinters[AIndex].Name;
Rep_Estudio.PrepareReport();
Rep_Estudio.Print;
end;



Si dejo la primer linea definida de la variable aIndex, y tengo la impresora HP PSC 750 definida como predeterminada, me imprime correctamente.

Ahora si uso la segunda linea definida de la variable por medio del nombre de la impresora, y predetermino otra impresora , no funciona, sin embargo la variable a aIndex posee el mismo valor en ambas lineas.

Alguna sugerencia ?

La idea general es poder definir en un archivo de texto o ini, diferentes impresoras y asignarlas en runtime segun lo que se desee imprimir.

Muchas Gracias

Saludos..

Leo.

ecfisa
10-05-2012, 09:09:49
La idea general es poder definir en un archivo de texto o ini, diferentes impresoras y asignarlas en runtime segun lo que se desee imprimir.


Hola Ibdi.

No capto bién la idea de lo que buscas hacer. Para que el usuario asigne una de las impresoras disponibles, basta con pasarlas a un ListBox, ComboBox, etc, para que se las elija desde allí.

Pero en ese caso no tendría mucho sentido guardarlas en un archivo INI. Generalmente en este tipo de archivos se guardan configuraciones realizadas por el usuario y que se quieren conservar un cierto tiempo para que no tenga que volver a realizar la taréa cada vez que se inicie el programa.

Por ejemplo, si toda la semana van a imprimir en formulario continuo, sería cómodo que guardara como predeterminada la impresora matricial hasta que se realize una nueva elección por que la nueva taréa requiere de una impresora Laser. Es decir que mantenga la selección hasta que el usuario la vuelva a cambiar.

Si no entendí mal y la idea es esa, podrias hacer:

...
implementation

uses Printers, IniFiles;

var
Prn: TPrinter;

(* Cargar impresoras en combo, seleccionar última usada *)
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
begin
with TIniFile.Create('YourApp.ini') do
try
Prn:= TPrinter.Create;
ComboBox1.Items:= Prn.Printers;
ComboBox1.ItemIndex:= 0;
s:= ReadString('Impresora', 'Actual', ComboBox1.Text);
ComboBox1.ItemIndex:= ComboBox1.Items.IndexOf(s);
Prn.PrinterIndex:= Prn.Printers.IndexOf(s)
finally
Free
end
end;

(* Seleccionó otra impresora *)
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Prn.PrinterIndex:= Prn.Printers.IndexOf(ComboBox1.Text)
end;

//...

(* Guardar ultima impresora seleccionada *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
with TIniFile.Create('YourApp.ini') do
try
WriteString('Impresora', 'Actual', Prn.Printers[Prn.PrinterIndex])
finally
Free
end;
if Assigned(Prn) then // asegurarnos...
Prn.Free;
end;
end.

Con el mismo resultado podés utilizar el registro de windows para almacenar la selección.

Saludos.

olbeup
10-05-2012, 09:10:05
Estimados foristas.

Necesito imprimir un reporte de Fast Report en una impresora definida por el nombre de la misma.

Tengo el siguiente codigo pero no me imprime nada.



AIndex := frxPrinters.IndexOf(Printer.Printers[Printer.PrinterIndex]); <--- Devuelve la imp x defecto
AIndex := frxPrinters.IndexOf('HP PSC 750'); <--- Nombre de la impresora definida

Rep_Estudio.PrintOptions.ShowDialog := False;
if AIndex <> 0 then
begin
frxPrinters.PrinterIndex := AIndex;
Rep_Estudio.PrintOptions.Printer := frxPrinters[AIndex].Name;
Rep_Estudio.PrepareReport();
Rep_Estudio.Print;
end;



Si dejo la primer linea definida de la variable aIndex, y tengo la impresora HP PSC 750 definida como predeterminada, me imprime correctamente.

Ahora si uso la segunda linea definida de la variable por medio del nombre de la impresora, y predetermino otra impresora , no funciona, sin embargo la variable a aIndex posee el mismo valor en ambas lineas.

Alguna sugerencia ?

La idea general es poder definir en un archivo de texto o ini, diferentes impresoras y asignarlas en runtime segun lo que se desee imprimir.

Muchas Gracias

Saludos..

Leo.

No entiendo el Fast Report, pero las riendas de cómo cambiar la impresora por defecto por otra, es el uses Printers.pas

AIndex := Printer.Printers.IndexOf('HP PSC 750'); <--- Buscar la impresora por la que voy a imprimir

if (AIndex = -1) then
begin
ShowMessage('No se encuentra la impresora, o la impresora a cambiado de nombre');
Exit;
end;

Rep_Estudio.PrintOptions.ShowDialog := False;
if AIndex <> 0 then
begin
Printer.PrinterIndex := AIndex;
Rep_Estudio.PrintOptions.Printer := Printer.Printers[AIndex];
Rep_Estudio.PrepareReport();
Rep_Estudio.Print;
end;


Espero que te funcione.

Un saludo

lbidi
10-05-2012, 14:06:45
Gracias , ecfisa..

Quizás no me explique bien.. La idea es que mi sistema pueda imprimir indistintamente en varias impresoras, sin que el usuario las elija. Algunos reportes deben salir por una matricial y otros por una laser, pero queremos que no las seleccione el usuario , que sea automático según lo que van a imprimir.

Por eso la idea de un archivo ini , o similar donde pueda guardar los nombres de las impresoras definidas y asignarlas al momento de la impresión.

Y que sea independiente de la impresora predeterminada que tenga.. me explico??

Saludos

lbidi
10-05-2012, 14:07:25
Gracias olbeup..

Intentare hacerlo de este modo y te cuento.

Saludos.

lbidi
10-05-2012, 15:34:17
Desgraciadamente, no pude con ninguna de las opciones.
La de ecficsa no me sirve ( gracias igual ), porque el usuario de debe poder seleccionar la impresora.
Y la del amigo olbeup, no me imprime por la impresora que deseo.

Sigo investigando.

ecfisa
10-05-2012, 15:38:18
Hola Ibdi.
Quizás no me explique bien..

O tal vez fuí yo quién no te supe entender, pero ahora está clarísimo. Siendo así, creo lo que te sugiere olbeup te va a funcionar.

Saludos.:)

olbeup
11-05-2012, 08:39:47
Yo utilizo el QuickReport y cuando quiero imprimir en otra impresora sólo tengo que cambiar el valor de Printer.PrinterIndex := x o buscar la impresora por la cual quiero imprimir Printer.Printers.IndexOf('Nombre de la Impresora'), sino te imprime cuando cambias éste valor, algo te falta por cambiar, el Fast Report no es tan distinto de QuickReport a la hora de coger los parámetros de Printer y todo depende del valor que tenga el Printer.PrinterIndex, es tan sencillo cómo cambiar éste valor.

Cambia:
AIndex := Printer.Printers.IndexOf('HP PSC 750'); <--- Buscar la impresora por la que voy a imprimir

if (AIndex = -1) then
begin
ShowMessage('No se encuentra la impresora, o la impresora a cambiado de nombre');
Exit;
end;

Rep_Estudio.PrintOptions.ShowDialog := False;
if AIndex <> 0 then
begin
Printer.PrinterIndex := AIndex;
Rep_Estudio.PrintOptions.Printer := Printer.Printers[AIndex];
Rep_Estudio.PrepareReport();
Rep_Estudio.Print;
end;
Por esto:
AIndex := Printer.Printers.IndexOf('HP PSC 750'); <--- Buscar la impresora por la que voy a imprimir

if (AIndex = -1) then
begin
ShowMessage('No se encuentra la impresora, o la impresora a cambiado de nombre');
Exit;
end;

Rep_Estudio.PrintOptions.ShowDialog := False;
Printer.PrinterIndex := AIndex;
Rep_Estudio.PrepareReport();
Rep_Estudio.Print;


Tienes un error en, if AIndex <> 0 then ya que el valor puede ser 0 y le estas diciendo que si es distinto que 0 que imprima, el AIndex puede ser 0, tienes que poner que si es distinto que -1 para que funcione, pero eso ya te lo he puesto arriba.

Un saludo.

lbidi
11-05-2012, 14:59:14
Muchas gracias olbeup...

Problema solucionado y funcionando perfectamente.

Saludos.