⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unmakereportdetail.pas

📁 本产品是开发LISTVIEW相关功能的可定制产品
💻 PAS
📖 第 1 页 / 共 5 页
字号:
function TMakeReportDetail.DoAllPreview(fReportFormName:TForm;lSourceListView:TListView;sReportName,sDataBaseName,sSessionName,ReportFormTitle,UnitCaption,ReportCaption,sStaffName:string;PrintDate:TDate;PaperSize:TQRPaperSize;MemoData:TMemo;sStringGrid:TStringGrid):Integer;
begin
//参数初始化及赋值
  result:=0;
  PrintColumnNum:=0;
  ReportForm:=fReportFormName;
  ReportFormName:=ReportForm.Name;
  ReportName:=sReportName;
  DataBaseName:=sDataBaseName;
  SessionName:=sSessionName;
  SourceListView:=lSourceListView;
  GetColumnDefineFromTable;//取得打印数据
  if(PrintColumnNum=0)then exit;//无打印列退出
  if SourceListView.Items.Count <= 0 then exit;//无打印行退出
  ReportDataSet :=GetDataSetFromListview; //从SOURCELISTVIEW中取各行数据到ReportDataSet中
  try
     FrmUniversalReport := TFrmReport.Create(nil);
  except//创建打印窗体异常处理
      ReportDataSet.Close;
      ReportDataSet.Free;
      ReportDataSet:=nil;
      Showmessage('请检查打印机是否有效且可用!');
      Exit;
  end;
  with FrmUniversalReport do
  begin
      Caption:=ReportFormTitle;
      FrmUnitName1.Caption:=UnitCaption;
      FrmUnitName2.Caption:=UnitCaption;
      FrmReportCaption.Caption:=ReportCaption;
      FrmPrintDate1.Caption:=Datetostr(PrintDate);
      FrmPrintDate2.Caption:=FrmPrintDate1.Caption;
      QRLabel11.Caption:='制表人:'+sStaffName;
      PrintReport.Page.PaperSize:=PaperSize;//////////打印纸张选择
      If PrintModal=0 then
         PrintReport.Page.Orientation:=poPortrait///////////打印模式选择
      else
         PrintReport.Page.Orientation:=poLandscape;///////////
//各元素打印位置确定
      FrmReportCaption.Left:=((ChildBand1.Width-FrmReportCaption.Width) div 2);
      FrmPrintDate1.Left:=ChildBand1.Width+ChildBand1.Left-160;
      FrmPrintDate2.Left:=ChildBand1.Width+ChildBand1.Left-150;
      FrmMemo.Left:=ChildBand1.Width+ChildBand1.Left-500;
      QRSysData2.Left:=(ChildBand1.Width div 2)+ChildBand1.Left-70;
      QRLabel11.Left:=ChildBand1.Width+ChildBand1.Left-250;
      QRShape1.Width:=arbStatics.Width-24;
      if MemoData<>nil then//备注信息显示
         FrmMemo.lines:=MemoData.lines;
      PrintReport.Bands.HasColumnHeader := True;//需要打印明细域
      PrintReport.Bands.HasDetail := True;
      MakeDetailBand;                   //创建明细数据打印
      MakeTotalBand(sStringGrid);       //创建汇总数据打印
      if printer.Printers.Count <> 0 then
          PrintReport.PreviewModal   //打印域览
      else
          Application.MessageBox('没有缺省打印机!,请添加打印机后重试。','系统提示',MB_ok);
      ReportDataSet.Close;//内存释放
      ReportDataSet.Free;
      ReportDataSet:=nil;
  end;
  FrmUniversalReport.Close;//内存释放
  FrmUniversalReport.Free;
  FrmUniversalReport:=nil;
  result:=999;
end;

//该函数的目的是将SourceListView中的数据按照用户选择的打印字段及次序取到TClientDataSet中
function  TMakeReportDetail.GetDataSetFromListview: TClientDataSet;
var
  I,j,k :Integer;
begin
  Result := TClientDataSet.Create(nil);
  Result.ReadOnly := False;
  Result.Close;
  with Result.FieldDefs do
  begin
//为定制报表,需要用户在窗体初始化时创建一个TListViewColumn型数组并填充如下内容
    i:=0;
    while i<PrintColumnNum do
    begin
        Add(ColumnDefine[i].ColumnName, ftString, ColumnDefine[i].Width*8);
        i:=i+1;
    end;
    Result.CreateDataSet;
    for i := 0 to SourceListView.Items.Count - 1 do//实际要打印的行
    begin
        Result.Append;
        for j := 0 to PrintColumnNum-1 do//实际要打印的列
        begin//填充一行的每一列
            k:=0;
            while k<SourceListView.Columns.Count do
            begin
              if SourceListView.Column[k].Caption=ColumnDefine[j].Caption then
              begin//找出指定列并取得具体数据
                  if k=0 then
                     Result.Fields[j].AsString := SourceListView.Items[i].Caption
                  else
                     Result.Fields[j].AsString := SourceListView.Items[i].SubItems[k-1];
              end;
              k:=k+1;
            end;
        end;
    end;
    try
       Result.Post;
    except;
    end;
  end;
end;

//按用户要求的字段内容和顺序打印报表
//使用方法:在调用该函数前需要让用户选择打印哪些列,并将操作人员选中的列和顺序依次存入一个列表或数组中;
procedure TMakeReportDetail.MakeDetailBand;
var i:integer;
begin
  with FrmUniversalReport,ReportDataSet.FieldDefs do
  begin
      QRDetailTitleBand.Height:=33;
      QRDetailDataBand.Height:=30;
      PrintReport.DataSet := ReportDataSet;//获取打印数据
      //打印标题清空
      QRLb0.Caption:='';
      QRLb1.Caption:='';
      QRLb2.Caption:='';
      QRLb3.Caption:='';
      QRLb4.Caption:='';
      QRLb5.Caption:='';
      QRLb6.Caption:='';
      QRLb7.Caption:='';
      QRLb8.Caption:='';
      QRLb9.Caption:='';
      i:=0;
      //定制并规范Title and Detail
      while i<ReportDataSet.FieldDefs.Count do
      begin
          case i of
          0://第一列定义
              begin
                  QSU0.Top:=0;         //该列基本打印位置设置
                  QSU0.Height:=33;
                  QRLb0.Top:=10;
                  QSD0.Top:=0;
                  QSD0.Height:=30;
                  QRDBT0.Top:=10;

                  QSU0.Left:=0;
                  QSU0.width:=Items[i].Size;//该列打印的宽度
                  if ReportDataSet.FieldDefs.Count=1 then//若只有第一列,则修正该宽度
                      QSU0.width:=ChildBand1.Width-QSU0.Left;
                  QSD0.Left:=QSU0.Left;
                  QSD0.width:=QSU0.width;
                  QRLb0.Left:=QSU0.Left+6;
                  QRLb0.Caption:=ColumnDefine[i].PrintCaption;//该列打印的标题
                  QRDBT0.Left:=QSD0.Left+6;
                  QRDBT0.DataField := Items[i].Name;          //该列打印的数据域名称
                  QRDBT0.DataSet := ReportDataSet;            //该列打印的数据域
              end;
          1://第二列定义
              begin
                  QSU1.Top:=0;
                  QSU1.Height:=33;
                  QRLb1.Top:=10;
                  QSD1.Top:=0;
                  QSD1.Height:=30;
                  QRDBT1.Top:=10;

                  QSU1.Left:=QSU0.Left+QSU0.width;
                  QSU1.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=2 then
                      QSU1.width:=ChildBand1.Width-QSU1.Left;

                  QSD1.Left:=QSU1.Left;
                  QSD1.width:=QSU1.width;
                  QRLb1.Left:=QSU1.Left+6;
                  QRLb1.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT1.Left:=QSD1.Left+6;
                  QRDBT1.DataField := Items[i].Name;
                  QRDBT1.DataSet := ReportDataSet;
              end;
          2://第三列定义
              begin
                  QSU2.Top:=0;
                  QSU2.Height:=33;
                  QRLb2.Top:=10;
                  QSD2.Top:=0;
                  QSD2.Height:=30;
                  QRDBT2.Top:=10;

                  QSU2.Left:=QSU1.Left+QSU1.width;
                  QSU2.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=3 then
                      QSU2.width:=ChildBand1.Width-QSU2.Left;

                  QSD2.Left:=QSU2.Left;
                  QSD2.width:=QSU2.width;
                  QRLb2.Left:=QSU2.Left+6;
                  QRLb2.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT2.Left:=QSD2.Left+6;
                  QRDBT2.DataField := Items[i].Name;
                  QRDBT2.DataSet := ReportDataSet;
              end;
          3://第四列定义
              begin
                  QSU3.Top:=0;
                  QSU3.Height:=33;
                  QRLb3.Top:=10;
                  QSD3.Top:=0;
                  QSD3.Height:=30;
                  QRDBT3.Top:=10;

                  QSU3.Left:=QSU2.Left+QSU2.width;
                  QSU3.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=4 then
                      QSU3.width:=ChildBand1.Width-QSU3.Left;

                  QSD3.Left:=QSU3.Left;
                  QSD3.width:=QSU3.width;
                  QRLb3.Left:=QSU3.Left+6;
                  QRLb3.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT3.Left:=QSD3.Left+6;
                  QRDBT3.DataField := Items[i].Name;
                  QRDBT3.DataSet := ReportDataSet;
              end;
          4://第五列定义
              begin
                  QSU4.Top:=0;
                  QSU4.Height:=33;
                  QRLb4.Top:=10;
                  QSD4.Top:=0;
                  QSD4.Height:=30;
                  QRDBT4.Top:=10;

                  QSU4.Left:=QSU3.Left+QSU3.width;
                  QSU4.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=5 then
                      QSU4.width:=ChildBand1.Width-QSU4.Left;

                  QSD4.Left:=QSU4.Left;
                  QSD4.width:=QSU4.width;
                  QRLb4.Left:=QSU4.Left+6;
                  QRLb4.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT4.Left:=QSD4.Left+6;
                  QRDBT4.DataField := Items[i].Name;
                  QRDBT4.DataSet := ReportDataSet;
              end;
          5://第六列定义
              begin
                  QSU5.Top:=0;
                  QSU5.Height:=33;
                  QRLb5.Top:=10;
                  QSD5.Top:=0;
                  QSD5.Height:=30;
                  QRDBT5.Top:=10;

                  QSU5.Left:=QSU4.Left+QSU4.width;
                  QSU5.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=6 then
                      QSU5.width:=ChildBand1.Width-QSU5.Left;

                  QSD5.Left:=QSU5.Left;
                  QSD5.width:=QSU5.width;
                  QRLb5.Left:=QSU5.Left+6;
                  QRLb5.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT5.Left:=QSD5.Left+6;
                  QRDBT5.DataField := Items[i].Name;
                  QRDBT5.DataSet := ReportDataSet;
              end;
          6://第七列定义
              begin
                  QSU6.Top:=0;
                  QSU6.Height:=33;
                  QRLb6.Top:=10;
                  QSD6.Top:=0;
                  QSD6.Height:=30;
                  QRDBT6.Top:=10;

                  QSU6.Left:=QSU5.Left+QSU5.width;
                  QSU6.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=7 then
                      QSU6.width:=ChildBand1.Width-QSU6.Left;

                  QSD6.Left:=QSU6.Left;
                  QSD6.width:=QSU6.width;
                  QRLb6.Left:=QSU6.Left+6;
                  QRLb6.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT6.Left:=QSD6.Left+6;
                  QRDBT6.DataField := Items[i].Name;
                  QRDBT6.DataSet := ReportDataSet;
              end;
          7://第八列定义
              begin
                  QSU7.Top:=0;
                  QSU7.Height:=33;
                  QRLb7.Top:=10;
                  QSD7.Top:=0;
                  QSD7.Height:=30;
                  QRDBT7.Top:=10;

                  QSU7.Left:=QSU6.Left+QSU6.width;
                  QSU7.width:=Items[i].Size;
                  if ReportDataSet.FieldDefs.Count=8 then
                      QSU7.width:=ChildBand1.Width-QSU7.Left;

                  QSD7.Left:=QSU7.Left;
                  QSD7.width:=QSU7.width;
                  QRLb7.Left:=QSU7.Left+6;
                  QRLb7.Caption:=ColumnDefine[i].PrintCaption;
                  QRDBT7.Left:=QSD7.Left+6;
                  QRDBT7.DataField := Items[i].Name;
                  QRDBT7.DataSet := ReportDataSet;
              end;
          8://第九列定义
              begin
                  QSU8.Top:=0;
                  QSU8.Height:=33;
                  QRLb8.Top:=10;
                  QSD8.Top:=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -