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
|