用QuickRep打印StringGrid问题,分不是问题,解决了再加!(100分)

  • 主题发起人 主题发起人 joioy
  • 开始时间 开始时间
J

joioy

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟现在要用QuickRep打印StringGrid,现在有一问题,如果StringGrid的width比QuickRep.Bands的wdith大,那么为了能在一页纸上打印下来,所有要实现把StringGrid整体放大和缩小到报表上。
现在我是这样做的,对stringgrid进行ColCount和RowCount进行循环,用TQRLabel来处理每个单元格的left,top,width,hight等。
万谢!
 
解决了另开贴给分+400,一共500分。
现在只差放大和缩小问题没有解决!
还有一问题,就是QRLabel的大小,除了用它的Font.Size之外,还能用什么东东控制呢?
 
请不要反复的给我发信息,谢谢,你的问题我已看过,但并没有比你更好的方法
 
报表一定要和stringgrid一样大吗?
 
如果报表比Stringgrid一样大,就把stringgrid的内容放大到100%,反之就缩小到100%.
给个思路也行。
 
我来学习
 
你为什么不用QUICKREPORT做好样板然后向QRLABEL中写入数据呢?
PUBLIC
RECCOUNT:INTEGER;
BEFOREPRIONT(SENDER:TOBJECT);
begin
RECCOUNT:=1;
END;
ONNEEDDATA(SENDER:TOBJECT)
VAR
COL:INTEGER;
begin
IF RECCOUNT<=STRINGGRID1.ROWCOUNT-1 then
MOREDATA:=TRUE;
FOR COL:=0 TO STRINGGRID.COLCOUNT-1do
begin
QRLABEL1.CAPTION:=STRINGGRID[COL,RECCOUNT];
......
end;
INC(RECCOUNT);
END;
 
呵呵,楼上的,小弟也是用此方法实现了数据的显示,但是现在要实现放大和缩小问题没有解决。有什么好方法吗?只要解决,分不是问题。
 
我找到了一个QuickRep动态建报表的DEMO,你需要的话,可以留个EMAIL
另外如果只是打印Stringgrid的内容的话,EHLIB控件组里有一个TPrintDBGridEh控件,也许你可以下载一个下来,看一看他的源码来参照一下的
 
QuickRep本身自带有例子,自己找找,
在QuickRep目录下
 
自己写的:
unit ListPrint;
interface
uses printers,Types,ComCtrls,Classes,Graphics,SysUtils;
type
TmyCol = record
text : string[30];
width : integer;
iType : byte;
// 1左 2 中 3 右
end;
procedure PrintRect(R : TRect;
txt: string;
iType:integer );//打印单元
procedure PagPrint1(ListV:TlistView;
sTitle1,sTitle2,sTitle3: string);
//打印TlistView类型的
procedure PagPrint(Cols: array of TmyCol;
Dat: array of pchar;
sTitle1,sTitle2,sTitle3: string;
colCount,RowCount:integer);
//通用的
implementation
procedure PrintRect(R : TRect;
txt: string;
iType:integer );//打印单元
var
L,dx : integer;
begin
l := printer.Canvas.TextWidth(txt);
//内容长度
if l>(R.Right -R.Left) then
dx:=20
else
case iType of
1 : dx := 20 ;//左
2 : dx := trunc(((R.Right -R.Left)-L)/2);
3 : dx := (R.Right -R.Left)-L-20;
else
dx := 20;
end;
// printer.Canvas.Rectangle(R);
printer.Canvas.TextRect(R,R.Left+dx,R.Top+20,txt);
end;

procedure PagPrint1(ListV:TlistView;
sTitle1,sTitle2,sTitle3: string);
var
i,j : integer;
Rowcount ,ColCount : integer;
cols :array of TmyCol;
sText: string;
dat : array of Pchar;
begin
RowCount := ListV.Items.Count;
ColCount := ListV.Columns.Count;
setlength(Cols,Colcount);
setLength(dat,RowCount* Colcount);
for i := 0 to Colcount-1do
begin
Cols.text := ListV.Columns.Caption;
cols.width :=ListV.Columns.Width;
case ListV.Columns.Alignment of
taLeftJustify : cols.iType:= 1;
taCenter : cols.iType:= 2;
else
cols.iType:= 3
end;
end;

for i := 0 to RowCount-1do
begin
for j := 0 to Colcount-1do
begin
sText := '';
if j=0 then
sText := ListV.Items.Caption
else
try
sText := ListV.Items.SubItems[j-1];
except
sText:= '';
end;
dat[i*ColCount+j]:= pchar(sText);
end;
end;
PagPrint(cols,dat,sTitle1,sTitle2,sTitle3,colCount,RowCount);
end;

{
RowCount : integer;
//总行数
colCount : integer;
//列的个数
}
procedure PagPrint(Cols: array of TmyCol;
Dat: array of pchar;
sTitle1,sTitle2,sTitle3: string;
colCount,RowCount:integer);
var
R : TRect;
i,n,L : integer;
sTxt : string;
RowIndex : integer;
//当前行号
pagIndex : integer;
PagH : integer;
//有效页高
dWidth :integer;
//显示与打印的比例系数
y0 : integer;
x,y : integer;
PagR : TRect;
//有效打印区域
begin
if RowCount=0 then
exit;
// printer.Orientation:=poLandscape ;
PagR.Left:= 400;
pagR.Top:= 200;
pagR.Right:= printer.PageWidth-400;
pagR.Bottom:= Printer.PageHeight-400;
PagH := pagR.Bottom-100 ;
printer.Canvas.Brush.Style:= bsClear;
//取列信息
printer.begin
Doc;
L := 0;
for i := 0 to ColCount-1do
l:=l+cols.width;
dWidth := trunc((pagR.Right-pagR.Left)/ l);
RowIndex := 0;
pagIndex :=1;
while RowCount> RowIndexdo
begin

//打印标题
sTxt := sTitle1;
printer.Canvas.Font.Size:=-22;
Printer.Canvas.Font.Name:='黑体';
R.TopLeft:=point(pagR.Left, pagR.Top);
R.Right:= pagR.Right;
R.Bottom:=R.Top+ printer.Canvas.TextHeight('ABC')+40;
PrintRect(R, sTxt,2 );
//居中
Printer.Canvas.Font.Name:='宋体';
//打印副标题
sTxt := sTitle2;
printer.Canvas.Font.Size:=-11;
R.TopLeft:= point(R.Left,650);
R.Right:= pagR.Right;
R.Bottom := R.Top+ printer.Canvas.TextHeight('ABC')+40;
PrintRect(R, sTxt,1 );
//居左
sTxt := '制表日期:'+formatdatetime('yyyy-mm-dd hh:n:ss ',now);
PrintRect(R, sTxt,3 );
//居右

//打印脚注
sTxt := sTitle3;
printer.Canvas.Font.Size:=-9;
R.TopLeft:=point(pagR.Left, pagR.Bottom);
R.BottomRight:=point(pagR.Right, pagR.Bottom+printer.Canvas.TextHeight('ABC')+40);
PrintRect(R, sTxt,1 );
//居左
//打印脚注2
sTxt := format('第 %d 页',[pagIndex]);
PrintRect(R, sTxt,2 );
//居中
//打印脚注3
// sTxt := '制表日期:'+formatdatetime('yyyy-mm-dd hh:n:ss ',now);
// PrintRect(R, sTxt,3 );
//居右
printer.Canvas.Font.Size:=-9;
// 1 打印表格头
y0:= 800;
R.Top := y0;
R.Bottom:= R.Top + trunc(printer.Canvas.TextHeight('ABC')*1.5);
L := pagR.Left;
Printer.Canvas.Font.Name:='黑体';
for i := 0 to ColCount-1do
begin
R.Left:= L;
R.Right:= trunc(R.Left+Cols.width*dWidth);
PrintRect(R, cols.text, cols.iType);
L:= R.Right;
end;
Printer.Canvas.Font.Name:='宋体';
//打印数据行
while R.Bottom< PagH do
begin
if RowIndex >= RowCount then
break;
R.Top:=R.Bottom;
R.Bottom:= R.Top + trunc(printer.Canvas.TextHeight('ABC')*1.5);
L := pagR.Left;
for i := 0 to ColCount-1do
begin
R.Left:= L;
R.Right:= trunc(R.Left+Cols.width*dWidth);
n := RowIndex*(ColCount)+i;
//取数据
sTxt := dat[n];
PrintRect(R, sTxt, cols.iType);
L:= R.Right;
end;
//横线
printer.Canvas.MoveTo(pagR.Left, R.Top);
printer.Canvas.LineTo(R.Right, R.Top);
inc(RowIndex);
end;
//网格
printer.Canvas.Pen.Width:= 2;
printer.Canvas.Rectangle(pagR.Left,y0,R.Right+1,R.Bottom+1);
printer.Canvas.Pen.Width:= 2;
L:= pagR.Left;
y:= y0;
for i := 0 to ColCount-2do
begin
x:= L+ trunc(cols.width*dWidth);
L := x;
printer.Canvas.MoveTo(x,y);
printer.Canvas.LineTo(x,R.Bottom);
end;
inc(pagIndex);
if RowIndex < RowCount then
printer.NewPage;
end;
printer.EndDoc;
end;

end.
 
楼上的,谢谢你的支持,你这样是直接输出到打印机,现在是要在Rep上实现哦。
 
To:
app2001,我的email:joioy@163.com
 
问题我自己已基本解决了,但是也十分感谢各位富翁的帮助,所用请各位恕我不另开贴给分了。
 
后退
顶部