📄 printerrpt.pas
字号:
unit PrinterRpt;
interface
//调用Api函数库///
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, Buttons, PicButton, DB, ADODB,Grids,
COMObj,Quickrpt,QRExtra,common, QRCtrls;
///Summary简要说明/////////
///定义一个用语打印的类PrinterRpt.pas/////
/////显示打印报表//////////
type
TArrayInt=array of integer;
/////建立水平线或者建立垂直线////
////<SUMMARY>
////</SUMMARY>
function Create_VLine(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer): TQRShape;
////建立列标题///////////
procedure Create_Title(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; ACaption: String; AAlignMent: TAlignment);
procedure CreateList(sender:TObject;MyTable:TAdotable;ctrl:TControl;ColWidth,ColumnWidth:Array of Integer);
function Create_QRDBText(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; AAlignMent: TAlignment): TQRDBText;
////设置数据库的表名//////
procedure SetTableName(TableName:string);
////设置报表的标题名称/////////
Procedure SetReportTitle(ReportTitleName:string);
////设置报表的每一列的标题//////
Procedure SetColumnTitle(ColumnTitle:TStringList);
////连接数据库以及表名/////////
Procedure LinkDataSource(MyTable:TADoTable);
////得到表的字段个数////
Function GetFieldCount(Table:TAdoTable):Integer;
////设置明细表格水平线宽度//////
procedure SetHorizontalLineWidth(LineWidth:integer);
////设置数值型字段的索引列////
procedure SetFieldColIndex(IndexCol:Array of Integer);
/////设置第几列为数字列////////
procedure SetIntegerCol(bColumn:boolean);
var
aReport : TCustomQuickRep;
FTableName:string; ///存储报表的表名///
FReportTitleName:string;///存储报表的标题////
FColumnTitle:TStringList; ///存储列标题////
FFieldCount:integer; ////存储字段个数
//FColumnWidth:Array of integer;
FHorizLineWidth:integer;
FIntegerCol:boolean;
implementation
function Create_QRDBText(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; AAlignMent: TAlignment): TQRDBText;
var
AQRDBText : TQRDBText;
begin
AQRDBText := TQRDBText.Create(Nil);
with AQRDBText do
begin
left:=Aleft;
top:=Atop;
width:=Awidth;
height:=Ahight;
Alignment:=AAlignment;
//Font.Assign(Afont);
end;
Result := AQRDBText;
end;
//////实现建立列标题////////////
procedure Create_Title(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer; ACaption: String; AAlignMent: TAlignment);
var
AQRLabel : TQRLabel;
begin
AQRLabel := TQRLabel.Create(Nil);
With AQRLabel do
begin
Parent:=sender;
left:=Aleft;
top:=Atop;
Width:=Awidth;
Height:=Ahight;
Caption:=Acaption;
Alignment:=AAlignment;
end;
end;
////实现建立水平线或者垂直线/////
function Create_VLine(Sender: TWinControl; ALeft, ATop, AWidth,AHight: Integer): TQRShape;
var
AQRShapeV : TQRShape;
begin
AQRShapeV:=TQRShape.Create(Nil);
with AQRShapeV do
begin
Parent:=sender;
left:=Aleft;
top:=Atop;
width:=Awidth;
height:=Ahight;
end;
result:=AQRShapeV;
end;
////设置数据库的表名//////
Procedure SetTableName(TableName:string);
begin
FTableName:=Tablename;
end;
////设置报表的标题名称/////////
Procedure SetReportTitle(ReportTitleName:string);
begin
FReportTitleName:=ReportTitleName;
end;
////设置报表的每一列的标题//////
Procedure SetColumnTitle(ColumnTitle:TStringList);
begin
FColumnTitle:=TStringList.Create;
FColumnTitle:=ColumnTitle;
end;
////连接数据库以及表名/////////
Procedure LinkDataSource(MyTable:TADoTable);
begin
MyTable := TAdoTable.Create(MyTable);
/////连接数据库以及表名////
with MyTable do
begin
ConnectionString:=ConnectToDatabase;
TableName :=Ftablename;
ReadOnly := True;
Active := True;
end;
FFieldCount:=MyTable.FieldCount;
end;
////得到表的字段个数////
Function GetFieldCount(Table:TAdoTable):Integer;
begin
LinkDataSource(Table);
Result:=FFieldCount;
end;
////设置明细表格水平线宽度//////
procedure SetHorizontalLineWidth(LineWidth:integer);
begin
FHorizLineWidth:=LineWidth;
end;
////设置数值型字段的索引列////
procedure SetFieldColIndex(IndexCol:Array of Integer);
begin
end;
/////设置第几列为数字列////////
procedure SetIntegerCol(bColumn:boolean);
begin
FIntegerCol:=bColumn;
end;
/////显示打印报表//////////
procedure CreateList(sender:TObject;MyTable:TAdotable;ctrl:TControl;ColWidth,ColumnWidth:Array of integer);
var
SomeFields: TStringList;
nIdx: integer;
DisplayWidthx:Array of integer; ////画垂直线的left位置坐标
LeftPos:Array of integer; ////显示内容的left位置的坐标
TitleLeftPos:Array of integer; ///显示标题内容的left的位置坐标
begin
try
MyTable := TAdoTable.Create(MyTable);
/////连接数据库以及表名////
with MyTable do
begin
ConnectionString:=ConnectToDatabase;
TableName :=Ftablename;
ReadOnly := True;
Active := True;
end;
setlength(displayWidthx,FFieldCount); ////设置数组的长度
setlength(leftPos,FFieldCount);
setlength(TitleleftPos,FFieldCount);
//showmessage(Inttostr(length(MyTable.FieldValues[mytable.Fields[2].DisplayName])));
SomeFields := TStringList.Create;
//////对报表进行设置////////
areport := nil;
///用字符串列表存储字段名称
displayWidthx[0]:=columnWidth[1];
for nIdx := 1 to MyTable.FieldCount - 1 do
begin
displayWidthx[nIdx]:=displayWidthx[nIdx-1]+ColumnWidth[nIdx+1];
end;
/////设置输出内容的对齐位置///////
leftPos[0]:=3;
for nIdx := 0 to MyTable.FieldCount - 2 do
begin
if Mytable.Fields[nIdx].DataType=ftinteger then
begin
leftPos[nIdx+1]:=leftPos[nIdx]+ColumnWidth[nIdx+1]-10;
end
else
leftPos[nIdx+1]:=leftPos[nIdx]+ColumnWidth[nIdx+1]+2;
end;
/////设置标题输出内容的对齐位置///////
TitleleftPos[0]:=3;
for nIdx := 0 to MyTable.FieldCount - 2 do
begin
if Mytable.Fields[nIdx].DataType=ftInteger then
begin
TitleleftPos[nIdx+1]:=TitleleftPos[nIdx]+ColumnWidth[nIdx+1]+2;
end
else
TitleleftPos[nIdx+1]:=TitleleftPos[nIdx]+ColumnWidth[nIdx+1];
end;
//mytable.Fields[0].DisplayWidth:=14;
for nIdx := 0 to MyTable.FieldCount - 1 do
begin
with MyTable.Fields[nIdx] do
begin
/////设置显示宽度////
DisplayWidth:=colwidth[nIdx];
/////设置显示标题/////
//DisplayLabel:=FColumnTitle[nIdx];
end;
end;
///建立报表/////////
QRCreateList(aReport, nil, MyTable, FReportTitleName, SomeFields);
///设置报表列的标题等属性/////////
aReport.Bands.ColumnHeaderBand.Font.Style := [fsBold];
//showmessage(inttostr(aReport.Bands.ColumnHeaderBand.Font.height));
////设置显示标题的位置//////
for nIdx := 0 to aReport.Bands.ColumnHeaderBand.ControlCount -1 do
begin
if aReport.Bands.ColumnHeaderBand.Controls[nIdx] is TQRPrintable then
begin
Create_VLine(aReport.Bands.ColumnHeaderBand,1,-10,FHorizLineWidth,2);
Create_VLine(aReport.Bands.ColumnHeaderBand,1,11,FHorizLineWidth,2);
//Create_Title(aReport.Bands.ColumnHeaderBand,nIdx*70,-4,70,10,FColumnTitle[nIdx],taLeftJustify);
with TQRPrintable(aReport.Bands.ColumnHeaderBand.Controls[nIdx]) do
begin
Left :=leftPos[nIdx];
width:=0;//ColumnWidth[nIdx+1];
end;
end;
end;
/////设置列标题///////
for nIdx := 0 to Mytable.FieldCount-1 do
begin
Create_Title(aReport.Bands.ColumnHeaderBand,TitleleftPos[nIdx],-4,ColumnWidth[nIdx+1],10,FColumnTitle[nIdx],taLeftJustify);
end;
////设置显示内容的对齐方式//////////
//showmessage('kk'+inttostr(aReport.Bands.DetailBand.FontSize));
for nIdx := 0 to aReport.Bands.DetailBand.ControlCount-1 do
begin
if aReport.Bands.DetailBand.Controls[nIdx] is TQRPrintable then
begin
with TQRPrintable(aReport.Bands.DetailBand.Controls[nIdx] ) do
begin
//showmessage(IntTostr(leftPos[nIdx]));
if FIntegerCol then
begin
if (nIdx=0) then
begin
Left :=leftPos[nIdx]-11;
end
else
Left :=leftPos[nIdx];
end
else
Left :=leftPos[nIdx];
width:=ColumnWidth[nIdx+1];
end;
end;
end;
////另一种显示数据内容的一种方式/////////
for nIdx := 0 to Mytable.FieldCount-2 do
begin
//Create_VLine(aReport.Bands.DetailBand,1,15,FHorizLineWidth,1);
//showmessage(IntToStr(displayWidthx[nIdx]));
aReport.Bands.DetailBand.FontSize :=11;
with Create_QRDBtext(aReport.Bands.DetailBand,leftPos[nidx]+2,6,ColumnWidth[nIdx+1],15,tacenter) do
begin
DataSet:=MyTable;
DataField:=MyTable.Fields[nIdx].displayName;
end;
Create_VLine(aReport.Bands.DetailBand,displayWidthx[nIdx],-32,1,48);
end;
/////画明细表的水平线////////
for nIdx := 0 to Mytable.FieldCount-2 do
begin
Create_VLine(aReport.Bands.DetailBand,1,15,FHorizLineWidth,2);
//Create_VLine(aReport.Bands.DetailBand,((nIdx+1)*ColumnWidth[nIdx+1]),-32,1,48);
end;
//Create_VLine(aReport.Bands.DetailBand,1,48,FHorizLineWidth,1);
Create_VLine(aReport.Bands.DetailBand,0,-32,2,48); ///画最左边的垂直线
Create_VLine(aReport.Bands.DetailBand,FHorizLineWidth,-32,2,48); ///画最右边的垂直线
/////关于报表设置结束//////////
if sender =ctrl then
begin
areport.preview;
end;
finally
aReport.Free;
myTable.Free;
SomeFields.Free;
end;
end;
end.///定义类结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -