怎样用qreport打印出stringgrid?

cqwty 2002-05-09 08:35:12
我看见以往的帖子上有人说可以,
不知道现在在不在,请大家帮忙,
这是小弟的毕业设计,就差报表
这儿了!由于报表比较复杂,用
qr实现不了,就先用stringgrid
做好,再用qr打印出来!谢谢!
...全文
37 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqwty 2002-05-12
  • 打赏
  • 举报
回复
to ihihonline(小小->充电中……) :谢谢你,我终于搞定了,也就是你说的方法,是我想复杂了,呵呵,以后多多指点阿!
ihihonline 2002-05-10
  • 打赏
  • 举报
回复
如果你能隐式的调用EXCEL的话,那么的确很好,如果不是的话,就有点多有一举,而表你也可以在程序中建 ,对于用户完全是个隐式的过程,其中字段都可以是char类型的(保存数字),没有主键,如果有的话,让其自动增加,删除时用delete
ihihonline 2002-05-10
  • 打赏
  • 举报
回复
OK,我是服了你了;
你说不行就不行吧;但是想知道为什么不行?
我用这段程序N次了,你的提法信息是什么?我给你调式
cqwty 2002-05-10
  • 打赏
  • 举报
回复
to ihihonline(小小->充电中……) :呵呵,我试过,不行的,
我导入excel的原因是为了方便打印,我已经实现了上面的显示结果,
这种显示结果是满足要求的,现在就是打印的问题,直接打印stringgrid
的话,有点费劲,现在我还没有找到好的办法打印,所以就先导入
到excel,这个是为了打印而做的。由于我做的这个毕业设计是学校
要使用的一个系统,所以尽量不使用第三方控件!
ihihonline 2002-05-10
  • 打赏
  • 举报
回复
TO cqwty(笨小孩)
不好意思,你试过了吗?
你看,这个表是存储的StringGrid里的内容,根本就不是按固定的字段格试走的,而表里边的字段名只是一个意义上的像征,也就是说,它有可能字段名是姓名,但是实际上存储的却是"管理学院"几个字,所以说,它一切都是以StringGrid服务的,而不是常规上的表;这和你导入Execl的区别是什么?是时间上的节约和资源上的节约,不过,你自己也可以自己新的方法;

祝你成功,嗯,如果有好的方法,请给我说一声,谢谢;
dprogram@163.com//不过,这种方法的确很麻烦,特别是在多次的导入;
cqwty 2002-05-10
  • 打赏
  • 举报
回复
而且再说明一点,所有单位的运动员产生在一个报表上,不是一个单位就是一个报表,明白了吧!谢谢!
cqwty 2002-05-10
  • 打赏
  • 举报
回复
不要生气,我说的是真的,你看看上面的东西如果是按你说的那种方法,那么这个表怎么建立?动态建表在我写的程序的其他地方我也使用了的,但是那些都有一个比较规范的字段,但是这个就不是很好做了。首先你说说这个建立的表在程序运行的过程中应该添加那些字段?还有就是左边的:领队,教练,男运动员,女运动员这个怎么处理,还有就是每一行只能显示6个运动员,当然可以多或者少,但是为了美观,所以选择6个,这个又怎么做?
cqwty 2002-05-10
  • 打赏
  • 举报
回复
to ihihonline(小小->充电中……) :我的显示结果如下所示,
你说这种是建立表好呢还是不的好?你说的方法我想过,根本就不行,
后来才换这种的,现在我已经把stringgrid中的内容导入到excel中
如果要求不高,可以了,但是我想能够不导入excel也能打印!
计算机学院
领队:XXXX
教练:XXXX
男运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
女运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
管理学院
领队:XXXX
教练:XXXX
男运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
女运动员:XXXX XXXX XXXX XXXXX XXXXX
XXXX XXXX XXXX XXXXX XXXXX
ihihonline 2002-05-10
  • 打赏
  • 举报
回复
多创建一个表
把stringgrid的值全部添加到这个表里

with frmwsqkprn1.ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('delete from wspbqk1');
execsql;
close;
sql.Clear;
sql.Add('select * from wspbqk1');
open;
end;
with frmwsqkprn1.ADOQuery1 do
begin
for i:=1 to frmwsqkliul.StringGrid1.RowCount-1 do
begin
append;
fieldbyname('bianhao').asstring:=trim(stringgrid1.Cells[0,i]);
fieldbyname('pbtime').asstring:=trim(stringgrid1.Cells[1,i]);
fieldbyname('zdefen').asstring:=trim(stringgrid1.Cells[2,i]);
fieldbyname('mingci').asstring:=trim(stringgrid1.Cells[3,i]);
post;
end;
updatebatch;
first;
end;

然后用这个表关联报表
搞定
Cute_Rascal 2002-05-09
  • 打赏
  • 举报
回复
试试下面的方法,可能有些笨但是还是可以解决问题的。
大致的思路就是:
在detail band中,先放n(n等于你要显示的字段的个数)个TQRShape,并把shape,属性设置为tangle;
然后在TQRShape中放入你的TQRDBText,调整他们之间的位置,使TQRDBText位于QRShape的中间,对齐了QRShape,调整detailband的高度使得其高度和qrshape一致。然后就可以模拟出网格了。
不过这是一个非常精细的活,需要一定的耐心。
让各位见笑了。
ihihonline 2002-05-09
  • 打赏
  • 举报
回复
以前我用StringGrid打印的时候是很复杂的,而且,总是导入的一个临时表里,才进行打印,不知道你有没有什么好的办法?如果有的话,呵呵,给我说一声:)
softwing 2002-05-09
  • 打赏
  • 举报
回复
以前有很多这类帖子,找找呀。
你可以自己写程序,或者试一试Ehlib等第三方控件,转贴一篇例子给你:
interface

uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;

type
TQRBRep1 = class(TQuickRep)
QRBand1: TQRBand;
detailBand1: TQRBand;
QRLabel1: TQRLabel;
QRGroup1: TQRGroup;
QRMemo1: TQRMemo;
procedure QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
private
public
end;

var
QRBRep1: TQRBRep1;
QRLabel: array of array of TQRLabel;
QRShape: array of array of TQRShape;
xzjlst: integer;
implementation

uses QRBank1, Unit1;

{$R *.DFM}


procedure TQRBRep1.QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
i,j: integer;
begin

{
SetLength(QRLabel,xzjlsn+2,8); //xzjlsn为全局变量,为要打印的StringGrid行数
SetLength(QRShape,xzjlsn+2,8);
}

SetLength(QRLabel,22+1,8); // xzjlsn为StringGrid的行数,而此处应该是生成每页打印的行数,
SetLength(QRShape,22+1,8); // 应该是22行,另加一个标题行

xzjlst:=1; // xzjlst是StringGrid的当前打印行号

for j:=0 to 22 do // 见上
begin
for i:=0 to 7 do
begin
QRShape[j,i]:=TQRShape.Create(QRBRep1);
with QRShape[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=j*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel[j,i]:=TQRLabel.Create(QRBRep1);
with QRLabel[j,i] do
begin
Parent:=DetailBand1;
Left:=i*92+2;
Top:=j*24+6;
Height:=16;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
{
******************
这里加入
if (j<>0) and ((j mod 22)=0) then
quickRep1.NewPage; //运行时出现非法调用错误
****************************
}
end;
QRLabel[0,0].Caption:='序号';
QRLabel[0,1].Caption:='帐号';
QRLabel[0,2].Caption:='销帐日期';
QRLabel[0,3].Caption:='话费月份';
QRLabel[0,4].Caption:='话费';
QRLabel[0,5].Caption:='上次余额';
QRLabel[0,6].Caption:='本次余额';
QRLabel[0,7].Caption:='滞纳金';
xzjlst:=1;
end;

procedure TQRBRep1.QRBRepNeedData(Sender: TObject; var MoreData: Boolean);
var
i,j: Integer;
begin
if xzjlst > xzjlsn then // xzjlsn为全局变量,为要打印的StringGrid行数
MoreData:=False
else
begin
MoreData:=True;
for j:=1 to 22 do // 同上
begin
for i:=0 to 7 do
begin
if xzjlst > xzjlsn then
QRLabel[j,i].Caption := ''
else
QRLabel[j,i].Caption:=QRBankForm.StringGrid1.Cells[i,xzjlst]; // 打印当前行对应的数据
end;
end;
Inc(xzjlst);
end;
end;
end;
end.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧