Ver Mensaje Individual
  #7  
Antiguo 20-12-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Reputación: 0
coso Va por buen camino
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:

Código Delphi [-]

//
//   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.
Responder Con Cita