现在报表要求这样的格式:
    
  Name:欧阳      address:南极1345号    position:世外高人    (这个部分不用分栏)    
------------------------------------
  图一            图二            (只要这部分分成两栏)
  图三            图四
-----------------------------------
  评语:   (memo)    这个报表只要求中间的图像部分按照由左到右,由上到下的顺序分成两栏打印。   请问这样的表格用quickreport 怎样设计好啊? 如果有别的控件可以更好的实现也希望推荐啊
   请大家给点详细意见,本人对QR不是很熟悉,只是会用一点。
    谢谢大家了。
                      
   

解决方案 »

  1.   

    现将资料附上:  在很多有关Delphi的书籍中,都没有讲解如何实现一个打印项的多栏打印,而现实生活中往往有许多报表要求同一项目多栏打印。QuickReport提供了报表打印一整套完整的解决方案,完全可以实现同一项目的多栏打印。   如果在Treport的DataSet属性中选定一个Table,那么QuickReport每次打印详细列表(BandType=rbDetail)属性的TQRBand时,系统会自动取出一个记录供打印,并将表中的记录指针移到下一位,这样程序无法控制表中记录指针的移动,就无法实现多栏打印。因此,只要程序不在Treport的DataSet属性选定任何表, QuickReport便不会控制表记录的提取。   QuickReport特为其它类型数据打印提供了一个OnNeedData事件,QuickReport每次打印详细列表属性的TQRBand时,会触发这个事件,要求提供打印数据,如果程序在OnNeedData事件中编写运用表中数据提供打印资料,便能实现多栏打印。现例举实现一个Table1中Name项两栏打印的方法。   1.在窗口上放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 2 do    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;   2. 为了保证打印或者打印预览开始时Table1指针在第一条记录,在quickReport1的BeforePrint事件中写如下代码:   procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;    var PrintReport: Boolean);   begin    Table1.First;   end;   这样,程序调用QuickRep1.Preview或者QuickRep1.Print便能预览或者打印到一个关于Name的从左至右、从上到下的多栏报表。
      

  2.   

    谢谢各位的捧场,特别是Pengxuan先生的解答,根据你的回答可以很好的实现了记录的分栏。但还是有点问题无法解决。即最后一个图像无法显示。假如我有20副图像,打印预览的时候只能看到19副。我已经把adoquery2.first放在beforeprint的事件里面了。加载图像的代码如下,请大家指教:procedure TRepForm.QuickRep1NeedData(Sender: TObject;
      var MoreData: Boolean);
      var
      I,k:Integer ;
      str:string ;
    begin
       k:=adoquery2.RecNo ;
       moredata:=true ;
       for I:=1 to 2 do
        begin
        if adoquery2.Eof then break ;
        case I of
        1: begin
             str:=adoquery2.fieldbyname('ClientFilePath').asstring;
             DoReportform.ezdicomax1.Openfile(str);
             qrimage1.Picture:=DoReportform.ezDICOMax1.Image.Picture ;
             qrlabel16.Caption:=‘图’+intTostr(k) ;
             end;
        2:begin
             str:=adoquery2.fieldbyname('ClientFilePath').asstring;
             DoReportform.ezdicomax1.Openfile(str);
             qrimage2.Picture:=DoReportform.ezDICOMax1.Image.Picture ;
             qrlabel17.Caption:=‘图’+intTostr(k+1) ;
             end;     end; //end case
         adoquery2.Next ;
         end;
         if adoquery2.Eof then MoreData:=false ;
      end;
      

  3.   

    我把 for I:=0 to 2 do 改成了 for I:=1 to 2 do ,否则第一副图片无法显示。