qreport的分页控制(100分)

  • 主题发起人 主题发起人 cnchun
  • 开始时间 开始时间
C

cnchun

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在设计一个表格打印程序,有一个问题:
我要打印的这个表格,在word里面有三页纸,在qreport中怎么样来设置打印的
时候,用三张纸来打印?这个表格的格式是固定的,即每张表格固定三页。
还有一个问题,另外一张表格,中国式的表格,带格子,表格的行数不确定,要通
过读数据库动态的产生,请问大家有什么好的方法吗?同样使用qreport来实现,难
道用qsharp,detail,band这类的东西去拼凑起来?这个表格也存在自动换行的问题,
多谢大家的回答!!
 
1。直接画就行了。
2。就是这样了,不过有现成的例子可查,你查一下就行了,很多的,给你贴一个从动态DBGRID中打印的例子
procedure Tmainform.button2click(sender:TObject);
var leftv,i:integer; //leftv为报表起始位置
cheader:Tqrlabel;
detailtext:Tqrdbtext;
……
  begin

   leftv:=0;
   for i:=0 to dbgrid1.columns.Count-1do

    begin

     cheader:=TQrlabel.Create(repform);
with repform.cheaderdo

begin

parent:=repform.columnheaderband1;
caption:=dbgrid1.columns.fieldname;
width:=dbgrid1.columns.width;
height:=repform.columnheaderband1.height; left:=leftv+2;
top:=5;
end;
……//在leftv 处画表格竖线
leftv:=dbgrid1.columns.width+leftv;
end;
……//画表头栏边框。起始位为0,总宽度为leftv,也就是dbgrid1的各列宽度之和
leftv:=0;
    //显示记录内容
for i:=0 to dbgrid1.columns.Count-1do

begin

detailtext:=TQrdbtext.create(repform);
with repform.detailtextdo

begin

parent:=repform.detailband1;
dataset:=query1;
datafield:=dbgrid1.columns.fieldname;
width:=dbgrid1.columns.width;
height:=repform.detailband1.height;
left:=leftv+2;
top:=5;
end;
……//在leftv 处画表格竖线
leftv:=dbgrid1.columns.width+leftv;
end;
……// 画明晰栏边框。
repform.quickrep1.preview();//报表预览
  end;

 
在Delphi中运用QuickReport实现多栏列印

---- 在所有有关Delphi的书籍中,都没有讲解如何实现一个打印项的多栏打印,而实现生活中往往有许多报表要求同一项目多栏打印,QuickReport提供了报表打印一整套完整的解决方案,完全可以实现同一项目的多栏打印,技术关键是如何控制表中记录提取个数,如果在Treport的DataSet属性中选定一个Table
那么QuickReport每次打印详细列表(BandType=rbDetail)属性的TQRBand时,系统会自动取出一个记录供打印,并将表中的记录指针移到下一位,这样程序无法控制表中记录指针的移动,就无法实现多栏打印,只要程序不在Treport的DataSet属性选定任何表
QuickReport便不会控制表记录的提取,QuickReport特为其它类型数据打印提供了一个OnNeedData事件,QuickReport 每次打印详细列表(BandType=rbDetail)属性的TQRBand时,会触发这个事件,要求提供打印数据,如果程序在OnNeedData事件中编写运用表中数据提供打印资料,便能实现多栏打印,现举例说明:

---- 现在要实现一个Table1中Name项两栏打印,在窗口上放TquickReport组件 quickReport1,并在上面放Tband组件band1,将其BandType属性改为Detail,在Tband 组件上并排放两个QRLabel组件QRLabel1和QRLabel2,在quickReport1的OnNeedData事件中写如下代码:

procedure TForm1.QuickRep1NeedData(Sender:
TObject;
var MoreData: Boolean);
var
I: integer;
begin

MoreData := True;
for I:= 1 to 2do

begin

if Table1.Eof then
Break;
case I of
1: QRLabel1.Caption :=
Table1.FieldByName('Name').AsString;
2: QRLabel2.Caption :=
Table1.FieldByName('Name').AsString;
end;

Table1.Next;
end;

if Table1.Eof then
MoreData := False;
end;

---- 为了保证打印或者打印预览开始时Table1指针在第一条记录,在quickReport1的 BeforePrint事件中写如下代码:
procedure TForm1.QuickRep1BeforePrint
(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin

Table1.First;
end;


---- 这样程序调用QuickRep1.Preview或者QuickRep1.Print便能预览或者打印到一个关于 Name的从左至右,从上到下的多栏报表。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2006219
 
后退
顶部