stringgrid打印

本人初学DELPHI,而且完全是业余的,说法有不周之处请见谅。
06年12月底,应朋友之邀,给他作一个小软件,里面有表格浏览打印,当时考虑用stringgrid为载体。“别人经验是学习的最佳捷径”我首先就考虑到DFW和盒子、园子上去看看别人怎么说,遇到哪些问题?郁闷的是,DFW和盒子居然打不开,因为以前偶也遇之,可连续三天没上去,有点不知所措了,欣慰的是,我有DFW离线资料(以前的),还有园地可看,于是一头扎进去,stringgrid显示不好,改......文字对齐、排序、背景色、单元格选中色、合并,导出为WORD、EXCEL,全部搞定。这时考虑到,表格导出为WORD和EXCEL己实现,但也应该有个本身预览功能,不然朋友不装OFFICE不就惨了,这时stringgrid打印就提上来了,打印机直接打印、表格打印、报表打印等方法,我把有关资料调出来,开始一一探索。
首先是打印机直接打印,分辨率控制等常识下来,就是打印小边框RECTANGLE、再写字TEXTOUT方法常用,但没有预览功能,或用窗体PAINTBOX下来浏览,麻烦,于是作罢。
其次就考虑表格直接打印控件了,庆幸的是DFW和盒子通了,于是上去一番好找.....因本人只是学习,给别人也是帮忙,所以收费控件有限制的不考虑。发现Softgrid不错,特别是标题栏上的排序,没有我前面下的功夫,早就选它了..且慢,又发现一个Edustringgrid,单是演示,功能就相当不错了,我想到的功能它都有了,不过测试下来也有问题,首先是列多了以后提示退不出来,我看了源代码,有EXIT,但不知为什么没有退出,本人家里没装打印机,不能浏览,这些都是小问题,关键是有源代码,以后有空再研究一下,它有浏览打印功能,而且表格能自适应纸张宽度,好象也是PAINTBOX画的再打印,如果只是stringgrid打印,我觉得它是我搜索下来发现最好的表格控件了。但考虑到朋友可能还要在表格之外加上一些其它字,这就有点力不从心,改源代码太费事,暂缓。
最后就是报表,因为程序中也要用报表,所以能把stringgrid内容写到报表中,就是不错的想法,用什么报表呢,首先就是DELPHI7自带的RAVE,有动态写例子,发现画表格它太方便了 ,SETTAB、TAB下来就成了,但表格高度怎么控制,不会了,看DFW朋友也有这样的提问,但没发现答案,看FASTREPORT的贴子最多,神州行手机卡有句广告词“这就和吃饭一样,哪人多我去哪”我就把目标锁在FASTREPORT上了,在机子里装了2.53和3.25版的,下面是找资料测试,DFW上有KXY的一个FASTREPORT打印stringgrid的源码,在此基础上我进行了小部分改动,最后形成可执行代码如下:

function TFORM1.GridPrint(Grid1:TstringGrid;printRow,StyleType:integer;Title:string):boolean;//打印报表
var
 fr:TfrReport ;
  ReportTitle,ReportTitle1,
  ColumnHeader,PageHeader,pageFooter:Tfrbandview;   //栏目
  MemoVT,MemoVC:Array of TfrMemoview;             //列
  TitleV ,dateV,pageV:TfrMemoview ;
  lineV:TfrlineView;                     //线
  newpage:Tfrpage;                       //页
  GridRow,GridCol,CurrRow,I,J,col:integer;//总的行数,列数,当前行
  PageCount,pageRow:integer;                    //总共页数;
  RLeft,RTop,RWidth,RHeigth:integer;
  TempLeft,TempWidth:integer;
  printDate :string;
  BFOOT:Integer ;
begin
  screen.Cursor := crHourGlass;
  GridRow := Grid1.RowCount;
  GridCol := Grid1.ColCount;
  CurrRow :=0;
  pageRow := printRow;
 try
  fr := TfrReport.Create(Self);
  fr.StoreInDFM := True;
  PageCount := GridRow div printRow ; //计算出页数
  for I := 0 to PageCount  do
  begin
   Rleft  :=0;
   RTOP:=100;
   Rwidth :=656;
   Rheigth :=25;
   fr.Pages.Add;

   newpage := fr.Pages[i];

   newpage.pgSize :=13;  //13为  B5纸
 //  page.pgWidth :=656;
 //  page.pgHeight :=950;
 
   newpage.pgMargins:=Rect(20,20,20,20);
       //第一页增加标题;

    {标题栏}
    ReportTitle := Tfrbandview.Create;
    ReportTitle.BandType := btReportTitle;
    ReportTitle.SetBounds(Rleft,RTop,Rwidth,85);
    newpage.Objects.Add(ReportTitle);


    TitleV := TfrMemoview.Create;
    Titlev.SetBounds(RLeft,RTop+50,Rwidth,30);
    Titlev.Alignment := 2;//居中
    TitleV.Alignment :=frtaCenter;
    Titlev.Font.Name := '宋体';
    TitleV.Font.Size := 16;
    TitleV.Memo.Add(title);
    newpage.Objects.Add(TitleV);


     RTop:=rtop+85;  // 85控制标题与表格的距离,与上文的ReportTitle.SetBounds(Rleft,RTop,Rwidth,85)一致。
     ColumnHeader := Tfrbandview.Create;
     ColumnHeader.BandType := btColumnHeader;
     ColumnHeader.SetBounds(Rleft,RTop,Rwidth,RHeigth*pagerow);
     newpage.Objects.Add(ColumnHeader);

     SetLength(MemoVT,GridCol);
     TempLeft := 80;
     for col:= 0 to GridCol - 1 do
     begin
      MemoVt[col] := TfrMemoview.Create;
      MemoVt[col].Font.Name :='楷体_2312' ;
      MemoVt[col].Font.Size := 12;
      MemoVt[col].Memo.Add(Grid1.Cells[col,0]);
      MemoVT[col].Alignment:=2;
      MemoVT[col].gapy :=5;
      MemoVt[col].FrameTyp := StyleType;     //显示边框
      TempWidth := Grid1.ColWidths[col];    //宽度与Grid中的宽度一致
      MemoVt[col].SetBounds(tempLeft,Rtop,tempWidth,Rheigth);
      templeft := tempLeft + tempwidth;
      newpage.Objects.Add(MemoVt[col])
     end;

 
     for J:=0 to PageRow-1 do  //每页的行数
     begin
       Rtop := Rtop + Rheigth;
       CurrRow:=CurrRow+1;
       TempLeft := 80;
       SetLength(MemoVc,GridCol);
       for col :=0 to GridCol - 1 do
       begin
          MemoVc[col] := TfrMemoview.Create;
          MemoVc[col].Font.Name := '宋体';
          MemoVc[col].Font.Size := 11;
          MemoVc[col].Memo.Add(Grid1.Cells[col,CurrRow]);
          MemoVc[col].Alignment:=2;
          MemoVC[col].gapy :=5;
          MemoVc[col].FrameTyp := StyleType;     //显示边框
          TempWidth := Grid1.ColWidths[col];    //宽度与Grid中的宽度一致
          MemoVc[col].SetBounds(tempLeft,Rtop ,tempWidth,Rheigth);
          templeft := tempLeft + tempwidth;
          newpage.Objects.Add(MemoVc[col]);
      end;
     end;


    BFOOT:=200+RHeigth*pagerow;

    pageFooter :=TfrBandView.Create ;
    pageFooter.BandType :=btPageFooter ;
    pageFooter.SetBounds(RLeft,BFOOT,RWidth,RHeigth+50) ;
    newpage.Objects.Add(pageFooter);

    pageV := TfrMemoview.Create;
    pageV.Font.Name := '宋体';
    pagev.Font.Size := 10;
    pagev.Alignment := 2;//居中
    pageV.Memo.Add('- '+ inttostr(I + 1) + ' - ' );
    pagev.SetBounds(RLeft,BFOOT,RWidth,RHeigth);
    newpage.Objects.Add(pageV);

    if currRow >= GridRow then break;  
 END;
   screen.Cursor := crDefault;
   fr.PrepareReport  ;
   fr.ShowReport;

 finally
   fr.Free;
 END;  

end;
发现2.5版本上MEMO没有归属,创建之后靠TOP、HEIGHT控制(其实有父也是这样控制),我的想法就是创建一个 ColumnHeader ,数据全在它上面显示,就再数据显示BANDVIEW,列头与数据容易有空白。下面用3.20版测试:
function TForm1.GridtofrxPrint(Grid1: TstringGrid; printRow,
  StyleType: integer; Title: string): boolean;
var
  fr:TfrXReport ;
  ReportTitle,ColumnHeader,PageHeader,pageFooter:TfrxBand; //栏目
  MemoVT,MemoVC:Array of TfrXMemoview;             //列
  TitleV ,dateV,pageV:TfrXMemoview ;
  lineV:TfrXlineView;                     //线
  newpage:TfrxReportPage ;      //页
  currenpage:TfrxPage;

  GridRow,GridCol,CurrRow,I,J,col:integer;//总的行数,列数,当前行
  PageCount,pageRow:integer;                    //总共页数;
  RLeft,RTop,RWidth,RHeigth:integer;
  TempLeft,TempWidth:integer;
  printDate :string;
  BFOOT:Integer ;
  bk:TfrxFrameType;

begin
  screen.Cursor := crHourGlass;
  GridRow := Grid1.RowCount;
  GridCol := Grid1.ColCount;
  CurrRow :=0;
  pageRow := printRow;
  bk:=ftTop ;

 try
  fr :=TfrxReport.Create(Self);
  fr.StoreInDFM := True;
  PageCount := GridRow div printRow ; //计算出页数
 
 
  for I := 0 to PageCount  do
  begin
 
   RTOP:=80;
   Rheigth :=25;

   newpage:=TfrxReportPage.Create(fr);
   newpage.CreateUniqueName ; //唯一页面名称
//   PAGE.SetDefaults ;   //预定纸张大小
   newpage.PaperSize :=DMPAPER_B5 ;

   currenpage:=fr.Pages[i];

       //第一页增加标题;

   ReportTitle:=TfrxReportTitle.Create(currenpage);
   ReportTitle.CreateUniqueName ;
   ReportTitle.Height :=40;

   TitleV:=TfrxMemoView.Create(ReportTitle);
   TitleV.CreateUniqueName ;
   Titlev.Font.Name := '宋体';
   TitleV.Font.Size := 16;
   TitleV.Text := title;
   Titlev.Top :=rtop;
   TitleV.Height :=30;
   Titlev.HAlign :=haCenter ;
   Titlev.VAlign :=vaCenter;
   TitleV.Align:=baWidth ;

   //  RTop:=rtop+10;
     ColumnHeader:=TfrxColumnHeader.Create(currenpage);
     ColumnHeader.CreateUniqueName ;
     ColumnHeader.Top :=RTop;
     ColumnHeader.Height :=RHeigth*pagerow;


     SetLength(MemoVT,GridCol);
     TempLeft := 80;
     for col:= 0 to GridCol - 1 do
     begin
        TempWidth := Grid1.ColWidths[col];    //宽度与Grid中的宽度一致
        MemoVT[col]:=TfrxMemoView.Create(ColumnHeader) ;
        MemoVT[col].CreateUniqueName ;
        MemoVt[col].Font.Name :='楷体_2312' ;
        MemoVt[col].Font.Size := 12;
        MemoVt[col].SetBounds(tempLeft,Rtop,tempWidth,Rheigth);
        MemoVT[col].Text :=Grid1.Cells[col,0];
        MemoVT[col].HAlign :=haCenter ;
        MemoVT[col].VAlign :=vaCenter ;
        MemoVT[col].Frame.Style :=fsSolid ;
        MemoVT[col].Frame.Typ :=[ftLeft ,ftRight,ftTop,ftBottom ] ;

     


        templeft := tempLeft + tempwidth;
      end;


     for J:=0 to PageRow-1 do  //每页的行数
     begin
       Rtop := Rtop + Rheigth;
       CurrRow:=CurrRow+1;
       TempLeft := 80;
       SetLength(MemoVc,GridCol);
       for col :=0 to GridCol - 1 do
       begin
          MemoVc[col] := TfrXMemoview.Create(ColumnHeader);
          MemoVC[col].CreateUniqueName ;
          MemoVc[col].Font.Name := '宋体';
          MemoVc[col].Font.Size := 11;
          MemoVc[col].Text :=Grid1.Cells[col,CurrRow];
          TempWidth := Grid1.ColWidths[col];    //宽度与Grid中的宽度一致
          MemoVc[col].SetBounds(tempLeft,Rtop ,tempWidth,Rheigth);
          MemoVc[col].Frame.Style :=fsSolid ;
          MemoVc[col].Frame.Typ :=[ftLeft ,ftRight,ftTop,ftBottom ] ;

          MemoVc[col].HAlign :=haCenter ;
          MemoVc[col].VAlign :=vaCenter ;
          templeft := tempLeft + tempwidth;

       end;
     end;




    pageFooter :=TfrxPageFooter.Create(currenpage );
    pageFooter.CreateUniqueName ;
    pageFooter.Height :=Rheigth+50;

    pageV := TfrXMemoview.Create(pageFooter);
    pageV.Font.Name := '宋体';
    pagev.Font.Size := 10;
    pageV.Text := '第'+ inttostr(I + 1) + '页 (共' + inttostr(PageCount) + '页)';

    pageV.Height :=Rheigth;
  //pageV.Top :=0 ;
    pageV.HAlign :=haCenter ;
   pageV.VAlign :=vaCenter ;
    pageV.Align:=baWidth ;
   
    if currRow >= GridRow then break;

 END;
   screen.Cursor := crDefault;
   fr.ShowReport;
  finally
    fr.Free ;
  end ;  

end;

你可能感兴趣的:(String)