FreeFoxCM

BCB6定义自己的报表预览窗体
 Borland   C++   Builder是基于C++语言的可视化编程环境,它提供了可重用组件库和一系列RAD设计工具,使得编程者只需用少量的手工代码就可以创建出高效的Windows应用程序,尤其是复杂的数据库访问应用程序,因此深受软件开发人员的喜爱。    
  在开发数据库访问应用程序时,会经常涉及到报表的打印问题。C++   Builder中提供了Quick   Report(快速报表)组件供编程人员设计报表。Quick   Report是挪威的QuSoft   AS公司专门为C++   Builder设计的用于制作报表的一组控件,在C++   Builder中关于Quick   Report的帮助文档不是很详细。另外它与C++   Builder的其他控件的风格也不太一致。直接使用Quick   Report的报表预览功能总是不能达到令人满意的效果,因此有必要自定义快速报表的预览窗口。    
  设置预览窗口    
  新建工程,在Form1窗体上添加一个ToolBar控件,并在其上添加以下按钮:“打印”、“打印设置”、    
  “上一页”   、“下一页”、“放大”、“缩小”和“关闭”。   在Form1窗体上添加一个Panel控件,对齐方式设为alBottom,再在此Panel控件上添加一个ProgressBar控件(对齐方式设为alLeft)和一个Panel控件(Name   为Panel2,对齐方式设为alRight,BevelOuter设为bvLowered),这两个控件分别用来显示报表装载进度和其他提示信息。在Form1窗体上添加一个QRPreview控件,对齐方式设为alClient。  
       
  再新建一个窗体,设其Name为Form2,   在该窗体上添加TQuickRep控件,设其Name为QuickRep1,其PrinterSetting中的Units属性设为mm(以毫米为计量单位),然后建立报表。    
  编程实现    
  1.在Form2上选择QuickRep1,在其事件中选择OnPreview,输入以下代码:    
  Form1-
>QRPreview1->QRPrinter=Form2->QuickRep1->QRPrinter;    
  
2.在Form1的头文件中找到对象TForm1的定义,在其中添加以下的代码:    
  
int   OldPaperSize;    
  
int   OldOrientation;    
  
int   OldTop;    
  
int   OldBottom;    
  
int   OldLeft;    
  
int   OldRight;    
  
void   RefreshPanel();    
  
3.选择Form1的Activate事件,输入以下代码:    
  
//初始化    
  OldPaperSize=Form2->QuickRep1->Page->PaperSize;    
  OldOrientation
=Form2->QuickRep1->Page->Orientation+1;    
  OldLeft
=Form2->QuickRep1->Page->LeftMargin*100;    
  OldRight
=Form2->QuickRep1->Page->    
  RightMargin*
100;    
  OldTop
=Form2->QuickRep1->Page->Top    
  Margin*
100;    
  OldBottom
=Form2->QuickRep1->Page->    
  BottomMargin*
100;    
  Form2-
>QuickRep1->Prepare();    
  RefreshPanel();    
  Form2-
>QuickRep1->Preview();    
  
4.在Form1中添加更新提示代码:    
  
void   TForm1::RefreshPanel()    
  
{   //更新提示信息    
  Panel2->Caption=“第”+IntToStr(Form1->QRPreview1->PageNumber)+“页”+“共”   +   IntToStr(Form2->QuickRep1->PageNumber)+“页”;    
  }
    
  
5.从Form1中选择QRPreview1,在其事件中选择OnProgressUpdate,输入以下代码:    
  
//显示报表装载进度    
  ProgressBar1->Position=Progress;    
  RefreshPanel();    
  
6.打印:    
  Form2-
>QuickRep1->Print();    
  
7.打印设置:    
  DEVMODE   *pDev;    
  LPPAGESETUPDLG   mylp
=new   PAGESETUPDLG;    
  memset((
void   *)mylp,0,sizeof    
  (PAGESETUPDLG));    
  mylp-
>lStructSize=sizeof(PAGESETUPDLG);    
  mylp-
>hwndOwner=this>Handle;    
  mylp-
>Flags=PSD_RETURNDEFAULT;    
  PageSetupDlg(   mylp   );    
  
if   (mylp->hDevMode!=NULL){    
   pDev
=(DEVMODE   *)GlobalLock(mylp->hDevMode);    
   pDev-
>dmPaperSize   =OldPaperSize;    
   pDev-
>dmOrientation   =OldOrientation;    
   mylp-
>rtMargin.left   =OldLeft;    
   mylp-
>rtMargin.right   =OldRight;    
   mylp-
>rtMargin.top   =OldTop;    
   mylp-
>rtMargin.bottom=OldBottom;    
   GlobalUnlock(mylp-
>hDevMode);    
  mylp-
>Flags=PSD_MARGINS|    
  PSD_INHUNDREDTHSOFMILLIMETERS;    
   
if(PageSetupDlg(mylp)){    
    pDev
=(DEVMODE   *)GlobalLock    
  (mylp-
>hDevMode);    
    OldPaperSize   
=pDev->dmPaperSize;    
  
if(OldPaperSize>28)OldPaperSize=9;//A4    
  OldOrientation=pDev->dmOrientation;    
  OldLeft   
=mylp->rtMargin.left;    
  OldRight   
=mylp->rtMargin.right;    
  OldTop   
=mylp->rtMargin.top;    
  OldBottom   
=mylp->rtMargin.bottom;    
  Form2-
>QuickRep1->Page->Orientation   =OldOrientation-1;    
  Form2-
>QuickRep1->Page->PaperSize      
  
=OldPaperSize;    
  Form2-
>QuickRep1->Page->LeftMargin   =OldLeft/100;    
  Form2-
>QuickRep1->Page->RightMargin   =OldRight/100;    
  Form2-
>QuickRep1->Page->TopMargin   =OldTop/100;    
  Form2-
>QuickRep1->Page->Bottom    
  Margin
=OldBottom/100;    
   GlobalUnlock(mylp-
>hDevMode);    
  }
    
   GlobalFree(mylp-
>hDevMode);    
   }
    
  delete   mylp;    
  QRPreview1-
>PageNumber=1;    
  Form2-
>QuickRep1->Prepare();    
  Form2-
>QuickRep1->Preview();    
  
8.向上翻页:    
  
//上一页    
  if(QRPreview1->PageNumber   >   1)    
   QRPreview1-
>PageNumber--;    
  RefreshPanel();    
  
9.向下翻页:    
  
//下一页    
  if(QRPreview1->PageNumber   <   Form2->    
  QuickRep1-
>PageNumber)    
  QRPreview1-
>PageNumber++;    
   RefreshPanel();    
  
10.放大处理:    
  
//放大    
  if(QRPreview1->Zoom<   200)    
   QRPreview1-
>Zoom+=5;    
  
11.缩小处理:    
  
//缩小    
  if(QRPreview1->Zoom>5)    
   QRPreview1-
>Zoom-=5;    

  小   结    
  该方法的核心是使用了Win32   API函数PageSetupDlg(),利用该函数可以获取页面设置的缺省值,包括纸张大小、打印方向以及上下左右空白边的大小等,也可以弹出页面设置对话框来修改这些值。

posted on 2008-06-17 14:42  FreeFox  阅读(347)  评论(0)    收藏  举报