打印报表时,只能显示第一页的数据,为什么?(30分)

林枫

Unregistered / Unconfirmed
GUEST, unregistred user!
我在报表窗口出现在前使用了如下的代码:
DataSet:=Ajhd; //关联数据集
mark:=Ajhd.GetBookmark; //保存数据集指针
Ajhd.DisableControls; //切断数据集与数据感知控件的联系
......
......
BillRform.Prepare;
BillRform.QRLabel19.Caption:='(共'+INTTOSTR(BillRform.Printer.PageCount)+'页)';
BillRform.Preview; //显示报表页数
Ajhd.GotoBookmark(mark); //恢复数据集指针
Ajhd.EnableControls; //恢复数据集与数据感知控件的联系

当我不切断数据集与数据感知控件的联系时,报表可以显示正确的数据(就是界面太难看了,DBGrid的滚动条会向下滚动);
但当我用以上代码时,报表只显示第一页的数据。

请问以上代码有错吗??

 
DataSet关联DBGrid取数据时,并不是一下子都取出来,而是只取一页的,当下拉滚动条时,再从数据库中读取。所以如果断开连接的话,你需要自己控制从数据库得到数据
 
你可以这样试试:打印前锁定窗口,打印完毕后再解开,就看不到DBGrid滚动条滚动了.
Perform(WM_SETREDRAW, 0, 0);//锁定窗口
mark:=Ajhd.GetBookmark; //保存数据集指针
......
Ajhd.GotoBookmark(mark); //恢复数据集指针
Perform(WM_SETREDRAW, 1, 1); //解锁窗口
RedrawWindow(Handle, Nil, 0,RDW_FRAME + RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
 
lndzh: 你的代码我试过了,窗口锁不上,滚动条还在动
你再看看。

在线等待
 
to :lndzh
不好意思,是我没用动脑,你的代码没问题
在 Perform 函数前加上 self 就OK了
效果好极了,谢谢。
马上加分
 
你说不加最后一句会有什么后果??
RedrawWindow(Handle, Nil, 0,RDW_FRAME + RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);

 
虽然RedrawWindow这个函数在字面上很好理解,
但当我做以前那个程序时,因为是在同一个窗口中锁定与解锁的,如果不用这个函数,当你操作结束后当前窗口
,它也会重画一下。
我在做另一个程序时是用第当前窗口来操作,要求锁定另一个锁窗口时就发现,如果不用这个函数,
另一个窗口自己不会重画,只有当关闭了当前窗口时,它才自己执行RedrawWindow这个函数。
当我们自己调用后,就会看到在完成操作时另一窗口已经重画了。
 
顶部