function CreateQRDBText(const AParent: TWinControl; const ALeft, ATop,
AWidth: Integer; const AFieldName, AMask: string; const ADataSet: TDataSet;
const AAlignment: TAlignment): TQRDBText;
begin
Result := TQRDBText.Create(AParent);
with Result do begin
Parent := AParent;
AutoSize := False;
WordWrap := False;
Left := ALeft;
Top := ATop;
Width := AWidth;
DataField := AFieldName;
DataSet := ADataSet;
Mask := AMask;
Alignment := AAlignment
end
end;
AWidth: Integer; const AFieldName, AMask: string; const ADataSet: TDataSet;
const AAlignment: TAlignment): TQRDBText;
begin
Result := TQRDBText.Create(AParent);
with Result do begin
Parent := AParent;
AutoSize := False;
WordWrap := False;
Left := ALeft;
Top := ATop;
Width := AWidth;
DataField := AFieldName;
DataSet := ADataSet;
Mask := AMask;
Alignment := AAlignment
end
end;
1、首先需要一个QuickReport
2、在QuickReport生成必要的Band,象你的报表ColumnBand和DetailBand是必须得,可以参考QuickRep.Bands属性
3、在Bands上生成相应的QRLabel和QRDBText。在ColumnBand上生成基本上都是QRLabel,在DetailBand上生成的基本上都是QRDBText,在生成的时候注意排版。我写的函数就是生成QRDBText的例子(Parent应该传DetailBand)
4、设置QuickRep的DataSet等属性
这样报表就生成了。比较烦琐,不过写的好能解决很大的问题。
用循环生成即可,
var
qrlab: TQrLabel;
qrdbtext:tqrdbtext;
...
for i:=0 to n-1
begin
qrlab:=tqrlabel.create(self);
qrlab.Parent:=printform.ColumnHeaderBand1;
qrlab.left:=round(weidth/(n+1))*i;
qrlab.top:=yourvalue;
qrlab.Caption:='name'
qrlab.AutoSize := False;
qrlab.WordWrap := False;
qrdbtext:=tqrdbtext.create(self);
qrdbtext.Parent:=printform.DetailBand1;
qrdbtext.left:=round(width/(n+1))*i;
qrdbtext.top:=yourvalue;
// qrdbtext.Alignment:=taRightjustify;
qrdbtext.DataSet:=query1;
qrdbtext.DataField:=query1.fields[i+2].FieldName;
end;