📄 unmakereportdetail.pas
字号:
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 + -