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
|