お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"StringGrid (行一定・n列)印刷"

この発言に対し以下のコメントが寄せられています
#00288 Athena さん StringGrid (n列)印刷

■行一定・列不定のStringGrid印刷 ■Form1にStringGrid1つ、Button1つ。usesにPrintersを追加。  サンプルの設定  ・StringGridは固定列・固定行とも1としています。  ・行高、列幅(固定列除く)は一定。  ・固定行・固定列では文字を中央寄せ、それ以外は右寄せ。  ・1ページに収める列数・TopMargin・LineHeight・LeftMarginは   お好みで調節して下さい(^^; ■コード  //-------------------------------------------------------------------- type TForm1 = class(TForm)  ・ private { Private 宣言 } procedure GridPrint(Grid:TStringGrid;PageCol:Integer); public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.GridPrint(Grid:TStringGrid;PageCol:Integer); var C,R,C0,C1,CC,RC,W,ColW,ColNum,PageNum,PageCount,PrintCol:Integer; LM,TM,LH,X,Y:Integer; XX,YY,PX:Double; begin CC:=Grid.ColCount; RC:=Grid.RowCount; PageCount:=(CC-1) div PageCol ; //プリントページ数 if ((CC-1) mod PageCol)<> 0 then PageCount:= PageCount+1; PX:=(PixelsPerInch / 96);//96は設計時のPixelsPerInch Printer.Orientation:=poLandscape;//印刷方向(横置き) with Printer do begin BeginDoc; XX:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSX)/ getDeviceCaps(Grid.Canvas.handle,LOGPIXELSX); YY:=getDeviceCaps(Printer.Canvas.handle,LOGPIXELSY)/ getDeviceCaps(Grid.Canvas.handle,LOGPIXELSY); TM := Round(120 * YY * PX);//TopMargin LH := Round(20 * YY * PX); //LineHeight LM := Round(40 * XX * PX); //LeftMargin C0:= Trunc(Grid.ColWidths[0]*XX); //固定列幅 C1:= Trunc(Grid.ColWidths[1]*XX); //列幅 W:=Trunc(3*XX); //横余白調節用 Y:=(LH - Canvas.TextHeight('W')) div 2 ; // 縦余白調節用 for PageNum:= 1 to PageCount do begin if (PageNum=PageCount) and (((CC-1) mod PageCol)<> 0)then PrintCol:=(CC-1) mod PageCol //最終ページ印刷列数 else //(固定列除く) PrintCol:= PageCol; ColW:=C0+C1*PrintCol ; for R:= 0 to RC-1 do //固定列テキスト begin X:=(C0-Canvas.TextWidth(Grid.Cells[0,R])) div 2 ; Canvas.TextOut(LM + X,R*LH+TM+Y,Grid.Cells[0,R]); end; for C:= 1 to PrintCol do begin ColNum:=((PageNum-1) * PageCol)+C; //印刷列(テキスト) for R:= 0 to RC-1 do begin if (R=0)then //固定行テキスト X:=(C1-Canvas.TextWidth(Grid.Cells[ColNum,R]))div 2 else X:=(C1-Canvas.TextWidth(Grid.Cells[ColNum,R]))-W ; Canvas.TextOut(LM +C0+(C-1)*C1+X,R*LH+TM+Y, Grid.Cells[ColNum,R]); end; end; Canvas.Pen.Width:=5; Canvas.MoveTo(LM,TM);//枠 Canvas.LineTo(LM+ColW,TM); Canvas.LineTo(LM+ColW,TM+(LH*RC)); Canvas.LineTo(LM,TM+(LH*RC)); Canvas.LineTo(LM,TM); Canvas.MoveTo(LM,TM+LH); Canvas.LineTo(LM+ColW,TM+LH); Canvas.MoveTo(LM+C0,TM); Canvas.LineTo(LM+C0,TM+(LH*RC)); Canvas.Pen.Width:=1; for C:=1 to PrintCol-1 do begin Canvas.MoveTo(LM+C0+C1*C,TM); Canvas.LineTo(LM+C0+C1*C,TM+(LH*RC)); end; for R:= 1 to RC-1 do begin Canvas.MoveTo(LM,TM+LH*R); Canvas.LineTo(LM+ColW,TM+(LH*R)); end; if PageNum<>PageCount then NewPage; end; EndDoc; end; end; procedure TForm1.Button1Click(Sender: TObject); begin GridPrint(StringGrid1,10);//1ページに固定列+10列印刷 end; end. //------------------------------------------------------------------ _/_/ Athena ( VYH00522 ) _/_/ Original document by Athena 氏 ID:(VYH00522)



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

Copyright 1996-2002 Delphi Users' Forum