我有一个打印按钮下进行了将数据赋值到frxreport1上的操作,frxreport1画了一个表格。我读取一个表中数据将之写入表格中,frxreport1上没有放任何页眉、页头、区带等,直接在空白设计页面上画的表格。表格上方有几个memo连接某记录集直接读取记录数据,表格中则放置规律命名的memo若干个用来被赋值。由于表格需要固定行数,因此我代码如下:
procedure Tfmsctz_ds.BitBtn21Click(Sender: TObject);
var f,f1:integer;
begin
if (dst4.Active=true)and(dst4.RecordCount>0)then
begin
frxreport1.LoadFromFile(ExtractFilePath(ParamStr(0))+'a.fr3');
if (dst41.Active=true)and(dst41.RecordCount>0) then
begin
f1:=dst41.RecordCount;
if f1<=20 then
f:=f1
else
f:=20;
f1:=1;
dst41.First;
while f1<f+1 do
begin//这些都是执行循环赋值用的代码,memo命名为m11,m12,m13,m21,m22,m23......这样,不超过20行
(frxreport1.FindObject( 'm'+inttostr(f1)+'1') as TfrxMemoView).Text:=dst41.fieldbyname('name').AsString;
(frxreport1.FindObject( 'm'+inttostr(f1)+'2') as TfrxMemoView).Text:=dst41.fieldbyname('dw').AsString;
(frxreport1.FindObject( 'm'+inttostr(f1)+'3') as TfrxMemoView).Text:=dst41.fieldbyname('sl0').AsString;
dst41.Next;
f1:=f1+1;
end;
(frxreport1.FindObject( 'mhj') as TfrxMemoView).Text:=dst4.fieldbyname('sl').AsString;
end;
frxreport1.ShowReport();
end;
end;
很奇怪的是有的记录执行时不报错,有的记录执行时报书签无效错误
求解~

解决方案 »

  1.   

    是不是你的while f1 <f+1 do 循环中的数值已经超出了所有memo的数量,导致访问不到出错
      

  2.   

    感觉楼主这样的写法有问题.改成在onbeforeprint事件中写代码, 不然tfrxmemoview中的值可能会解释为variants中的变量.
      

  3.   

    表格上方有几个memo连接某记录集直接读取记录数据//----------------------
    这几个memo是不是也放在frxmasterdataband上了, 如果是, 楼主的代码肯定就有问题了. 
      

  4.   

    最然依然没弄明白问题出处,但是删除了一些错误记录后忽然发现再也没出现该问题了。。囧。jjwwang的意见下次若还发生类似问题我会去试试的~谢谢。于是再提问一个小问题吧:
    我在设计某些打印时偶尔会发生点击打印按钮时发现打印页数无限多,就是打印预览页面上明明只有一个页面的内容,页码却一直不停地增加,点击取消后才能停止页码增加。请问谁能大概说明一下如何能有效避免该状况的发生呢?