我有一個套入打印程式,現調試好表頭,明細內容卻在表頭上面,它不是接在表頭下面開始列印而是從紙張的第一行開始列印。代碼如下,請幫忙糾正:
procedure TMainForm.PrintLine(Items: TStringList);
var
  OutRect: TRect;
  Inches: double;
  i: integer;
begin
  OutRect.Left := 0;
  OutRect.Top :=AmountPrinted;
  OutRect.Bottom := OutRect.Top + LineHeight;
  With Printer.Canvas do
    for i := 0 to Items.Count - 1 do
    begin
      Inches := longint(Items.Objects[i]) * 0.1;
      OutRect.Right := OutRect.Left + round(PixelsInInchx*Inches);
      if not Printer.Aborted then
        TextRect(OutRect, OutRect.Left, OutRect.Top, Items[i]);
      OutRect.Left := OutRect.Right;
    end;
  AmountPrinted := AmountPrinted+ TenthsOfInchPixelsY*2;
end;procedure TMainForm.PrintClick(Sender: TObject);
var
  Items: TStringList;
begin
  Items := TStringList.Create;
  try
    PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,
                            LOGPIXELSY) div 10;
    AmountPrinted := 0;
    MainForm.Enabled := false; // Disable the parent form
    try
      Printer.BeginDoc;
      AbortForm.Show;
      Application.ProcessMessages;
      LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY;
      if edtHeaderFont.Text <> '' then
         Printer.Canvas.Font.Name:='宋体';
         Printer.Canvas.Font.Size:=12;
         Printer.Canvas.TextOut(100,400,edit1.text);
         Printer.Canvas.TextOut(100,460,edit2.text);
         Printer.Canvas.TextOut(200,520,edit3.text);
         Printer.Canvas.TextOut(800,520,edit4.text);
         Printer.Canvas.TextOut(1600,520,edit5.text);
        PrintColumnNames;
      ADOTable1.First;
      while (not ADOTable1.Eof) or Printer.Aborted do
      begin        Application.ProcessMessages;
        with Items do
        begin
          AddObject(ADOTable1.FieldByName('fallorder_code').AsString,
                        pointer(10));
          AddObject(ADOTable1.FieldByName('fallorder_name').AsString,
                        pointer(10));
          AddObject(ADOTable1.FieldByName('fallorder_dec').AsString,
                        pointer(10));
          AddObject(ADOTable1.FieldByName('fallorder_num').AsString,
                        pointer(10));
          AddObject(ADOTable1.FieldByName('fallorder_customer').AsString,
                        pointer(10));
          AddObject(ADOTable1.FieldByName('fallorder_memo').AsString,
                        pointer(10));
        end;
        PrintLine(Items);
        if AmountPrinted + LineHeight > Printer.PageHeight then
        begin
          AmountPrinted := 0;
          if not Printer.Aborted then
            Printer.NewPage;
         Printer.Canvas.Font.Name:='宋体';
         Printer.Canvas.Font.Size:=12;
         Printer.Canvas.TextOut(100,400,edit1.text);
         Printer.Canvas.TextOut(100,460,edit2.text);
         Printer.Canvas.TextOut(200,520,edit3.text);
         Printer.Canvas.TextOut(800,520,edit4.text);
         Printer.Canvas.TextOut(1600,520,edit5.text);
          PrintColumnNames;
        end;
        Items.Clear;
        ADOTable1.Next;
      end;
      AbortForm.Hide;
      if not Printer.Aborted then
        Printer.EndDoc;
    finally
      MainForm.Enabled := true;
    end;
  finally
    Items.Free;
  end;
end;

解决方案 »

  1.   

    PrintColumnNames;
    这个过程有问题吧。不就是些坐标吗?你自己看清楚不就行了,纵坐标由小到大代表由上到下。
    设几个断点,一下就查出来了。
      

  2.   

    刚做的一个控件
    http://www.chinahdc.com/download/software/pjprint.rar
      

  3.   

    PrintColumnNames;这个过程我把它注释掉也一样,应该是没问题?是不是PrintLine(Items);这一条有问题?其原因大概表头不是从画布的开始处开始,而PrintLine(Items);是从画布的开始处显示,当显示到被表头占用的地方时数据就被表头的内容覆盖掉,导致无法显示。
      

  4.   

    procedure TMainForm.PrintLine(Items: TStringList);
    begin
      ...
      OutRect.Top :=AmountPrinted;
      ...
    end;似乎应该写成OutRect.Top:=AmountPrinted+XXXX;
    XXXX是一个数字,由于你的表头是在520的高度处画的,要使数据画到表头下面,这个数字要大于520,可以自己调整,也可以用520+Printer.Canvas.TextHeight('xxx')的方式来计算。
      

  5.   

    tonylk(=www.tonixsoft.com=):这个方法我用过,我直接赋给OutRect.Top :=600也还是一样,有谁有成功的源代码,能给我看看吗?我的QQ是314464916
      

  6.   

    tonylk(=www.tonixsoft.com=):我用
    ....
    PrintLine(Items);
            if AmountPrinted + LineHeight+1000 > Printer.PageHeight then
            begin
              AmountPrinted := 0;
              if not Printer.Aborted then
                Printer.NewPage;
       ....
    怎麼不能自動分頁,我現在的列出來的格式是:
    料號     品名規格       數量     單位    交貨日期
    0001     ****1 ***AAA     1       PCS    ********
    0002         ****2  ***BBB         1           PCS       ********
    我想它顯示成
    料號     品名規格       數量     單位    交貨日期
    0001     ****1          1PCS                    ********
           ***AAA
    0002         ****2                1PCS                    *********
                 ***BBB
    也就是品名規格分兩欄,數量與單位合成一列,一頁列印15行後自動分頁。請指教
      

  7.   

    ksaiy(消失在人海):在大家的幫助下現在列印格式問題基本上是克服了,現在的問題時,不能自動分頁,和分欄,合併列,現就是怎樣設置紙張的尺寸,因為我們是三頁訂單,紙張不是標准的A4紙,這樣連打時第二頁就套不上格式。請指教,如果分不夠我另開一個貼,希望你能幫我解決,非常感謝你的支持。