home *** CD-ROM | disk | FTP | other *** search
- unit AdvPrinting;
-
- interface
-
- uses PrevPrinter, Classes, Printers, Grids;
-
- Procedure PrintGrid( Prev: TPreviewPrinter; const StartAt, StopAt: LongInt; Grid: TStringGrid );
- Procedure PrintGridStrings( Prev: TPreviewPrinter; List: TStrings );
-
- implementation
-
- uses Dialogs, Windows, Graphics, SysUtils;
-
- Procedure DrawCell( Canvas: TCanvas; const X,Y, MaxWidth: LongInt; const Value: String );
- var
- Ofx, TxtH: LongInt;
- begin
- with Canvas do
- begin
- TxtH := Round( TextHeight(Value) * 1.25 );
- Ofx := Round(TxtH*0.05);
- TextOut( X+Ofx*2, Y+Ofx, Value );
- MoveTo( X, Y );
- LineTo( X, Y+TxtH );
- LineTo( X+MaxWidth, Y+TxtH );
- LineTo( X+MaxWidth, Y );
- LineTo( X, Y );
- end;
- end;
-
- Procedure DrawBounds( Canvas: TCanvas; const BaseX, MaxWidth, StartAt, StopAt: LongInt );
- begin
- with Canvas do
- begin
- MoveTo( BaseX, StartAt );
- LineTo( BaseX+MaxWidth, StartAt );
- LineTo( BaseX+MaxWidth, StopAt );
- LineTo( BaseX, StopAt );
- LineTo( BaseX, StartAt );
- end;
- end;
-
- Procedure PrintGrid( Prev: TPreviewPrinter; const StartAt, StopAt: LongInt; Grid: TStringGrid );
- var
- ColWidth, PosWidth: Array of LongInt;
- MaxWidth: LongInt;
- RowHeight: LongInt;
- BaseX, CurLine, x, y, Page, TotalPage, LinesPer: LongInt;
- OldAlign: Word;
- tmpStr: String;
- begin
- try
- SetLength( ColWidth, Grid.ColCount );
- SetLength( PosWidth, Grid.ColCount );
- Prev.Canvas.Font.Name := Prev.TextOptions.BodyFont.Name;
- Prev.Canvas.Font.Size := 10;
- for x := 0 to Grid.ColCount-1 do
- begin
- ColWidth[x] := 0;
- PosWidth[x] := 0;
- end;
- for x := 0 to Grid.ColCount-1 do
- begin
- for Y := 0 to Grid.RowCount do
- begin
- tmpStr := Grid.Cells[ x,y ] + 'W';
- if Prev.Canvas.TextWidth( tmpStr ) > ColWidth[x] then
- ColWidth[x] := Prev.Canvas.TextWidth( tmpStr );
- end;
- end;
- MaxWidth := 0;
- for x := 0 to Grid.ColCount-1 do
- MaxWidth := MaxWidth + ColWidth[x];
- for x := High( ColWidth ) downto Low( ColWidth ) do
- begin
- for y := x downto Low(ColWidth) do
- PosWidth[x] := PosWidth[x] + ColWidth[y];
- end;
- RowHeight := Round( Prev.Canvas.TextHeight( 'ABC' ) * 1.25 );
- BaseX := ( Prev.PageWidth div 2 ) - ( MaxWidth div 2 );
-
- LinesPer := Round( ( Prev.PageHeight-StartAt-(Prev.PageHeight-StopAt)) / RowHeight );
- if (Grid.RowCount+1) mod LinesPer > 0 then
- TotalPage := Grid.RowCount div LinesPer + 1
- else
- TotalPage := Grid.RowCount div LinesPer;
- // OldAlign := SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
-
- with Prev do
- begin
- Canvas.Pen.Width := UnitToX(0.01);
- TextOptions.PageNumText := 'Page %d of ' + IntToStr(TotalPage);
- end;
-
- CurLine := 1;
- for Page := 1 to TotalPage do
- begin
- with Prev do
- begin
- Canvas.Font.Name := TextOptions.BodyFont.Name;
- Canvas.Font.Style := [ fsBold ];
- Canvas.Font.Size := 12;
- DrawCell( Canvas, BaseX, StartAt, ColWidth[0], Grid.Cells[ 0, 0 ] );
- for X := 1 to Grid.ColCount-1 do
- DrawCell( Canvas, BaseX+PosWidth[x]-ColWidth[x], StartAt, ColWidth[x], Grid.Cells[ X, 0 ] );
- Canvas.Font.Style := [ ];
- Canvas.Font.Size := 10;
-
- Canvas.Pen.Width := UnitToX(0.015);
- Canvas.MoveTo( UnitToX(TextOptions.MarginLeft), UnitToY(TextOptions.HeaderMargin)+RowHeight*2 );
- Canvas.LineTo( PageWidth-UnitToX(TextOptions.MarginRight), UnitToY(TextOptions.HeaderMargin)+RowHeight*2 );
- Canvas.MoveTo( UnitToX(TextOptions.MarginLeft), PageHeight-UnitToY(TextOptions.FooterMargin) );
- Canvas.LineTo( PageWidth-UnitToX(TextOptions.MarginRight), PageHeight-UnitToY(TextOptions.FooterMargin) );
- Canvas.Pen.Width := UnitToX(0.01);
-
-
- Prev.DrawHdrFtrPage(Page);
- for Y := 2 to LinesPer do
- begin
- if CurLine <= Grid.RowCount then
- begin
- DrawCell( Canvas, BaseX, StartAt+Y*RowHeight, ColWidth[0], Grid.Cells[ 0, CurLine ] );
- for X := 1 to Grid.ColCount-1 do
- DrawCell( Canvas, BaseX+PosWidth[x]-ColWidth[x], StartAt+Y*RowHeight, ColWidth[x], Grid.Cells[ X, CurLine ] );
- Inc( CurLine );
- end;
- end;
- if Page < TotalPage then
- begin
- Prev.NewPageEx( Prev.TextOptions.Header + IntToStr(Page+1), poPortrait );
- //SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
- Prev.Canvas.Pen.Width := Prev.UnitToX(0.015);
- end;
- end;
- end;
- //SetTextAlign( Prev.Canvas.Handle, OldAlign );
- except
- MessageDlg('Failed to print grid!', mtWarning, [mbOK], 0);
- end;
- end;
-
- Procedure PrintGridStrings( Prev: TPreviewPrinter; List: TStrings );
- var
- MaxWidth: LongInt;
- RowHeight: LongInt;
- BaseX, CurLine, x, y, Page, TotalPage, LinesPer: LongInt;
- begin
- try
- MaxWidth := 0;
- Prev.Canvas.Font.Name := Prev.TextOptions.BodyFont.Name;
- Prev.Canvas.Font.Size := 10;
- for x := 0 to List.Count-1 do
- begin
- if Prev.Canvas.TextWidth( List[x] ) > MaxWidth then
- MaxWidth := Prev.Canvas.TextWidth( List[x] );
- end;
- RowHeight := Round( Prev.Canvas.TextHeight( 'ABC' ) * 1.25 );
-
- with Prev do
- LinesPer := Round( (PageHeight-UnitToY(TextOptions.MarginTop)-UnitToY(TextOptions.MarginBottom)) / RowHeight );
- if (List.Count+1) mod LinesPer > 0 then
- TotalPage := List.Count div LinesPer + 1
- else
- TotalPage := List.Count div LinesPer;
-
-
- with Prev do
- begin
- Canvas.Pen.Width := UnitToX(0.01);
- TextOptions.PageNumText := 'Page %d of ' + IntToStr(TotalPage);
- end;
-
- CurLine := 0;
- for Page := 1 to TotalPage do
- begin
- with Prev do
- begin
- DrawHdrFtrPage(Page);
- for x := 1 to LinesPer do
- begin
- if CurLine < List.Count then
- Canvas.TextOut( UnitToX( TextOptions.MarginLeft ), UnitToY(TextOptions.MarginTop)+x*RowHeight, List[CurLine] );
- Inc( CurLine );
- end;
- end;
- if Page < TotalPage then
- begin
- Prev.NewPageEx( Prev.TextOptions.Header + IntToStr(Page+1), poPortrait );
- //SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
- Prev.Canvas.Pen.Width := Prev.UnitToX(0.015);
- end;
- end;
-
- except
- MessageDlg('Failed to print file!', mtWarning, [mbOK], 0);
- end;
-
- end;
-
- end.
-