全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1855
推到 Plurk!
推到 Facebook!

StringGrid用TPrint列印問題

尚未結案
narcysion
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-14 16:12:38 IP:61.59.xxx.xxx 未訂閱
我的StringGrid的內容如下 但列印時最左邊的Field1、Field2、Field3 ......只會在第一頁出現,如下圖的樣子 我該如何讓Field1、Field2、Field3 ......在列印新頁時,都印出來呢? 如下圖表示 我的程式碼如下: 請各位大大幫我看一下好嗎?困擾好久哦~ procedure PrintGrid(sGrid: TStringGrid; sTitle: String); var X1, X2 : Integer; Y1, Y2 : Integer; TmpI : Integer; F : Integer; TR : TRect; J : Integer; Page : String; 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(2800, 0, Printer.Title); //=====列印表頭結束=== For F:=0 to sGrid.ColCount-1 do begin if ( F = 0) then begin Printer.Canvas.Font.Style:=[]; Printer.Canvas.Font.Size:=8; Page := '第: 1 頁 '; Printer.Canvas.TextOut(Printer.PageWidth div 2 ,4600,Page); Printer.Canvas.TextOut((Printer.PageWidth div 2)+2500 ,4600,'列印日期:'+ datetostr(date)); end else if ((F<> 0) and(F MOD 7 =0)) then begin printer.NewPage; J:=F; Page := '第: ' + inttostr(printer.PageNumber) + ' 頁 ' ; Printer.Canvas.TextOut(Printer.PageWidth div 2 ,4600,Page); end ELSE J:=(F div 7) * 7; X1:=0; For TmpI:=1 to (F-J) do X1:=X1+5*(sGrid.ColWidths[TmpI]); Y1:=150; X2:=0; For TmpI:=1 to (F-J+1) do X2:=X2+5*(sGrid.ColWidths[TmpI]); Y2:=290; TR:=Rect(X1, Y1, X2+750, Y2); Printer.Canvas.Font.Style:=[fsBold]; Printer.Canvas.Font.Size:=8; Printer.Canvas.TextRect(TR, X1+100, 150, sGrid.Cells[F, 0]); Printer.Canvas.Font.Style:=[]; For TmpI:=1 to sGrid.RowCount-1 do begin Y1:=85* TmpI+150; Y2:=85*(TmpI+1)+150; TR:=Rect(X1, Y1, X2+750, Y2); Printer.Canvas.TextRect(TR, X1+100, Y1, sGrid.Cells[F, TmpI]); end; end; Printer.EndDoc; end;
hagar
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-14 22:05:42 IP:202.39.xxx.xxx 未訂閱
這裡小弟利用了一個暫時的 TStingAlignGrid,  它有個 InsertCol 的 method 可用,  用來插入要列印的 sGrid 的 Cols[0] 這欄 先把 sGrid 每個 Cells 的值填入 sgd 這個 TStringAlignGrid 中 然後計算要插入 Cols[0] 幾次 (扣掉前 7 個欄位不算, 接下來每 6 個欄位要插入一次) 插入 Cols 完畢後, 將 sGrid.Cols[0] 的每個 Row 的 Cells 填入 然後列印時, 就可以每次換頁時都可以列印到 Cols[0] 了 至於 TStringAlignGrid 可參考這篇: http://www.hoerstemeier.com/grid.htm    
procedure PrintGrid(sGrid: TStringGrid; sTitle: String);
var
  X1, X2 : Integer;
  Y1, Y2 : Integer;
  TmpI : Integer;
  F : Integer;
  TR : TRect;
  i,j,k : Integer;
  Page : String;      sgd: TStringAlignGrid;
begin
  sgd := TStringAlignGrid.Create(nil);
  try
    for i := 0 to sGrid.ColCount - 1 do
      sgd.ColWidths[i] := sGrid.ColWidths[i];
    for j := 0 to sGrid.RowCount - 1 do
      sgd.RowHeights[j] := sGrid.RowHeights[j];        // 將 sGrid 的 Cells 值填入 sgd 中
    for i := 0 to sGrid.ColCount - 1 do
      for j := 0 to sGrid.RowCount - 1 do
        sgd.Cells[i, j] := sGrid.Cells[i, j];        i := (sGrid.ColCount - 1) div 6; // 判斷要插入 Cols[0] 幾次
    for j := 1 to i do
    begin
      sgd.InsertCol(7*j);
      for k := 0 to sGrid.RowCount - 1 do
        sgd.Cells[7*j, k] := sGrid.Cells[0, k]; // 將插入的 Col 填入 Field1, Field2 .. 等值
    end;        //=====列印表頭開始===
    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(2800, 0, Printer.Title);
    //=====列印表頭結束===
    For F:=0 to sgd.ColCount-1 do
    begin
      if ( F = 0) then
      begin
        Printer.Canvas.Font.Style:=[];
        Printer.Canvas.Font.Size:=8;
        Page := '第: 1 頁 ';
        Printer.Canvas.TextOut(Printer.PageWidth div 2 ,4600,Page);
        Printer.Canvas.TextOut((Printer.PageWidth div 2) 2500 ,4600,'列印日期:'  datetostr(date));
      end
      else
      begin
        if ((F<> 0) and(F MOD 7 =0)) then
        begin
          printer.NewPage;
          J:=F;
          Page := '第: '   inttostr(printer.PageNumber)   ' 頁 ' ;
          Printer.Canvas.TextOut(Printer.PageWidth div 2 ,4600,Page);
        end
        ELSE
          J:=(F div 7) * 7;
      end;          X1:=0;
      For TmpI:=1 to (F-J) do X1:=X1 5*(sgd.ColWidths[TmpI]);
      Y1:=150;
      X2:=0;
      For TmpI:=1 to (F-J 1) do X2:=X2 5*(sgd.ColWidths[TmpI]);
      Y2:=290;
      TR:=Rect(X1, Y1, X2 750, Y2);
      Printer.Canvas.Font.Style:=[fsBold];
      Printer.Canvas.Font.Size:=8;
      Printer.Canvas.TextRect(TR, X1 100, 150, sgd.Cells[F, 0]);          Printer.Canvas.Font.Style:=[];
      For TmpI:=1 to sgd.RowCount-1 do
      begin
        Y1:=85* TmpI 150;
        Y2:=85*(TmpI 1) 150;
        TR:=Rect(X1, Y1, X2 750, Y2);
        Printer.Canvas.TextRect(TR, X1 100, Y1, sgd.Cells[F, TmpI]);
      end;
    end;
    Printer.EndDoc;
  finally
    FreeAndNil(sgd);
  end;
end;
narcysion
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-15 11:38:14 IP:61.59.xxx.xxx 未訂閱
你好,我按照您的方法,修改程式,會出現下列錯誤訊息, Undeclared identifier 'TstringAlignGrid' 請問我是不是該在uses那邊加入什麼,還是一定要您說的網址下載元件,才不會出現錯誤訊息。
hagar
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-15 12:10:00 IP:202.39.xxx.xxx 未訂閱
是的, 請下載 TStringAlignGrid 並安裝使用
系統時間:2017-10-23 5:07:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!