Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Impresora Pre-Definida con FR (https://www.clubdelphi.com/foros/showthread.php?t=78690)

lbidi 09-05-2012 20:03:42

Impresora Pre-Definida con FR
 
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.

Código Delphi [-]

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

Cita:

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:
Código Delphi [-]
...
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

Cita:

Empezado por lbidi (Mensaje 432249)
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.

Código Delphi [-]

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
Código Delphi [-]
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.
Cita:

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:
Código Delphi [-]
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:
Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 16:23:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi