我做了一个动态查询,查出的结果在form1的dbgrid中,我想做打印,就想生成报表,由于动态,所以就得动态释放一系列tqrshape,tqrdbtext,
我用的语句是
 qrshape:array of tqrshape;
 qrdbtext:array of tqrdbtext; qrshape[i]:=tqrshape.Create(form1);
 qrshape[i].Parent:=form2.quickrep1.Bands.DetailBand;
 qrdbtext[i]:=tqrdbtext.Create(form1);
 qrdbtext[i].Parent:=form2.quickrep1.Bands.DetailBand;
我在form2中放了quickrep控件,可运行时第三,第五creat语句总是'access violation'错误,请高手指点!

解决方案 »

  1.   

    qrshape[i]:=tqrshape.create(self);我试过了,不好用,一样的错误.请再指点一下吧
      

  2.   

    你是不是用SetLength()这个函数把这个控件数组的长度设短了,最后运行时,你的i值大于数组的长度了??
      

  3.   

    为什么定义数组的时候不定好长度呢 我做的时候是定好最大字段数 再var i:integer;
    qr:array[0..19] of Tqrlabel;
    qrt:array[0..19] of TQRdbText;
    qs:array[0..19] of tqrshape;
    qst:array[0..19] of tqrshape;
    begin
    qr[0]:=tqrlabel.Create(QuickRep.ColumnHeaderBand1 );
    qr[0].Parent :=QuickRep.ColumnHeaderBand1 ;
    qr[0].Caption :=dbgrid.Columns [0].FieldName;
    qr[0].Width :=dbgrid.Columns [0].Width;
    qr[0].Top :=8;
    qr[0].Left :=8;
    for i:=1 to dbgrid.FieldCount-1 do
    begin
    qr[i]:=tqrlabel.Create(QuickRep.ColumnHeaderBand1 );
    qr[i].Parent :=QuickRep.ColumnHeaderBand1 ;
    qr[i].Caption :=dbgrid.Columns [i].FieldName;
    qr[i].Width :=dbgrid.Columns [i].Width ;
    qr[i].Top :=8;
    qr[i].Left :=qr[i-1].Left +qr[i-1].Width +4 ;
    end;
    for i:=0 to dbgrid.FieldCount-1 do
    begin
    qs[i]:=tqrshape.Create(QuickRep.ColumnHeaderBand1);
    qs[i].Parent :=QuickRep.ColumnHeaderBand1;
    qs[i].Top :=0;
    qs[i].Width :=1;
    qs[i].Height :=30;
    qs[i].Left :=qr[i].Left +qr[i].Width +2;
    //
    qrt[i]:=tqrdbtext.Create(QuickRep.DetailBand1 ) ;
    qrt[i].Parent :=QuickRep.DetailBand1;
    qrt[i].DataSet :=DM_temp.qy_qy;
    qrt[i].DataField :=qr[i].Caption ;
    qrt[i].top:=8;
    qrt[i].Left :=qr[i].Left;
    //
    qst[i]:=tqrshape.Create(QuickRep.DetailBand1 );
    qst[i].Parent :=QuickRep.DetailBand1;
    qst[i].Top :=0;
    qst[i].Width :=1;
    qst[i].Height :=30;
    qst[i].Left :=qs[i].Left ;
    //
    QuickRep.PreviewModal;
      

  4.   

    不好意思,我错的地方是给quickrep1.bands.columnheaderband.height赋值,我设置断点的时候,以为一个赋值语句,没设.
    我的动态报表已经可以运行,可是没有columheaderd,只有detailband,我想照楼上那样释放qrlabel,可又出错了,源代码如下:(这次是全的了)
     for i:=0 to dbgrid1.Columns.Count-1 do
     begin
     qrlabel[i]:=tqrlabel.Create(form1);
     qrlabel[i].Parent:=form2.QuickRep1.Bands.ColumnHeaderBand;
     qrlabel[i].Caption:=dbgrid1.Columns[i].FieldName;
     end;
    这次我是单点调试的,错误在qrlabel[i]:=tqrlabel.Create(form1);
    还是'access violation',为什么不让我创建qrlabel?
    麻烦了!
      

  5.   

    我也不明白  只是既然你的QuickRep1在from2上
    qrlabel[i]:=tqrlabel.Create(form1);又怎么可以呢
    你说没有columheaderd   是不是也要先创建然后在
    qrlabel[i]:=tqrlabel.Create(form2.QuickRep1.mnHeaderBand1);
    我这机器上没装DELPHI 也不能试 
    唉  有高手看见指点一下嘛
      

  6.   

    我的你参考一下吧:(谁能帮我解决:锁定左边N列的问题?QQ 9795755 [email protected]
    ------------------------------------------------------------------------
    procedure TFormDataView.BitBtn3Click(Sender: TObject);
    var
      aLabel: TQRLabel;
      aText:TQRDBText;
      FieldCount,i,LeftValue:integer;
    begin
      FieldCount:=ADOQueryPianQu.SQL.Count;
      LeftValue:=0;
      for i:=0 to FieldCount-1 do //循环FieldCount次,生成ADOQueryPianQu查询产生的所有列
        begin
        aLabel:=TQRLabel.Create(FormPrintZD); 
        with FormPrintZD do
        aLabel.Parent:= HeaderBand1; //放在HeaderBand里
        with aLabel do               //设置属性
          begin
            AutoSize:=True;         //好像这个值必须为True
            AutoStretch:=True;
            Alignment:=taLeftJustify;
            Left:=LeftValue;
            Top:=8;
            Height:=14;
            LeftValue:=Width+LeftValue+10;
          end;
        end;
    ...
      

  7.   

    补充说明:
    FormPrintZD 是一个放置QuickRep的Form
      

  8.   

    再补充说明:HeaderBand1 是个 rbDetail 
    用这种方式可以在报表中动态生成字段名,可是我想用aText(TQRDBText)在QRSubDetail1生成字段值得报表就不成了,只能生成第一条记录的报表,郁闷!向大伙求救啊!十二分感谢!
    ------------------------------------------------------------------------
    procedure TFormDataView.BitBtn3Click(Sender: TObject);
    var
      aLabel: TQRLabel;
      aText:TQRDBText;
      FieldCount,i,LeftValue:integer;
    begin
      FieldCount:=ADOQueryPianQu.SQL.Count;  LeftValue:=0;
      for i:=0 to FieldCount-1 do //循环FieldCount次,生成ADOQueryPianQu产生的所有列
        begin
        aLabel:=TQRLabel.Create(FormPrintZD); 
        with FormPrintZD do
        aLabel.Parent:= HeaderBand1; //放在HeaderBand(rbDetail)里
        with aLabel do               //设置属性
          begin
            AutoSize:=True;         //好像这个值必须为True
            AutoStretch:=True;
            Alignment:=taLeftJustify;
            Left:=LeftValue;
            Top:=8;
            Height:=14;
            LeftValue:=Width+LeftValue+10;
          end;
        end;  LeftValue:=0;
      for i:=0 to FieldCount-1 do
        begin
        aText:=TQRDBText.Create(FormPrintZD); 
        with FormPrintZD do
        aText.Parent:= QRSubDetail1;
        with aText do
          begin
            Dataset:=ADOQueryDataView;
            DataField:=ADOQueryDataView.Fields[i].FieldName;
            AutoSize:=True;
            AutoStretch:=True;
            Alignment:=taLeftJustify;
            Left:=LeftValue;
            Top:=8;
            Height:=14;
            LeftValue:=Width+LeftValue+10;
          end;
        end;    FormPrintZD.QuickRep1.Preview;
    end;