StringGrid用TPrint列印問題 |
尚未結案
|
narcysion
一般會員 發表:54 回覆:18 積分:14 註冊:2003-03-14 發送簡訊給我 |
我的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 發送簡訊給我 |
這裡小弟利用了一個暫時的 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 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |