PDA

Ver la Versión Completa : QuickReport Aplicar cambios de Impresion


Lepe
19-12-2010, 10:01:41
Hola, largo tiempo sin comentar por aqui :(. La razón es cambio de trabajo, horarios, hábitos, dejar de fumar jejeje...

bueno, al grano que me pierdo y creo este post será interminable:

Estamos en la vista preliminar de un QuickReport 4.05 con D7 y damos a PrinterSetup, cambiamos la bandeja de entrada y al pulsar el botón imprimir pasa 3 kilos de nosotros y lo hace por la que estaba configurada antes de los cambios.

Parece que la única forma es modificando los valores por defecto de la impresora (para todo windows) cosa que no podemos hacer en este caso.


Si sabes cómo solucionar esto, obvia el resto de mis divagaciones y por favor contesta cómo se procede para que QuickReport aplique los cambios realizados sea cual sea el modelo de la impresora.


Divagaciones a grandes rasgos:

Hasta donde he podido ver, toda impresora tiene dos partes, la pública con las propiedades típicas de toda impresora y otra zona privada donde tiene esas características propias que solo ella tiene, como posibilidad de elegir la bandeja de entrada y salida de documentos, impresión de sobres, etc.

Según he probado, una vez llamas a quickReport.PriterSetup y modificas algo, se lanza el evento OnApplySettings del QuickReport y allí obtenemos por parámetros una variable DevMode que contiene la declaración pública (y supongo que privada) de la Impresora, de hecho, los cambios ya están aplicados en ese DevMode, pero no sé qué hacer con él.
Una vez traducido a delphi este código (lo siento, no tengo a mano el código traducido):
http://support.microsoft.com/kb/167345

no funciona jejeje, es decir, no hay violaciones de acceso a memoria ni ninguna excepción, simplemente no atiende a los cambios.
Lo que he hecho es imprimir con PDFCreator y en la vista preliminar uso PrinterSetup para cambiar dos parámetros:
- orientación de página a apaisado
- impresión solo en blanco y negro

Obtengo un PDF en color con el folio en apaisado jejeje, según entiendo QuicReports está aplicando las propiedades de la zona pública (el apaisado) pero no así las privadas (impresión en blanco y negro). Debo decir que desde Microsoft Office, si uso el PDFCreator con las mismas opciones, obtengo el PDF en apaisado y en escala de grises, por ende, es cosa de mi programa y/o QuickReport.


A ver si alguien ha estudiado este tema y damos con la tecla...yo seguiré buscando.

Muchas gracias por vuestro tiempo.

ElKurgan
19-12-2010, 12:06:30
En este hilo (http://www.clubdelphi.com/foros/showthread.php?t=69242)se habló de algo parecido. Espero que te sirva

Un saludo

Lepe
19-12-2010, 13:25:03
Gracias por tu pronta respuesta ElKurgan, aunque no es exactamente lo mismo.

Intuyo que usar quickReport.qrprinter.PrintSetup (o lo que es lo mismo: quickReport.PrinterSetup) era mejor que usar un PrintDialog, porque hasta donde entiendo el quickReport debería aplicar los cambios a la impresora, es más, creo que para eso tiene el evento OnApplySettings.

Ya he rascado bastante, pero de momento obtengo el "sigue buscando", jejeje.

Saludos.

Casimiro Notevi
19-12-2010, 13:57:52
En otros generadores de informes creo que basta con seleccionar la nueva impresora en la configuración del informe, supongo, seguro, que eso es algo que has hecho.


p.d. y se te saluda... espero que los cambios hayan sido para bien, al menos lo de dejar de fumar ya es un logro muy importante, si eres de los que fumaban un paquete diario a ¿3 euros el paquete? son 90 euros al mes, por 12 meses= 1080 euros al años. con eso te vas un mes de viaje cada año a casi cualquier lugar del mundo :D

marcoszorrilla
19-12-2010, 14:14:04
En el peor de los casos, puedes probar a duplicar la impresora, es decir instalar en el sistema la misma con otro nombre, darle a esta Nueva_Y_Duplicada, esas propiedades y luego símplemente elegirla a la hora de imprimir.

Me alegro que hayas dejado de fumar.

Un Saludo.

coso
20-12-2010, 16:26:52
Hola Lepe de nuevo,
una vez me pelee tambien con este tema. Creo que lo solucione asignando QRPreview.Printer = printer.ItemIndex, QRReport.Printer := printer.ItemIndex, poniendo el papel manualmente tambien a las dos printers, y despues usar ApplySettings tambien en las dos printers. No recuerdo bien bien como iba, lo siento :(, pero fue un mareo usando estas tres cosas (el orden en que lo asignabas, por ejemplo, afectaba) Si encuentro el codigo fuente lo pongo (ahora uso freereports de fastreports). Al final con paciencia y probando lo consegui. Suerte!

coso
20-12-2010, 16:40:57
Lo encontre! te lo dejo tal cual. Era un form que hacia de preview con las opciones de canviar tamaño y esas cosas. Te lo dejo tal cual por si te sirve algo mas:



//
// 12/01/09 : repform. Custom preview del quickreport
//
//

unit repform;

interface

uses Windows, Dialogs, Menus, Controls, ExtCtrls, ComCtrls,
StdCtrls, Classes, Forms, QRPrntr, QuickRpt, db, sysutils, UText,
FPanel;

type TTipusPreview = (tpPreview,tpPreviewModal);

type THKQRPreview = class(TQRPreview);
type THKPreviewImage = class(TQRPreviewImage);

type TReportForm = class(TForm)
ppMenu: TPopupMenu;
saveto: TMenuItem;
loadfrom: TMenuItem;
printsetup: TMenuItem;
print: TMenuItem;
printtoXLS: TMenuItem;
SaveDialog: TSaveDialog;
OpenDialog: TOpenDialog;
N1: TMenuItem;
procedure Preview;
procedure FormResize(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
procedure pagnavClick(Sender: TObject; Button: TUDBtnType);
procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
procedure lbPrintReact(Sender: TObject);
procedure Initialize;
procedure SetDefault;
procedure FormShow(Sender: TObject);
procedure QRPreviewEndDrag(Sender, Target: TObject; X, Y: Integer);
procedure QRPreviewStartDrag(Sender: TObject;var DragObject: TDragObject);
procedure QRPreviewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure QRPreviewMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure lbCopiesReact(Sender: TObject);
procedure lbPrintToPDFReact(Sender: TObject);
procedure lbPageReact(Sender: TObject);
procedure lbZoomToFitReact(Sender: TObject);
procedure lbZoomToWidthReact(Sender: TObject);
private
copies : integer;
savex,
savey : integer;
tipuspreview : TTipusPreview;
procedure PreparaEstildePagina;
public
Report : TQuickRep;
constructor Create(AOwner : TComponent); override;
procedure PreviewModal; overload;
procedure PreviewModal(r : TQuickRep; d : TDataSet; c : string); overload;
end;

var ReportForm: TReportForm;

implementation

{$R *.DFM}

uses printers, global;

constructor TReportForm.Create(AOwner : TComponent);
begin
inherited Create(AOwner);

doublebuffered := true;
QRPreview.Doublebuffered := true;

// assignem procedures per moure
THKPreviewImage(QRPreview.PreviewImage).SetDragMode(dmAutomatic);
THKPreviewImage(QRPreview.PreviewImage).DragCursor := crHandPoint;
THKPreviewImage(QRPreview.PreviewImage).OnStartDrag := QRPreviewStartDrag;
THKPreviewImage(QRPreview.PreviewImage).OnEndDrag := QRPreviewEndDrag;
THKPreviewImage(QRPreview.PreviewImage).OnDragOver := QRPreviewDragOver;

// assignem valors per defecte
SetDefault;
end;

procedure TReportForm.Initialize;
var
bo : TBookMark;
begin
// desabilitem controls del dataset
if Report.DataSet <> nil then
begin
Report.DataSet.DisableControls;

// salvem posicio inicial
bo := Report.DataSet.GetBookMark;
end;

// desassociem el qrpreview
QRPreview.QRPrinter := nil;

// s'ha de provar si funciona
Report.PrinterSettings.Orientation := Report.Page.Orientation;
Report.PrinterSettings.PaperSize := Report.Page.PaperSize;
Report.PrinterSettings.Title := Caption;

// preparem informe
try Report.Prepare;
except ShowMessage('Papel not supported by printer');
end;

// asignem qrpreview a l'impresió del report
QRPreview.QRPrinter := Report.QRPrinter;
QRPreview.ZoomToFit;

// Report.PrinterSettings.ApplySettings(Report.QRPrinter);
// Report.PrinterSettings.ApplySettings(QRPreview.QRPrinter);

// s'espera fins que estigui el document preparat
while QRPreview.QRPrinter.status <> mpFinished do;

// com que el quickrep fa coses rares, deixem aquesta linea
if QRPreview.QRPrinter.Status <> mpFinished then exit;

// posem numero actual i total de pagina
lbPag.Caption := Format('%d/%d',[QRPreview.PageNumber,QRPreview.QRPrinter.PageCount]);

// només visible si si hi han més d'una pagina
pagnav.Visible := QRPreview.QRPrinter.PageCount > 1;

// del dataset, tornem al registre inicial
if Report.DataSet <> nil then
begin
try Report.DataSet.GotoBookMark(bo);
except Report.DataSet.First;
end;

// alliberem bookmark
Report.DataSet.FreeBookMark(bo);

// activem de nou els controls
Report.DataSet.EnableControls;
end;
end;

procedure TReportForm.FormResize(Sender: TObject);
begin
// zoom to fit
QRPreview.ZoomToFit;
end;

procedure TReportForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
27 : begin modalresult := mrCancel; close; end;
end;
end;

procedure TReportForm.pagnavClick(Sender: TObject; Button: TUDBtnType);
begin
// pasem d'una fulla a una altre
if Button = btNext then QRPreview.PageNumber := QRPreview.PageNumber + 1
else QRPreview.PageNumber := QRPreview.PageNumber - 1;

QRPreviewPageAvailable(sender,0);
end;

procedure TReportForm.QRPreviewPageAvailable(Sender: TObject;
PageNum: Integer);
begin
// evitem l'excepció del pagecount
if QRPreview.QRPrinter.Status <> mpFinished then exit;

// posem nº de fulles
lbPag.Caption := Format('%d/%d',[QRPreview.PageNumber,QRPreview.QRPrinter.PageCount]);
end;

procedure TReportForm.lbPrintReact(Sender: TObject);
var
i : integer;
begin
// Aquesta linea en teoria es necesaria, però sense ella va bé
// Report.PrinterSettings.ApplySettings(Report.QRPrinter);

for i := 0 to Copies -1 do
Report.Print;
end;

procedure TReportForm.FormShow(Sender: TObject);
begin
Width := 650;
Height := 400;

Initialize;
end;

procedure TReportForm.QRPreviewStartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
// guardem posicio
savex := Mouse.CursorPos.x;
savey := Mouse.CursorPos.y;
end;

procedure TReportForm.QRPreviewDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
// només si inici = QRPreview
Accept := (Source = QRPreview) or (Source = QRPreview.PreviewImage);
end;

procedure TReportForm.QRPreviewEndDrag(Sender, Target: TObject; X,
Y: Integer);
begin
// movem
QRPreview.PreviewImage.Left := QRPreview.PreviewImage.Left + (Mouse.cursorpos.x-savex);
QRPreview.PreviewImage.Top := QRPreview.PreviewImage.Top + (Mouse.CursorPos.y-savey);

QRPreview.Enabled := true;
end;

procedure TReportForm.SetDefault;
begin
lbcopies.Caption := 'Còpies (1)';
Copies := 1;
end;

procedure TReportForm.QRPreviewMouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
var Handled: Boolean);
begin
// aquest codi no funciona si num_pagines = 1
QRPreview.Zoom := QRPreview.Zoom + (WheelDelta div (abs(WheelDelta)))
end;

procedure TReportForm.PreviewModal;
begin
// preview modal
tipuspreview := tpPreviewModal;
ShowModal;
end;

procedure TReportForm.PreviewModal(r : TQuickRep; d : TDataSet; c : string);
begin
report := r;
report.DataSet := d;
Caption := c;

case Report.Page.PaperSize of
A4 : lbPage.ItemIndex := 0;
A5 : lbPage.ItemIndex := 1;
end;

PreviewModal;
end;

procedure TReportForm.Preview;
begin
// preview
tipusPreview := tpPreview;
Show;
end;

procedure TReportForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// preview s'ha de crear a runtime
if tipuspreview = tpPreview
then release;
end;

procedure TReportForm.lbCopiesReact(Sender: TObject);
begin
Copies := IntegerIn('Còpies',inttostr(copies));
(sender as TUText).Caption := 'Còpies ('+inttostr(copies) +')';
end;

procedure TReportForm.lbPrintToPDFReact(Sender: TObject);
var
ant,
idx : integer;
begin
// impresió a pdf: escollim Cute PDF com a predeterminada, imprimim, restaurem
ant := Report.PrinterSettings.PrinterIndex;
idx := Printer.Printers.IndexOf('CutePDF Writer');
if idx < 0 then
MessageDLG('Es necesita tenir instal·lat Cute PDF Writer per a imprimir a .PDF. Es pot trobar a http://www.cutepdf.com',mtError,[mbOk],0)
else
begin
Report.PrinterSettings.PrinterIndex := idx;
lbPrint.React;
end;
Report.PrinterSettings.PrinterIndex := ant;
end;

procedure TReportForm.PreparaEstildePagina;
begin
case lbPage.ItemIndex of
0 : begin
Report.Page.PaperSize := A4;
Report.Page.Orientation := poPortrait;
Report.PrinterSettings.PaperSize := A4;
Report.PrinterSettings.Orientation := poPortrait;
end;
1 : begin
Report.Page.PaperSize := A5;
Report.Page.Orientation := poLandscape;
Report.PrinterSettings.PaperSize := A5;
Report.PrinterSettings.Orientation := poLandscape;
end;
end;

try Report.Prepare;
except ShowMessage('L''impresora no reconeix aquest tipus de paper.');
end;

QRPreview.QRPrinter := Report.QRPrinter;
Report.PrinterSettings.ApplySettings(Report.QRPrinter);
Report.PrinterSettings.ApplySettings(QRPreview.QRPrinter);
QRPreview.ZoomToFit;

pagnav.Visible := QRPreview.QRPrinter.PageCount > 1;
end;

procedure TReportForm.lbPageReact(Sender: TObject);
begin
PreparaEstildePagina;
end;

procedure TReportForm.lbZoomToFitReact(Sender: TObject);
begin
QRPreview.ZoomToFit;
end;

procedure TReportForm.lbZoomToWidthReact(Sender: TObject);
begin
QRPreview.ZoomToWidth;
end;

end.


un saludo y a ver si te sirve.

Lepe
21-12-2010, 09:43:19
Muchas gracias coso, la verdad me tenía mareado varios días antes de preguntar en el foro, ya había buscado en las msdn, foros qusoft, google, además de haber hecho multitud de pruebas.

Me pongo a probarlo ya mismo :).

Un saludo a todos.