由于显示的字段少,为了节省空间,一两列方式显示。现在我知道把QuickRep1.page.columns 设置成2,能够实现一两列方式显示,但是其中有一点它是先显示左边一列,显示满了,再显示右边一列,如果显示到右边时,只有几列的情况说浪费谈不上,但是报表不是很好看。
问一下,能不能这样显示:左边显示一行,右边显示一行,然后再左边显示一行,再右边显示一行。,这样下去,最终左右两边最多只能差一行,图例如下:
编号         名字        编号          名字
1             a           2              b
3             c           4              d
5             e
。。
请问这样的形式,quickrep1能不能实现?如何设置属性或程序?
最好给出具体实现方式。

解决方案 »

  1.   

    在QR的ON NEEDDATA事件中判断、赋值
      

  2.   

    有过类似的情况,不过我那是收费单,所以我采用的方法是直接缩小纸张高度,使quickrep的纸张大小限定每张纸只能打印一行数据,然而使用时是挂接宽行穿孔打印纸,连续走纸这样就能得到左一右一的格式,不过不知道是否在你这里适用,仅做个参考吧。
      

  3.   

    to  comerliang(天地良心)
    补足多余空行不是办法,我所要的是那种格式并且怎么来实现
    to mrfanghansheng(☆☆☆木鱼☆☆☆) 
    你所说的缩纸,不合我意,因为我所要的A4纸,纸张大小已经固定,为了充分利用纸张的目的我想采用我所说的那种格式,题意我已经说明,先左后右的方式现在能够实现,但是要是采用左一右一的方式,怎么来实现?
      

  4.   

    用Printer.Canvas.TextOut画不更好!
    function TPrintCardForm.PrintProc(aBingMa: Integer): string;
    var
      PDevice, PDriver, pPort: array[0..255] of Char;
      hDMode: THandle;
      PDMode: PDeviceMode;
      Y: Integer;
      vFlag: Integer;
      i: Integer;
    begin
      vFlag := 0;
      QryPatient.First;
      while not QryPatient.Eof do
      begin
        if QryPatient.FieldByName('Selected').AsString = '√' then
        begin
          CreateTempTable;
          with QryBm do
          begin
            First;
            while not Eof do
            begin
              for i := 1 to FieldByName('ShuLiang').AsInteger do
              begin
                if vFlag = 0 then
                begin
                  //获得打印机的DeviceMode结构句柄
                  Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
                  //如果句柄为0,表示打印机没有装载
                  if hDMode = 0 then
                  begin
                    Printer.PrinterIndex := Printer.PrinterIndex;
                    Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
                  end;
                  if hDMode <> 0 then
                  begin
                    //根据TDeviceMode的句柄获得指向该结构的指针变量
                    PDMode := GlobalLock(hDMode);
                    if PDMode <> nil then
                      with PDMode^ do
                      begin
                        DMFields := DMFields or DM_PAPERLENGTH;
                        dmPaperLength := 700; //设置打印页长
                        dmFields := dmFields or DM_PAPERWIDTH;
                        dmPaperWidth := 2100; //设置打印页宽
                      end;
                    GlobalUnLock(hDMode); //解锁,释放内存
                    Printer.PrinterIndex := Printer.PrinterIndex;
                  end;
                  Printer.Canvas.font.Name := '宋体';
                  Printer.BeginDoc; //开始打印
                  Printer.Canvas.font.Size := 11;
                  Printer.Canvas.TextOut(50, 70,
                    QryPatient.FieldByName('XingMing').AsString);
                  Printer.Canvas.TextOut(200, 70,
                    QryPatient.FieldByName('ChuangHao').AsString);
                  Printer.Canvas.TextOut(250,70,
                    QryPatient.FieldByName('ZhuYuanHao').AsString);
                  Printer.Canvas.font.Size := 9;
                  Printer.Canvas.TextOut(350, 100,
                    '┌──┬──┬──┬──┬──┐');
                  Printer.Canvas.TextOut(350, 120,
                    '│   │  │  │  │  │');
                  Printer.Canvas.TextOut(350, 280,
                    '└──┴──┴──┴──┴──┘');
                  Printer.Canvas.TextOut(375, 115, '编号');
                  Printer.Canvas.TextOut(375, 140, '名字');
                  Y := 120;
                  Printer.Canvas.font.Size := 10;
                  with QryDoctorAdvice do
                  begin
                    First;
                    while not Eof do
                    begin
                      if FieldByName('BingMa').AsInteger =
                        QryBM.FieldByName('BingMa').AsInteger then
                      begin
                        Printer.Canvas.TextOut(5, Y,
                          FieldByName('YiZhuMS').AsString);
                        Printer.Canvas.TextOut(250, Y,
                          FieldByName('JiLiang').AsString);
                        Y := Y + 40;
                      end;
                      Next;
                    end;
                  end;
                  vFlag := 1;
                end
                else
                begin
                  Printer.Canvas.font.Size := 11;
                  Printer.Canvas.TextOut(800, 70,
                    QryPatient.FieldByName('XingMing').AsString);
                  Printer.Canvas.TextOut(950, 70,
                    QryPatient.FieldByName('ChuangHao').AsString);
                  Printer.Canvas.font.Size := 9;
                  Printer.Canvas.TextOut(1080, 100,
                    '┌──┬──┬──┬──┬──┐');
                  Printer.Canvas.TextOut(1080, 260,
                    '│   │  │  │  │  │');
                  Printer.Canvas.TextOut(1080, 280,
                    '└──┴──┴──┴──┴──┘');
                  Printer.Canvas.TextOut(1105, 115, '编号');
                  Printer.Canvas.TextOut(1105, 115, '名字');
                  Y := 120;
                  Printer.Canvas.font.Size := 10;
                  with QryDoctorAdvice do
                  begin
                    First;
                    while not Eof do
                    begin
                      if FieldByName('BingMa').AsInteger =
                        QryBM.FieldByName('BingMa').AsInteger then
                      begin
                        Printer.Canvas.TextOut(750, Y,
                          FieldByName('YiZhuMS').AsString);
                        Printer.Canvas.TextOut(1000, Y,
                          FieldByName('JiLiang').AsString);
                        Y := Y + 40;
                      end;
                      Next;
                    end;
                  end;
                  Printer.EndDoc; //结束打印
                  vFlag := 0;
                end
              end;
              Next;
            end;
          end;
        end;
        QryPatient.Next;
      end;
      if vFlag=1 then Printer.EndDoc; //结束打印
    end;