home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 December / Chip_2001-12_cd1.bin / zkuste / delphi / kompon / d345 / PPREV.ZIP / BenPreview / AdvPrinting.pas next >
Encoding:
Pascal/Delphi Source File  |  2001-08-31  |  6.7 KB  |  201 lines

  1. unit AdvPrinting;
  2.  
  3. interface
  4.  
  5. uses PrevPrinter, Classes, Printers, Grids;
  6.  
  7. Procedure PrintGrid( Prev: TPreviewPrinter; const StartAt, StopAt: LongInt; Grid: TStringGrid );
  8. Procedure PrintGridStrings( Prev: TPreviewPrinter; List: TStrings );
  9.  
  10. implementation
  11.  
  12. uses Dialogs, Windows, Graphics, SysUtils;
  13.  
  14. Procedure DrawCell( Canvas: TCanvas; const X,Y, MaxWidth: LongInt; const Value: String );
  15. var
  16.   Ofx, TxtH: LongInt;
  17. begin
  18.   with Canvas do
  19.     begin
  20.       TxtH := Round( TextHeight(Value) * 1.25 );
  21.       Ofx := Round(TxtH*0.05);
  22.       TextOut( X+Ofx*2, Y+Ofx, Value );
  23.       MoveTo( X, Y );
  24.       LineTo( X, Y+TxtH );
  25.       LineTo( X+MaxWidth, Y+TxtH );
  26.       LineTo( X+MaxWidth, Y );
  27.       LineTo( X, Y );
  28.     end;
  29. end;
  30.  
  31. Procedure DrawBounds( Canvas: TCanvas; const BaseX, MaxWidth, StartAt, StopAt: LongInt );
  32. begin
  33.   with Canvas do
  34.     begin
  35.       MoveTo( BaseX, StartAt );
  36.       LineTo( BaseX+MaxWidth, StartAt );
  37.       LineTo( BaseX+MaxWidth, StopAt );
  38.       LineTo( BaseX, StopAt );
  39.       LineTo( BaseX, StartAt );
  40.     end;
  41. end;
  42.  
  43. Procedure PrintGrid( Prev: TPreviewPrinter; const StartAt, StopAt: LongInt; Grid: TStringGrid );
  44. var
  45.   ColWidth, PosWidth: Array of LongInt;
  46.   MaxWidth: LongInt;
  47.   RowHeight: LongInt;
  48.   BaseX, CurLine, x, y, Page, TotalPage, LinesPer: LongInt;
  49.   OldAlign: Word;
  50.   tmpStr: String;
  51. begin
  52.   try
  53.     SetLength( ColWidth, Grid.ColCount );
  54.     SetLength( PosWidth, Grid.ColCount );
  55.     Prev.Canvas.Font.Name := Prev.TextOptions.BodyFont.Name;
  56.     Prev.Canvas.Font.Size := 10;
  57.     for x := 0 to Grid.ColCount-1 do
  58.       begin
  59.         ColWidth[x] := 0;
  60.         PosWidth[x] := 0;
  61.       end;
  62.     for x := 0 to Grid.ColCount-1 do
  63.       begin
  64.         for Y := 0 to Grid.RowCount do
  65.           begin
  66.             tmpStr := Grid.Cells[ x,y ] + 'W';
  67.             if Prev.Canvas.TextWidth( tmpStr ) > ColWidth[x] then
  68.               ColWidth[x] := Prev.Canvas.TextWidth( tmpStr );
  69.           end;
  70.       end;
  71.     MaxWidth := 0;
  72.     for x := 0 to Grid.ColCount-1 do
  73.       MaxWidth := MaxWidth + ColWidth[x];
  74.     for x := High( ColWidth ) downto Low( ColWidth ) do
  75.       begin
  76.         for y := x downto Low(ColWidth) do
  77.           PosWidth[x] := PosWidth[x] + ColWidth[y];
  78.       end;
  79.     RowHeight := Round( Prev.Canvas.TextHeight( 'ABC' ) * 1.25 );
  80.     BaseX := ( Prev.PageWidth div 2 ) - ( MaxWidth div 2 );
  81.  
  82.     LinesPer := Round( ( Prev.PageHeight-StartAt-(Prev.PageHeight-StopAt)) / RowHeight );
  83.     if (Grid.RowCount+1) mod LinesPer > 0 then
  84.       TotalPage := Grid.RowCount div LinesPer + 1
  85.     else
  86.       TotalPage := Grid.RowCount div LinesPer;
  87. //    OldAlign := SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
  88.  
  89.     with Prev do
  90.       begin
  91.         Canvas.Pen.Width := UnitToX(0.01);
  92.         TextOptions.PageNumText := 'Page %d of ' + IntToStr(TotalPage);
  93.       end;
  94.  
  95.     CurLine := 1;
  96.     for Page := 1 to TotalPage do
  97.       begin
  98.         with Prev do
  99.           begin
  100.             Canvas.Font.Name := TextOptions.BodyFont.Name;
  101.             Canvas.Font.Style := [ fsBold ];
  102.             Canvas.Font.Size := 12;
  103.             DrawCell( Canvas, BaseX, StartAt, ColWidth[0], Grid.Cells[ 0, 0 ] );
  104.             for X := 1 to Grid.ColCount-1 do
  105.               DrawCell( Canvas, BaseX+PosWidth[x]-ColWidth[x], StartAt, ColWidth[x], Grid.Cells[ X, 0 ] );
  106.             Canvas.Font.Style := [  ];
  107.             Canvas.Font.Size := 10;
  108.  
  109.             Canvas.Pen.Width := UnitToX(0.015);
  110.             Canvas.MoveTo( UnitToX(TextOptions.MarginLeft), UnitToY(TextOptions.HeaderMargin)+RowHeight*2 );
  111.             Canvas.LineTo( PageWidth-UnitToX(TextOptions.MarginRight), UnitToY(TextOptions.HeaderMargin)+RowHeight*2 );
  112.             Canvas.MoveTo( UnitToX(TextOptions.MarginLeft), PageHeight-UnitToY(TextOptions.FooterMargin) );
  113.             Canvas.LineTo( PageWidth-UnitToX(TextOptions.MarginRight), PageHeight-UnitToY(TextOptions.FooterMargin) );
  114.             Canvas.Pen.Width := UnitToX(0.01);
  115.  
  116.  
  117.             Prev.DrawHdrFtrPage(Page);
  118.             for Y := 2 to LinesPer do
  119.               begin
  120.                 if CurLine <= Grid.RowCount then
  121.                   begin
  122.                     DrawCell( Canvas, BaseX, StartAt+Y*RowHeight, ColWidth[0], Grid.Cells[ 0, CurLine ] );
  123.                     for X := 1 to Grid.ColCount-1 do
  124.                       DrawCell( Canvas, BaseX+PosWidth[x]-ColWidth[x], StartAt+Y*RowHeight, ColWidth[x], Grid.Cells[ X, CurLine ] );
  125.                     Inc( CurLine );
  126.                   end;
  127.               end;
  128.             if Page < TotalPage then
  129.               begin
  130.                 Prev.NewPageEx( Prev.TextOptions.Header + IntToStr(Page+1), poPortrait );
  131.                 //SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
  132.                 Prev.Canvas.Pen.Width := Prev.UnitToX(0.015);
  133.               end;
  134.           end;
  135.       end;
  136.     //SetTextAlign( Prev.Canvas.Handle, OldAlign );
  137.   except
  138.     MessageDlg('Failed to print grid!', mtWarning, [mbOK], 0);
  139.   end;
  140. end;
  141.  
  142. Procedure PrintGridStrings( Prev: TPreviewPrinter; List: TStrings );
  143. var
  144.   MaxWidth: LongInt;
  145.   RowHeight: LongInt;
  146.   BaseX, CurLine, x, y, Page, TotalPage, LinesPer: LongInt;
  147. begin
  148.   try
  149.     MaxWidth := 0;
  150.     Prev.Canvas.Font.Name := Prev.TextOptions.BodyFont.Name;
  151.     Prev.Canvas.Font.Size := 10;
  152.     for x := 0 to List.Count-1 do
  153.       begin
  154.         if Prev.Canvas.TextWidth( List[x] ) > MaxWidth then
  155.           MaxWidth := Prev.Canvas.TextWidth( List[x] );
  156.       end;
  157.     RowHeight := Round( Prev.Canvas.TextHeight( 'ABC' ) * 1.25 );
  158.  
  159.     with Prev do
  160.       LinesPer := Round( (PageHeight-UnitToY(TextOptions.MarginTop)-UnitToY(TextOptions.MarginBottom)) / RowHeight );
  161.     if (List.Count+1) mod LinesPer > 0 then
  162.       TotalPage := List.Count div LinesPer + 1
  163.     else
  164.       TotalPage := List.Count div LinesPer;
  165.  
  166.  
  167.     with Prev do
  168.       begin
  169.         Canvas.Pen.Width := UnitToX(0.01);
  170.         TextOptions.PageNumText := 'Page %d of ' + IntToStr(TotalPage);
  171.       end;
  172.  
  173.     CurLine := 0;
  174.     for Page := 1 to TotalPage do
  175.       begin
  176.         with Prev do
  177.           begin
  178.             DrawHdrFtrPage(Page);
  179.             for x := 1 to LinesPer do
  180.               begin
  181.                 if CurLine < List.Count then
  182.                   Canvas.TextOut( UnitToX( TextOptions.MarginLeft ), UnitToY(TextOptions.MarginTop)+x*RowHeight, List[CurLine] );
  183.                 Inc( CurLine );
  184.               end;
  185.           end;
  186.         if Page < TotalPage then
  187.           begin
  188.             Prev.NewPageEx( Prev.TextOptions.Header + IntToStr(Page+1), poPortrait );
  189.             //SetTextAlign( Prev.Canvas.Handle, TA_CENTER );
  190.             Prev.Canvas.Pen.Width := Prev.UnitToX(0.015);
  191.           end;
  192.       end;
  193.  
  194.   except
  195.     MessageDlg('Failed to print file!', mtWarning, [mbOK], 0);
  196.   end;
  197.  
  198. end;
  199.  
  200. end.
  201.