stringgrid的打印

      控件使用 2006-2-23 13:11
四种方法:
第一种:
{*************StringGrid打印功能***********************************}
(*uses unit: FR_Class, FR_View from (fast-Report) *)
(*参数说明:printRow:每页打印的行数 *)
(* styleType:边框类型 0:无边框,15:所有边框,18:底部画线 *)
(* title:标题 *)
(* FrmGrid:所在窗体 *)
(*date:2005-04-24 *)
(*author:kxy *)
{******************************************************************}
function GridPrint(Grid1:TstringGrid;printRow,StyleType:integer;Title:string;FrmGrid:TForm):boolean;//打印报表
var
fr: TfrReport;
ReportTitle,Masterdata,ColumnHeader,PageHeader,pageFooter:Tfrbandview; //栏目
MemoVT,MemoVC:Array of TfrMemoview; //列
TitleV ,dateV,pageV:TfrMemoview ;
lineV:TfrlineView; //线
page:Tfrpage; //页
GridRow,GridCol,CurrRow,I,J,col:integer;//总的行数,列数,当前行
PageCount,pageRow:integer; //总共页数;
Left,Top,Width,Heigth:integer;
TempLeft,TempWidth:integer;
printDate :string;
begin
screen.Cursor := crHourGlass;
GridRow := Grid1.RowCount;
GridCol := Grid1.ColCount;
CurrRow := 0;
pageRow := printRow;
try
fr := TfrReport.Create(FrmGrid);
fr.StoreInDFM := True;
PageCount := GridRow div printRow ; //计算出页数
for I := 0 to PageCount - 1 do
begin
left :=0;
top :=20;
width :=757;
heigth :=25;
fr.Pages.Add;
page := fr.Pages[i];
if I = 0 then //第一页增加标题;
begin
{标题栏}
ReportTitle := Tfrbandview.Create;
ReportTitle.BandType := btReportTitle;
ReportTitle.SetBounds(left,top,width,40);
page.Objects.Add(ReportTitle);
TitleV := TfrMemoview.Create;
Titlev.SetBounds(0,top,width,30);
Titlev.Alignment := (Titlev.Alignment and $ FC) + 2;//居中
Titlev.Font.Name := '宋体';
TitleV.Font.Size := 16;
TitleV.Memo.Add(title);
page.Objects.Add(TitleV);
{打印日期}
dateV := TfrMemoview.Create;
dateV.SetBounds(0,top + 40,width,30);
dateV.Alignment := (dateV.Alignment and $ FC) + 1 ;//右对齐
dateV.Font.Name := '宋体';
dateV.Font.Size := 9;
printDate :='打印日期:' + FormatDateTime('yyyy/mm/dd',Now) +' ';
dateV.Memo.Add(printDate);
page.Objects.Add(dateV);
PageRow := PageRow - 4 ; //少打两行组成一个标题
Top := 60;
end
ELSE
begin
pageRow := PrintRow;
Top := 20;
end;
for J:= 0 to PageRow + 1 do //每页的行数
begin
{列头}
IF J = 0 then //第一行打行列标题栏
begin
ColumnHeader := Tfrbandview.Create;
ColumnHeader.BandType := btColumnHeader;
ColumnHeader.SetBounds(left,top,width,heigth);
page.Objects.Add(ColumnHeader);
SetLength(MemoVT,GridCol);
TempLeft := 20;
for col:= 0 to GridCol - 1 do
begin
MemoVt[col] := TfrMemoview.Create;
MemoVt[col].Font.Name := Grid1.Font.Name;
MemoVt[col].Font.Size := Grid1.Font.Size;
MemoVt[col].Memo.Add(Grid1.Cells[col,0]);
MemoVt[col].FrameTyp := StyleType; //显示边框
TempWidth := Grid1.ColWidths[col]; //宽度与Grid中的宽度一致
MemoVt[col].SetBounds(tempLeft,top ,tempWidth,heigth);
templeft := tempLeft + tempwidth;
page.Objects.Add(MemoVt[col])
end;
end
Else
begin
top := top + heigth;
Inc(CurrRow);
TempLeft := 20;
SetLength(MemoVc,GridCol);
for col :=0 to GridCol - 1 do
begin
MemoVc[col] := TfrMemoview.Create;
MemoVc[col].Font.Name := Grid1.Font.Name;
MemoVc[col].Font.Size := Grid1.Font.Size;
MemoVc[col].Memo.Add(Grid1.Cells[col,CurrRow]);
MemoVc[col].FrameTyp := StyleType; //显示边框
TempWidth := Grid1.ColWidths[col]; //宽度与Grid中的宽度一致
MemoVc[col].SetBounds(tempLeft,top ,tempWidth,heigth);
templeft := tempLeft + tempwidth;
page.Objects.Add(MemoVc[col]);
end;
end;
if currRow >= GridRow then break;
end;
{页码}
pageV := TfrMemoview.Create;
pageV.Font.Name := '宋体';
pagev.Font.Size := 10;
pagev.FrameWidth := 2;
//pagev.FrameTyp := 24 ;
pagev.Alignment := (pagev.Alignment and $ FC) + 2;//居中
pageV.Memo.Add('第'+ inttostr(I + 1) + '页 (共' + inttostr(PageCount) + '页)' );
pagev.SetBounds(0,1025,750,20);
page.Objects.Add(pageV);
end;
fr.ShowReport;
screen.Cursor := crDefault;
finally
fr.Free;
end;
end;



第二种:
Print or Preview StringGrid with custome setting
Note: Click Title to view in Edit Box for easier copying.

type
TrecPrintStrGrid = Record
PrCanvas : TCanvas; //Printer or PaintBox Canvas
sGrid: TStringGrid; //StringGrid containing data
sTitle: String; //Title of document
bPrintFlag : Boolean; //Print if True
ptXYOffset : TPoint; //Left and Top margins
ftTitleFont : TFont; //Font for Title
ftHeadingFont : TFont; //Font for Heading row
ftDataFont : TFont; //Font for Data
bBorderFlag : Boolean //Print border if True
end;

var
recPrintStrGrid : TrecPrintStrGrid;

procedure PrintGrid(ArecPrintStrGrid : TrecPrintStrGrid);
var
iX1, iX2, iY1, iY2, iY3, iTmp , iLoop, iWd : Integer;
trTextRect : TRect;

begin
iWd := 0;
with ArecPrintStrGrid, PrCanvas do
begin
//Calculate Total Width of String Grid
Font := ftHeadingFont;
for iLoop := 0 to sGrid.ColCount-1 do
begin
if (TextWidth(sGrid.Cells[iLoop, 0])+5) < sGrid.ColWidths[iLoop] then
iWd := iWd + sGrid.ColWidths[iLoop]
else
iWd := iWd + TextWidth(sGrid.Cells[iLoop, 0])+5;
end; // for sGrid.ColCount

//Initialize Printer
if bPrintFlag then
begin
Printer.Title := sTitle;
Printer.BeginDoc;
end;

//Output Title
Pen.Color := clBlack;
Font := ftTitleFont;
TextOut(((iWd Div 2) - (TextWidth(sTitle) Div 2)), ptXYOffset.Y, sTitle);

//Output Column Data
for iLoop := 0 to sGrid.ColCount-1 do
begin
Font := ftHeadingFont;
iX1 := ptXYOffset.X;
for iTmp := 0 to (iLoop-1) do
if (TextWidth(sGrid.Cells[iTmp, 0])+5) < (sGrid.ColWidths[iTmp]) then
iX1 := iX1 + (sGrid.ColWidths[iTmp])
else
iX1 := iX1 + TextWidth(sGrid.Cells[iTmp, 0])+5;

iY1 := ptXYOffset.Y + ((TextHeight('Ag')+5) * 2);
iX2 := ptXYOffset.X;
for iTmp := 0 to iLoop do
if (TextWidth(sGrid.Cells[iTmp, 0])+5) < (sGrid.ColWidths[iTmp]) then
iX2 := iX2 + (sGrid.ColWidths[iTmp])
else
iX2 := iX2 + TextWidth(sGrid.Cells[iTmp, 0])+5;

iY2 := iY1 + TextHeight('Ag');
trTextRect := Rect(iX1, iY1, iX2, iY2);
TextRect(trTextRect, trTextRect.Left+5, trTextRect.Top+3, sGrid.Cells[iLoop, 0]);
Brush.Color := clWhite;
if bBorderFlag then FrameRect(trTextRect);
Brush.Style := bsClear;

//Output Row Data
Font := ftDataFont;
iY1 := iY2;
iY3 := TextHeight('Ag')+5;
for iTmp := 1 to sGrid.RowCount-1 do
begin
iY2 := iY1 + iY3;
trTextRect := Rect(iX1, iY1, iX2, iY2);
TextRect(trTextRect, trTextRect.Left+5, trTextRect.Top+3, sGrid.Cells[iLoop, iTmp]);
Brush.Color := clBlack;
if bBorderFlag then FrameRect(trTextRect);
Brush.Style := bsClear;
iY1 := iY1 + iY3;
end; // for sGrid.RowCount-1 do
end; // for sGrid.ColCount-1
if bPrintFlag then Printer.EndDoc;
end; // with ArecPrintStrGrid, prCanvas
end; { PrintGrid }

procedure TfrmSamp.buPrintClick(Sender: TObject);
begin
with recPrintStrGrid do
begin
PrCanvas := pbPreview.Canvas;
sGrid := stgData;
sTitle := 'Print of String Grid';
bPrintFlag := False;
ptXYOffset.X := 10;
ptXYOffset.Y := 100;
ftTitleFont := TFont.Create;
with ftTitleFont do
begin
Name := 'Arial';
Style := [fsBold, fsItalic, fsUnderLine];
Size := 14;
end;
ftHeadingFont := TFont.Create;
with ftHeadingFont do
begin
Name := 'Arial';
Style := [fsBold];
Size := 12;
end;
ftDataFont := TFont.Create;
with ftDataFont do
begin
Name := 'Arial';
Style := [];
Size := 10;
end;
bBorderFlag := True;
end; //with recPrintStrGrid do
PrintGrid(recPrintStrGrid);
end;


第三种:
How to Print a TStringGrid!!!
Note: Click Title to view in Edit Box for easier copying.

Here's the code. Just whack this onto a form's code and away you go.....

procedure PrintGrid(sGrid: TStringGrid; sTitle: String);
var
X1, X2 : Integer;
Y1, Y2 : Integer;
TmpI : Integer;
F : Integer;
TR : TRect;
begin
Printer.Title:=sTitle;
Printer.BeginDoc;
Printer.Canvas.Pen.Color:=0;
Printer.Canvas.Font.Name:='Times New Roman';
Printer.Canvas.Font.Size:=12;
Printer.Ccnvas.Font.Style:=[fsBold, fsUnderline];
Printer.Canvas.TextOut(0, 100, Printer.Title);
For F:=1 to sGrid.ColCount-1 do begin
X1:=0;
For TmpI:=1 to (F-1) do
X1:=X1+5*(sGrid.ColWidths[TmpI]);
Y1:=300;
X2:=0;
For TmpI:=1 to F do
X2:=X2+5*(sGrid.ColWidths[TmpI]);
Y2:=450;
TR:=Rect(X1, Y1, X2-30, Y2);
Printer.Canvas.Font.Style:=[fsBold];
Printer.Canvas.Font.Size:=7;
Printer.Canvas.TextRect(TR, X1+50, 350, sGrid.Cells[F, 0]);
Printer.Canvas.Font.Style:=[];
For TmpI:=1 to sGrid.RowCount-1 do begin
Y1:=150*TmpI+300;
Y2:=150*(TmpI+1)+300;
TR:=Rect(X1, Y1, X2-30, Y2);
Printer.Canvas.TextRect(TR, X1+50, Y1+50, sGrid.Cells[F, TmpI]);
end;
end;
Printer.EndDoc;
end;


第四种:
...print a TStringgrid?
Autor: Reinhard Schatzl
3 Comment(s) to this tip [Write new comment]
[ Print tip ]

Tip Rating (33):





uses
printers;

//StringGrid Inhalt ausdrucken
procedure PrintStringGrid(Grid: TStringGrid; Title: string;
Orientation: TPrinterOrientation);
var
P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
mmx, mmy: Extended;
Footer: string;
begin
//Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen
HeaderSize := 100;
FooterSize := 200;
ZeilenSize := 36;
FontHeight := 36;
//Printer initializieren
Printer.Orientation := Orientation;
Printer.Title := Title;
Printer.BeginDoc;
//Druck auf mm einstellen
mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;

VertSize := Trunc(mmy) * 10;
HorzSize := Trunc(mmx) * 10;
SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

//Zeilenanzahl festlegen
Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
//Seitenanzahl ermitteln
if Grid.RowCount mod Zeilen <> 0 then
AnzSeiten := Grid.RowCount div Zeilen + 1
else
AnzSeiten := Grid.RowCount div Zeilen;

Seite := 1;
//Grid Drucken
for P := 1 to AnzSeiten do
begin
//Kopfzeile
Printer.Canvas.Font.Height := 48;
Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)),
- 20,Title);
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.MoveTo(0, - HeaderSize);
Printer.Canvas.LineTo(HorzSize, - HeaderSize);
//Fußzeile
Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
Printer.Canvas.Font.Height := 36;
Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
- VertSize + 150,Footer);
//Zeilen drucken
Printer.Canvas.Font.Height := FontHeight;
YPos := HeaderSize + 10;
for I := 1 to Zeilen do
begin
if Grid.RowCount >= I + (Seite - 1) * Zeilen then
begin
XPos := 0;
for J := 0 to Grid.ColCount - 1 do
begin
Printer.Canvas.TextOut(XPos, - YPos,
Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
XPos := XPos + Grid.ColWidths[J] * 3;
end;
YPos := YPos + ZeilenSize;
end;
end;
//Seite hinzufügen
Inc(Seite);
if Seite <= AnzSeiten then Printer.NewPage;
end;
Printer.EndDoc;
end;

//Example
procedure TForm1.Button1Click(Sender: TObject);
begin
//Drucken im Querformat
PrintStringGrid(Grid, 'StringGrid Print Landscape', poLandscape);
//Drucken im Hochformat
PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait);
end;




标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}