お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"StringGrid (n列)印刷"

この発言は
#00286 Athena さんのStringGrid (行一定・n列)印刷
に対するコメントです

■StringGrid印刷(列数不定場合)  goColSizingが Trueでも可としました。  ただし、行余りは無視ですm(_ _)m ■Form1にStringGrid1つ、Button1つ。usesにPrintersを追加。  サンプルの設定  ・StringGridは固定列・固定行とも1としています。  ・固定行・固定列では文字を中央寄せ、それ以外は右寄せ。 ■コード  //-------------------------------------------------------------------- type TForm1 = class(TForm)  ・ private { Private 宣言 } procedure GridPrint(Grid:TStringGrid); public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.GridPrint(Grid:TStringGrid); var ColW,ColNum,PrintW,PageW,GridHeight:Integer; C,R,C0,R0,CC,RC,W,LM,TM,LH,RM,X,Y:Integer; XX,YY,mmX,mmY:Double; procedure FixedColDraw; var R:Integer; begin with Printer do begin Canvas.Pen.Width:=1; LH:=0; for R:= 0 to RC-1 do //固定列テキスト begin Y:=(Round(Grid.RowHeights[R]*YY) -Canvas.TextHeight('W')) div 2 ; X:=(C0-Canvas.TextWidth(Grid.Cells[0,R])) div 2 ; Canvas.TextOut(LM+X,LH+TM+Y,Grid.Cells[0,R]); Canvas.MoveTo(LM,TM+LH); Canvas.LineTo(LM+C0,TM+LH); LH:=LH+(Round(Grid.RowHeights[R]*YY)); end; Canvas.Pen.Width:=5; Canvas.MoveTo(LM,TM); Canvas.LineTo(LM,TM+GridHeight); Canvas.MoveTo(LM+C0,TM); Canvas.LineTo(LM+C0,TM+GridHeight); Canvas.MoveTo(LM,TM); Canvas.LineTo(LM+C0,TM); Canvas.MoveTo(LM,TM+R0); Canvas.LineTo(LM+C0,TM+R0); Canvas.MoveTo(LM,TM+GridHeight); Canvas.LineTo(LM+C0,TM+GridHeight); end; end; begin CC:=Grid.ColCount; RC:=Grid.RowCount; Printer.Orientation:=poLandscape; with Printer do begin BeginDoc; //mm換算用 mmX:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSX)/25.4; mmY:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSY)/25.4; XX:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSX)/ getDeviceCaps(Grid.Canvas.handle,LOGPIXELSX); YY:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSY)/ getDeviceCaps(Grid.Canvas.handle,LOGPIXELSY); TM := Round(30 * mmY);//TopMargin 30mm LM := Round(20 * mmX); //LeftMargin 20mm RM := Round(20 * mmX); //RightMargin 20mm C0 := Trunc(Grid.ColWidths[0]*XX); //固定列幅 R0 := Round(Grid.RowHeights[0]*YY) ; //固定行高 for R := 0 to RC-1 do GridHeight:= GridHeight+Round(Grid.RowHeights[R]*YY); PageW := PageWidth-RM-LM; W := Trunc(1*mmX); //横余白調節用 1mm PrintW := C0; FixedColDraw; for ColNum:= 1 to CC-1 do begin ColW:=Round(Grid.ColWidths[ColNum]*XX); LH:=0; for R:= 0 to RC-1 do begin // Y 縦余白調節用 Y:=(Round(Grid.RowHeights[R]*YY) - Canvas.TextHeight('W')) div 2 ; if R=0 then X:=(ColW-Canvas.TextWidth(Grid.Cells[ColNum,R]))div 2 else X:=(ColW -Canvas.TextWidth(Grid.Cells[ColNum,R]))-W ; Canvas.TextOut(LM+PrintW+X,LH+TM+Y, Grid.Cells[ColNum,R]); Canvas.Pen.Width:=1; Canvas.MoveTo(LM+PrintW,TM+LH); Canvas.LineTo(LM+PrintW+ColW,TM+LH); LH:=LH+(Round(Grid.RowHeights[R]*YY)); end; Canvas.Pen.Width:=5; Canvas.MoveTo(LM+PrintW,TM); Canvas.LineTo(LM+PrintW+ColW,TM); Canvas.MoveTo(LM+PrintW,TM+R0); Canvas.LineTo(LM+PrintW+ColW,TM+R0); Canvas.MoveTo(LM+PrintW,TM+GridHeight); Canvas.LineTo(LM+PrintW+ColW,TM+GridHeight); Canvas.Pen.Width:=1; Canvas.MoveTo(LM+PrintW+ColW,TM); Canvas.LineTo(LM+PrintW+ColW,TM+GridHeight); if (ColNum<>CC-1) and(PrintW+ColW+Round(Grid.ColWidths[ColNum+1]*XX)>PageW )then begin Canvas.Pen.Width:=5; Canvas.MoveTo(LM+PrintW+ColW,TM); Canvas.LineTo(LM+PrintW+ColW,TM+GridHeight); NewPage; FixedColDraw; PrintW:=C0; end else if ColNum=CC-1 then begin Canvas.Pen.Width:=5; Canvas.MoveTo(LM+PrintW+ColW,TM); Canvas.LineTo(LM+PrintW+ColW,TM+GridHeight); end else PrintW:=PrintW+ColW; end; EndDoc; end; end; procedure TForm1.Button1Click(Sender: TObject); begin GridPrint(StringGrid1);//印刷 end; end. //-------------------------------------------------------- _/_/ Athena ( VYH00522 ) _/_/ Original document by Athena 氏 ID:(VYH00522)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum