在设计报表时,将memoview的name属性设为memoBillNo,值设为[frxdbdataset1."BillNo"],
报表运行时,在PrintReport事件中如何获取memoview的值?
我现在的程序如下,但取道的值始终是  frxdbdataset1."BillNo"  字样的字符串。procedure TdmDataModule.frxReport1PrintReport(Sender: TObject);
var
  strBillNo:string;
begin
  if frxReport1.FindObject('memoBillNO') <> nil then
  begin
    strBillNo:=tfrxmemoview( frxReport1.FindObject('memoBillNO')).memo.text;
    showmessage(strBillNo);
  end;
end;

解决方案 »

  1.   

    你加表[]把你寫的field括住試試。
      

  2.   

    1、如果是数据集的字段,你直接从设计窗口的右边把数据字段拖到设计区域就OK了。
    如果是在弹出的属性窗口中写“表达式”的话,你试试用:
    [<frxdbdataset1."BillNo">]2、另外,我一般直接取.text属性,不是.memo.text:
    tfrxmemoview(   frxReport1.FindObject('memoBillNO')).text;
      

  3.   

    3、为什么要在 printreport 事件中写?
    我一般是有一个打印按钮,然后在打印按钮中,首先准备数据集,准备好后,再写修改报表某些Memo文字的代码,
    最后是PrepareReport(True);和Print;
    如果是要读取Memo文字,可以在PrepareReport(True);后进行。
      

  4.   

    回复lx130:
    谢谢你的留言。
    因为我要记录打印次数,所以在PrintReport事件中执行。
      

  5.   

    回复lx130: 
    谢谢你的留言。
    情况是这样的: 因为我要记录某个单据的打印次数,所以在PrintReport事件中,根据显示单据编号的Memo上的text来确定当前打印的是那张单据,然后更新数据库中相应记录。预览时MemoBillNo上显示的是单据号(例如RK001),但利用下列语句取到的值却是frxdbdataset1."BillNo"字样.tfrxmemoview(   frxReport1.FindObject('memoBillNO')).memo.text; 

    tfrxmemoview(   frxReport1.FindObject('memoBillNO')).text; 
      

  6.   

    回复jacklee_888
    请你说详细一些,我不太明白,Thanks !
      

  7.   

    报表里不管用的是memo控件还是rich控件,都有个表达式的选项,如果DATESET设置正确,可以通过表达式选项来写,
    如果只希望用MEMO,还可以直接将右边显示的DATESET的字段拖拽过来正确的变量表达式两边是用中括号括起来的DATESET值的获得办法是在DATESET的getvalue事件里写的报表里还可以用自定义的变量,比如报表里写[RptCode],在代码里,报表控件的getvalue方法里可以写
    if sametext(varname, 'RptCcode') then
    begin
      value := '123';
    end;至于说要记录打印次数,我不是很理解这个需求的具体含义
      

  8.   

    回复try__again :
    感谢你的留言。
    我使用的memo,其中的内容是通过拖拽右边的DATESET的字段设置的,我想在程序运行时取得memo的text属性值(用于判断当前打开的报表是否需要记录打印次数),但取到的值始终是 frxdbdataset1."BillNo" 字样的字符串,而不是其显示的内容。
      

  9.   

    回复try__again: 
    是的,正如你所述的那样:程序中需要用到报表里的某个字段的值。
      

  10.   

    这样的事情我确实没做过以前最多是获得报表控件,然后给他赋值,在使用CROSSTAB的时候(可以参考CROSSTAB的DEMO)那个时候是写在beforeprint的时候procedure TForm1.frxReport1BeforePrint(c: TfrxReportComponent);
    var
      Cross: TfrxCrossView;
      i, j: Integer;
    begin
      if c is TfrxCrossView then
      begin
        Cross := TfrxCrossView(c);
        for i := 1 to 16 do
          for j := 1 to 16 do
            Cross.AddValue([i], [j], [StringGrid1.Cells[i - 1, j - 1]]);
      end;
    end;不过LZ这样的情况,我觉得是否可以换个角度思考既然数据源头来自DATESET,可否从DATESET入手