home *** CD-ROM | disk | FTP | other *** search
/ Delphi Anthology / aDELPHI.iso / Runimage / Delphi50 / Demos / Quickrpt / Qr3 / mdrpt.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  5KB  |  150 lines

  1. { :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2.   :: QuickReport 3.0 for Delphi 3.0/4.0/5.0                  ::
  3.   ::                                                         ::
  4.   :: Master/Detail report with some extra code               ::
  5.   ::                                                         ::
  6.   :: Copyright (c) 1995-1999 QuSoft AS                       ::
  7.   :: All Rights Reserved                                     ::
  8.   ::                                                         ::
  9.   :: web: http://www.qusoft.com  fax: +47 22 41 74 91        ::
  10.   ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: }
  11. unit mdrpt;
  12.  
  13. interface
  14.  
  15. uses
  16.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  17.   QuickRpt, Qrctrls, Db, DBTables, ExtCtrls;
  18.  
  19. type
  20.   TfrmMasterDetail = class(TForm)
  21.     QuickRep1: TQuickRep;
  22.     DetailBand1: TQRBand;
  23.     dsCustomer: TDataSource;
  24.     qryCustomer: TQuery;
  25.     PageHeaderBand1: TQRBand;
  26.     QRDBText1: TQRDBText;
  27.     QRSysData1: TQRSysData;
  28.     QRSysData2: TQRSysData;
  29.     QRSubDetailOrders: TQRSubDetail;
  30.     qryOrders: TQuery;
  31.     QRDBText3: TQRDBText;
  32.     QRDBText4: TQRDBText;
  33.     dsOrders: TDataSource;
  34.     qryItems: TQuery;
  35.     QRSubDetailItems: TQRSubDetail;
  36.     QRDBText5: TQRDBText;
  37.     QRDBText2: TQRDBText;
  38.     QRDBText6: TQRDBText;
  39.     QRDBText7: TQRDBText;
  40.     QRDBText9: TQRDBText;
  41.     QRGroupCust: TQRGroup;
  42.     QRLabel1: TQRLabel;
  43.     QRLabel2: TQRLabel;
  44.     QRShapeGray: TQRShape;
  45.     QRLabel3: TQRLabel;
  46.     QRLabel4: TQRLabel;
  47.     QRLabel5: TQRLabel;
  48.     QRLabel6: TQRLabel;
  49.     QRDBOrderNo: TQRDBText;
  50.     QRDBSalesDate: TQRDBText;
  51.     GroupFooterBand1: TQRBand;
  52.     procedure QRSubDetailOrdersBeforePrint(Sender: TQRCustomBand;
  53.       var PrintBand: Boolean);
  54.     procedure QRSubDetailItemsBeforePrint(Sender: TQRCustomBand;
  55.       var PrintBand: Boolean);
  56.     procedure QRGroupCustBeforePrint(Sender: TQRCustomBand;
  57.       var PrintBand: Boolean);
  58.     procedure DetailBand1BeforePrint(Sender: TQRCustomBand;
  59.       var PrintBand: Boolean);
  60.     procedure QRSubDetailItemsAfterPrint(Sender: TQRCustomBand;
  61.       BandPrinted: Boolean);
  62.     procedure PageHeaderBand1BeforePrint(Sender: TQRCustomBand;
  63.       var PrintBand: Boolean);
  64.   private
  65.     { Private declarations }
  66.   public
  67.     { Public declarations }
  68.   end;
  69.  
  70. var
  71.   frmMasterDetail: TfrmMasterDetail;
  72.  
  73. implementation
  74.  
  75. {$R *.DFM}
  76.  
  77. procedure TfrmMasterDetail.DetailBand1BeforePrint(Sender: TQRCustomBand;
  78.   var PrintBand: Boolean);
  79. begin
  80.   // If there are no subdetails, then we print this band.  Otherwise we
  81.   // let the group header print the controls from this band.  Group bands
  82.   // can be reprinted on page breaks, which detail and subdetails can't do.
  83.   qryOrders.First;
  84.   PrintBand := qryOrders.EOF;
  85.  
  86.   // If it's our turn to print and the group band has our controls, then
  87.   // we take them back.
  88.   if PrintBand and (Sender.ControlCount = 0) then
  89.     with QRGroupCust do
  90.       while ControlCount > 0 do
  91.         Controls[0].Parent := Sender;
  92. end;
  93.  
  94. procedure TfrmMasterDetail.QRGroupCustBeforePrint(Sender: TQRCustomBand;
  95.   var PrintBand: Boolean);
  96. begin
  97.   // We grab the detail band fields right from under it.
  98.   if Sender.ControlCount = 0 then
  99.     with DetailBand1 do
  100.       While ControlCount > 0 do
  101.         Controls[0].Parent := Sender;
  102. end;
  103.  
  104. procedure TfrmMasterDetail.QRSubDetailOrdersBeforePrint(
  105.   Sender: TQRCustomBand; var PrintBand: Boolean);
  106. begin
  107.   // We are print the order information on the first item subdetail
  108.   // record.  If there are no item records, then we print the subdetail
  109.  
  110.   // Enable the order fields on the item subdetail band.  After they are
  111.   // printed once, they will be disabled until the next order/item set
  112.   QRDBOrderNo.Enabled := true;
  113.   QRDBSalesDate.Enabled := QRDBOrderNo.Enabled;
  114.  
  115.   // Only allow this band to print if there are no subdetails
  116.   qryItems.First;
  117.   PrintBand := qryItems.EOF;
  118. end;
  119.  
  120. procedure TfrmMasterDetail.QRSubDetailItemsBeforePrint(
  121.   Sender: TQRCustomBand; var PrintBand: Boolean);
  122. begin
  123.   // toggle the item background so that we can have alternating colors
  124.   // like the greenbar paper we all know and love.
  125.   with QRShapeGray.Brush do
  126.     if Color = $00F0F0F0 then
  127.       Color := $00E0E0E0
  128.     else
  129.       Color := $00F0F0F0;
  130. end;
  131.  
  132. procedure TfrmMasterDetail.QRSubDetailItemsAfterPrint(
  133.   Sender: TQRCustomBand; BandPrinted: Boolean);
  134. begin
  135.   // After we print it once, we disable the controls
  136.   QRDBOrderNo.Enabled := false;
  137.   QRDBSalesDate.Enabled := QRDBOrderNo.Enabled;
  138. end;
  139.  
  140. procedure TfrmMasterDetail.PageHeaderBand1BeforePrint(
  141.   Sender: TQRCustomBand; var PrintBand: Boolean);
  142. begin
  143.   // Re-enable the order fields on the item subdetail so that the order
  144.   // information will be repeated after a page break
  145.   QRDBOrderNo.Enabled := true;
  146.   QRDBSalesDate.Enabled := QRDBOrderNo.Enabled;
  147. end;
  148.  
  149. end.
  150.