不太好办,请看看TPRINTER的帮助吧

解决方案 »

  1.   

    没有好办法,你只能自己分析TPrinter控件的源代码,或者直接用WinAPI写一个驱动。
      

  2.   

    procedure Tfrm_report.SBnClick(Sender: TObject); 
    var 
      Items: TStringList; 
      tt   :string; 
      i    : integer; 
    begin 
      printer.getprinter(adevice,adriver,aport,devicehandle); 
      devmode:=globallock(devicehandle); 
      with  devmode^ do 
      begin 
     
      dmfields:=dmfields; 
      dmpapersize :=DMPAPER_B4; 
     
      dmfields:=dmfields; 
      dmorientation :=dmorient_portrait; 
     
    { dmfields:=dmfields; 
      dmorientation :=dmorient_landscape; 
      dmfields:=dmfields; 
      dmpapersize :=DMPAPER_B5; 
      dmfields:=dmPaperLength; 
      dmPaperLength :=1820; 
      dmfields:=dmPaperwidth; 
      dmPaperwidth  :=2570; 

     
     
      end; 
     
       marginleft :=8; 
     
       fieldwd[0]:=2; 
       fieldwd[1]:=12; 
       fieldwd[2]:=6; 
       fieldwd[3]:=5; 
       fieldwd[4]:=6; 
       fieldwd[5]:=5; 
       fieldwd[6]:=5; 
       fieldwd[7]:=6; 
       fieldwd[8]:=5; 
       fieldwd[9]:=6; 
       fieldwd[10]:=6; 
       fieldwd[11]:=6; 
       fieldwd[12]:=6; 
       fieldwd[13]:=6; 
     
        Items := TStringList.Create; 
        // Determine pixels per inch horizontally 
        PixelsInInchx := GetDeviceCaps(Printer.Handle, LOGPIXELSX); 
        TenthsOfInchPixelsY := GetDeviceCaps(Printer.Handle,LOGPIXELSY) div 10; 
        AmountPrinted := 0; 
          Printer.BeginDoc; 
          LineHeight := Printer.Canvas.TextHeight('X')+TenthsOfInchPixelsY; 
          PrintHeader; 
          PrintColumnNames; 
          printtotal; 
          recordprinted :=1; 
          query_1.First; 
          while (not query_1.Eof) do 
          begin 
            with Items do 
            begin 
    //          AddObject(tblClients.FieldByName('ZIP').AsString, 
    //                        pointer(StrToInt(edtZip.Text))); 
              AddObject(query_1.Fields.Fields[0].AsString,pointer(fieldwd[0])); 
              AddObject(query_1.Fields.Fields[1].AsString,pointer(fieldwd[1])); 
              AddObject(query_1.Fields.Fields[2].AsString,pointer(fieldwd[2])); 
              for i := 3 to 13 do 
              begin 
              if query_1.Fields.Fields[i].asfloat <> 0 then 
                  tt:=formatfloat('0.00',query_1.Fields.Fields[i].asfloat) 
              else 
                  tt:=' '; 
              AddObject(tt,pointer(fieldwd[i])); 
              end; 
    {         AddObject(query_1.Fields.Fields[3].AsString,pointer(fieldwd[3])); 
               . 
               . 
              AddObject(query_1.Fields.Fields[13].AsString,pointer(fieldwd[13])); 
    }        end; 
            PrintLine(Items); 
            recordprinted :=recordprinted +1; 
            if recordprinted  >= 16 then 
    //        if AmountPrinted + LineHeight > Printer.PageHeight then 
            begin 
              AmountPrinted := 0; 
              Printer.NewPage; 
              PrintHeader; 
              PrintColumnNames; 
              recordprinted :=1; 
            end; 
            Items.Clear; 
            query_1.Next; 
          end; 
            Printer.EndDoc; 
        Items.Free; 
    endsSysdir和sWinDir实际上分别指window的system目录