PDA

Ver la Versión Completa : Seleccion impresora en rave y word


nfrfabian
25-09-2007, 18:29:16
Hola, tengo un problema que no pude solucionar y quisiera sus consejos. Mi problema es el siguiente: Utilizo Rave Report para imprimir unas consultas a una base de datos. la impresion la tengo que realizar en 2 impresoras distintas. Tambien utilizo word para imprimir un documento al que le paso unos datos variables (mediante campos), en este caso tambien tengo que imprimir en dos impresoras distintas.
Buscando en el foro encontre la forma de seleccionar la impresora de una lista, tambien pude grabar las selecciones en un archivo para que al inicio de la aplicacion se carguen las impresoras en la que se deben imprimir en cada caso, pero a la hora de imprimir siempre imprime en la impresora por defecto.
Las intrucciones que utilizo son las siguientes:

Para cargar en un combo las impresoras disponibles:

for i := 0 to Printer.Printers.Count-1 do begin
Printer.PrinterIndex := i;
Printer.GetPrinter(Device, Driver, Port, hDMode);
combocertificado.Items.Add(Device);
comboresto.Items.Add(Device);
comborespaldo.Items.Add(Device);
end;


Despues de seleccionar la impresora, guardo en un archivo todas las selecciones necesarias.
Al iniciar la aplicacion cargo en una variable global la impresora por defecto:

gindiceprinterdefault := printers.printer.printerindex;




Despues verifico que las impresoras que se grabaron en el archivo esten disponibles:


// vnombreimpresora es una variable con el nombre de la impresora que se grabo en el archivo
index := Printer.Printers.IndexOf(vnombreimpresora );
if index > -1 then
begin
gindiceprintercertificado := index;
end
else
begin
gindiceprintercertificado := gindiceprinterdefault;

end;

// vnombreimpresora2 es una variable con el nombre de la impresora que se grabo en el archivo
index := Printer.Printers.IndexOf(vnombreimpresora );
if index > -1 then
begin
gindiceprinterrespaldo:= index;
end
else
begin
gindiceprinterrespaldo := gindiceprinterdefault;

end;




Despues se suponia que cuando tenga que imprimir selecciono la impresora que corresponda:


Printer.PrinterIndex := gindiceprintercertificado;
//o
Printer.PrinterIndex := gindiceprinterrespaldo;



Me parece que el error al final porque al ser el Rave Report o Microsoft WORD programas externos, ellos no reciben el indice de la impresora que necesito.
En una parte vi que existe una forma de pasarle la impresora seleccionada a otro generador de reportes:


QuickRep1.PrinterSettins.PrinterIndex := nImpCocina;


Pero ninguno de los componentes de rave report tienen una propiedad para asignarle el indice de la impresora (o yo no lo encuentro). Los componentes que utilizo son:
RvSystem1
RvProject2
RvDataSetConnectioncronorespal
En este caso el componente RvSystem1, tiene para elegir el numero de copias, la pagina inicial, y otras propiedades, pero ninguna para indicarle el inice de la impresora a utilizar.


Para imprimir con MS Word utilizo lo siguiente:

const
wdFindContinue = 1;
wdReplaceOne = 1;
wdReplaceAll = 2;
wdDoNotSaveChanges = 0;
var
gWord: OLEVariant;
document, Documento: Variant;

begin
...
path := ExtractFilePath(Application.ExeName);
path := path + 'CARPETA\archivo.doc';
Printer.PrinterIndex := gindiceprintercertificado;
gWord := CreateOLEObject('Word.Application');
gWord.Documents.Add(path);
Documento := gWord.Documents.Item(1);
Documento.Variables.Add('nombre', nombre);
Documento.Variables.Add('diaspa', nombreservicio);
Documento.Variables.Add('p', cantcli);
Documento.Variables.Add('n', certificado);
Documento.Variables.Add('v', vencimiento);
Documento.Variables.Add('f', factura);
Documento.Fields.Update;
documento.Fields.ToggleShowCodes;
Document := gWord.ActiveDocument;

Document.PrintOut(false);
gWord.ActiveDocument.Close(wdDoNotSaveChanges);
...



Sinceramente nose donde esta el error (solo la sospecha de que tengo que pasarle el indice de la impresora seleccionada tanto a rave report como a word). Las variables que utilizo tiene datos correctos (las tres variables son distintas: gindiceprinterdefault, gindiceprintercertificado, gindiceprinterrespaldo).
Si me puede ayudar se los voy agradecer, hace dos dias que estoy con esto y no puedo resolverlo. Gracias.

nfrfabian
26-09-2007, 13:30:09
Hola de nuevo. Les comento que encontre la solucion a mis problemas, seguro no son las mejores pero funcionan. Por si alguien tiene un problema similar les dejo la forma en que lo hice.
En rave en el evento RvSystemBeforePrint puse la instruccion que cambia el indice de la impresora que necesito:

procedure Tfrespaldo.RvSystem1BeforePrint(Sender: TObject);
begin
RvSystem1.BaseReport.PrinterIndex := gindiceprinterrespaldo;
end;

De esta forma funciona bien pero deja como predeterminada en rave a la impresora elegida, no puede dejarla con la impresora anterior, esto me obliga a tener que elegir la impresora siempre ya sea la que yo quiero o la predeterminada. Si alguien sabe como dejarla con la impresora original seria mucho mejor. Por lo pronto quedara de esta forma.

En cuanto a word, la solucion la saque de la pagina de microsoft, la solucion es la ideal porque la impresora seleccionada sirve para el documento:


word.WordBasic.fileprintsetup(printer := 'nombre imprsora',DoNotSetAsSysDefault := 1);


Si alguien tiene una solucion para rave se lo voy a agradecer.

FGarcia
26-09-2007, 17:10:21
Hola! y no te serviria igual el evento AfterPrint? Es decir Antes de Imprimir (BeforePrint) Cambias el indice de la impresora y Despues de Imprimir (AfterPrint) lo vuelves al original.