線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1367
推到 Plurk!
推到 Facebook!

Printer的問題~

尚未結案
narcysion
一般會員


發表:54
回覆:18
積分:14
註冊:2003-03-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-01 17:24:58 IP:61.59.xxx.xxx 未訂閱
問題一: 我是要印出StringGrid裡面的資料, 但由於資料量大,所以印出來一定會超出一頁以上 但下面程式碼就只能印出一頁而已~ 請教各位大大,我該如何改程式碼呢? 問題二: 請教一下哦~StringGrid的列印就只能印出裡面的值嗎? 可不可以連週圍框線都印出來~ ================================== procedure PrintGrid(sGrid: TStringGrid; sTitle: String); var X1, X2 : Integer; Y1, Y2 : Integer; TmpI : Integer; F : Integer; TR : TRect; begin //=====列印表頭開始=== Printer.Title:=sTitle; Printer.Orientation := poLandscape; Printer.BeginDoc; Printer.Canvas.Pen.Color:=0; Printer.Canvas.Font.Name:='Times New Roman'; Printer.Canvas.Font.Size:=12; Printer.Canvas.Font.Style:=[fsBold, fsUnderline]; Printer.Canvas.TextOut(2900, 0, Printer.Title); //=====列印表頭結束=== For F:=0 to sGrid.ColCount-1 do begin X1:=0; For TmpI:=1 to F do X1:=X1 5*(sGrid.ColWidths[TmpI]); Y1:=150; X2:=0; For TmpI:=1 to (F 1) do X2:=X2 5*(sGrid.ColWidths[TmpI]); Y2:=290; TR:=Rect(X1, Y1, X2-30, Y2); Printer.Canvas.Font.Style:=[fsBold]; Printer.Canvas.Font.Size:=10; Printer.Canvas.TextRect(TR, X1 50, 180, sGrid.Cells[F, 0]); Printer.Canvas.Font.Style:=[]; For TmpI:=1 to sGrid.RowCount-1 do begin Y1:=100* TmpI 200; Y2:=100*(TmpI 1) 200; TR:=Rect(X1, Y1, X2-30, Y2); Printer.Canvas.TextRect(TR, X1 50, Y1, sGrid.Cells[F, TmpI]); end; end; Printer.EndDoc; end; procedure TMainForm.SpeedButton3Click(Sender: TObject); begin PrintGrid(StringGrid,TRIM(MainDB.zFuncName)); end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-01 18:55:42 IP:202.39.xxx.xxx 未訂閱
參考這篇試試: http://www.swissdelphicenter.ch/torry/showcode.php?id=1577 1.參考 NewPage 部份 2.參考 MoveTo / LineTo 部份
uses 
  printers;     //StringGrid Inhalt ausdrucken 
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 
  //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen 
  HeaderSize := 100; 
  FooterSize := 200; 
  ZeilenSize := 36; 
  FontHeight := 36; 
  //Printer initializieren 
  Printer.Orientation := Orientation; 
  Printer.Title  := Title; 
  Printer.BeginDoc; 
  //Druck auf mm einstellen 
  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);       //Zeilenanzahl festlegen 
  Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize; 
  //Seitenanzahl ermitteln 
  if Grid.RowCount mod Zeilen <> 0 then 
    AnzSeiten := Grid.RowCount div Zeilen   1 
  else 
    AnzSeiten := Grid.RowCount div Zeilen;       Seite := 1; 
  //Grid Drucken 
  for P := 1 to AnzSeiten do 
  begin 
    //Kopfzeile 
    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); 
    //Fußzeile 
    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); 
    //Zeilen drucken 
    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; 
    //Seite hinzufügen 
    Inc(Seite); 
    if Seite <= AnzSeiten then Printer.NewPage; 
  end; 
  Printer.EndDoc; 
end;     //Example 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  //Drucken im Querformat 
  PrintStringGrid(Grid, 'StringGrid Print Landscape', poLandscape); 
  //Drucken im Hochformat 
  PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait); 
end; 
-- 歡迎光臨 KTop 研究院!
系統時間:2024-05-17 16:25:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!