有哪位知道,怎样将stringgrid上的数据打印出来啊!期待中...

解决方案 »

  1.   

    可以考虑用QReport/FastReport控件来打印。不过,需要自已写一些代码来控制。
      

  2.   

    有没有办法直接从stringgrid中打印出来呢?
      

  3.   

    uses 
      printers; procedure PrintStringGrid(Grid: TStringGrid; Title: string; 
      Orientation: TPrinterOrientation); 
    var 
      P, I, J, YPos, XPos, HorzSize, VertSize: Integer; 
      AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer; 
      mmx, mmy: Extended; 
      Footer: string; 
    begin 
      HeaderSize := 100; 
      FooterSize := 200; 
      ZeilenSize := 36; 
      FontHeight := 36;   Printer.Orientation := Orientation; 
      Printer.Title  := Title; 
      Printer.BeginDoc; 
      mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) / 
        GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4; 
      mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) / 
        GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;   VertSize := Trunc(mmy) * 10; 
      HorzSize := Trunc(mmx) * 10; 
      SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);   Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize; 
      if Grid.RowCount mod Zeilen <> 0 then 
        AnzSeiten := Grid.RowCount div Zeilen + 1 
      else 
        AnzSeiten := Grid.RowCount div Zeilen;   Seite := 1; 
      for P := 1 to AnzSeiten do 
      begin 
        Printer.Canvas.Font.Height := 48; 
        Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)), 
          - 20,Title); 
        Printer.Canvas.Pen.Width := 5; 
        Printer.Canvas.MoveTo(0, - HeaderSize); 
        Printer.Canvas.LineTo(HorzSize, - HeaderSize); 
        Printer.Canvas.MoveTo(0, - VertSize + FooterSize); 
        Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize); 
        Printer.Canvas.Font.Height := 36; 
        Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten); 
        Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)), 
          - VertSize + 150,Footer); 
        Printer.Canvas.Font.Height := FontHeight; 
        YPos := HeaderSize + 10; 
        for I := 1 to Zeilen do 
        begin 
          if Grid.RowCount >= I + (Seite - 1) * Zeilen then 
          begin 
            XPos := 0; 
            for J := 0 to Grid.ColCount - 1 do 
            begin 
              Printer.Canvas.TextOut(XPos, - YPos, 
                Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]); 
              XPos := XPos + Grid.ColWidths[J] * 3; 
            end; 
            YPos := YPos + ZeilenSize; 
          end; 
        end; 
        Inc(Seite); 
        if Seite <= AnzSeiten then Printer.NewPage; 
      end; 
      Printer.EndDoc; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      PrintStringGrid(Grid, 'StringGrid Print Landscape', poLandscape); 
      PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait); 
    end; (注:別人作的、提供参考)