Unit1.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:6k
源码类别:

RichEdit

开发平台:

Delphi

  1. {-------------------------------------------------------------------------------
  2.   Demo: printing documents using TRVReportHelper.
  3.   This demo loads RVF file in rvh.RichView and prints it.
  4.   rvh2 is used to print header: (- page no -).
  5.   Advantages of this method:
  6.   - possibility to make custom complex headers and footers, different for
  7.     different pages;
  8.   - possibility to implement nonstandard layouts, printing several documents
  9.     in different areas on the same page,etc
  10.   Disadvantages of this method:
  11.   - no preview (at least, not with TRVPrintPreview)
  12.   - you need to calculate all margins yourself
  13.  ------------------------------------------------------------------------------
  14.   For example, you can open RVF file created by ActionText (including readme.rvf).
  15.   Do not try to load file from the editor demo (Demos*EditorsEditor 1) - it does
  16.   not contain a collection of styles, so it can be opened only by
  17.   applications having that collection of styles.
  18. -------------------------------------------------------------------------------}
  19. unit Unit1;
  20. interface
  21. uses
  22.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  23.   Printers, Dialogs,
  24.   RVScroll, RichView, PtblRV, RVReport, StdCtrls, RVStyle;
  25. type
  26.   TForm1 = class(TForm)
  27.     Button1: TButton;
  28.     rvh: TRVReportHelper;
  29.     RVStyle1: TRVStyle;
  30.     OpenDialog1: TOpenDialog;
  31.     Button2: TButton;
  32.     rvh2: TRVReportHelper;
  33.     RVStyle2: TRVStyle;
  34.     Button3: TButton;
  35.     procedure FormCreate(Sender: TObject);
  36.     procedure Button1Click(Sender: TObject);
  37.     procedure Button2Click(Sender: TObject);
  38.     procedure Button3Click(Sender: TObject);
  39.   private
  40.     { Private declarations }
  41.   public
  42.     { Public declarations }
  43.   end;
  44. var
  45.   Form1: TForm1;
  46. implementation
  47. {$R *.dfm}
  48. procedure TForm1.FormCreate(Sender: TObject);
  49. begin
  50.   with rvh.RichView do begin
  51.     RVFOptions := [rvfoSavePicturesBody,rvfoSaveControlsBody,rvfoSaveBinary,
  52.       rvfoSaveBack,rvfoLoadBack,rvfoSaveTextStyles,rvfoSaveParaStyles,
  53.       rvfoSaveLayout,rvfoLoadLayout];
  54.     Options := Options + [rvoTagsArePChars];
  55.     RVFParaStylesReadMode := rvf_sInsertMerge;
  56.     RVFTextStylesReadMode := rvf_sInsertMerge;
  57.     Style := RVStyle1;
  58.   end;
  59.   with rvh2.RichView do begin
  60.     Style := RVStyle2;
  61.   end;
  62. end;
  63. procedure TForm1.Button1Click(Sender: TObject);
  64. begin
  65.   if OpenDialog1.Execute then begin
  66.     rvh.RichView.Clear;
  67.     rvh.RichView.LoadRVF(OpenDialog1.FileName);
  68.   end;
  69. end;
  70. // print one column
  71. procedure TForm1.Button2Click(Sender: TObject);
  72. var DocWidth, DocHeight, DocLeft, DocTop, HeaderTop, LineY,
  73.     PageNo: Integer;
  74. begin
  75.   if rvh.RichView.ItemCount=0 then begin
  76.     Application.MessageBox('Document is empty!', 'Empty', 0);
  77.     exit;
  78.   end;
  79.   Printer.Title := 'ReportHelper Test';
  80.   Printer.BeginDoc;
  81.   try
  82.     PageNo := 1;
  83.     DocLeft := Printer.PageWidth div 20; // margins = 5%
  84.     DocWidth := Printer.PageWidth - DocLeft*2;
  85.     HeaderTop := Printer.PageHeight div 20; // margins = 5%
  86.     rvh.Init(Printer.Canvas, DocWidth);
  87.     while True do begin
  88.       // creating & formatting header
  89.       rvh2.RichView.Clear;
  90.       rvh2.RichView.AddFmt('- %d -', [PageNo], 0, 1);
  91.       rvh2.Init(Printer.Canvas, DocWidth);
  92.       rvh2.FormatNextPage(Printer.PageHeight);
  93.       DocTop := HeaderTop+rvh2.EndAt+HeaderTop div 2;
  94.       // formatting next page of document
  95.       DocHeight := Printer.PageHeight-DocTop-HeaderTop;
  96.       if not rvh.FormatNextPage(DocHeight) then
  97.         break;
  98.       // starting new page
  99.       if PageNo>1 then
  100.         Printer.NewPage;
  101.       // drawing line between header and document
  102.       with Printer.Canvas do begin
  103.         Pen.Style := psInsideFrame;
  104.         Pen.Width := 10;
  105.         Pen.Color := clBlack;
  106.         LineY := HeaderTop+rvh2.EndAt+HeaderTop div 4;
  107.         MoveTo(DocLeft*2, LineY);
  108.         LineTo(Printer.PageWidth-DocLeft*2, LineY);
  109.       end;
  110.       // drawing header and document
  111.       rvh2.DrawPageAt(DocLeft, HeaderTop, 1, Printer.Canvas, False, rvh2.EndAt);
  112.       rvh.DrawPageAt(DocLeft, DocTop, PageNo, Printer.Canvas, False, DocHeight);
  113.       inc(PageNo);
  114.     end;
  115.   finally
  116.     Printer.EndDoc;
  117.   end;
  118. end;
  119. // print two columns
  120. procedure TForm1.Button3Click(Sender: TObject);
  121. var ColWidth, DocHeight, DocTop, Col1Left, Col2Left,
  122.     HeaderLeft, HeaderTop, HeaderWidth, LineY,
  123.     PageNo: Integer;
  124. begin
  125.   if rvh.RichView.ItemCount=0 then begin
  126.     Application.MessageBox('Document is empty!', 'Empty', 0);
  127.     exit;
  128.   end;
  129.   Printer.Title := 'ReportHelper Test';
  130.   Printer.BeginDoc;
  131.   try
  132.     PageNo := 1;
  133.     HeaderLeft := Printer.PageWidth div 20; // margins = 5%
  134.     HeaderWidth := Printer.PageWidth - HeaderLeft*2;
  135.     HeaderTop := Printer.PageHeight div 20; // margins = 5%
  136.     ColWidth := (HeaderWidth-HeaderLeft) div 2;
  137.     Col1Left := HeaderLeft;
  138.     Col2Left := Col1Left+ColWidth+HeaderLeft div 2;
  139.     rvh.Init(Printer.Canvas, ColWidth);
  140.     while True do begin
  141.       // creating & formatting header
  142.       rvh2.RichView.Clear;
  143.       rvh2.RichView.AddFmt('- %d -', [PageNo], 0, 1);
  144.       rvh2.Init(Printer.Canvas, HeaderWidth);
  145.       rvh2.FormatNextPage(Printer.PageHeight);
  146.       DocTop := HeaderTop+rvh2.EndAt+HeaderTop div 2;
  147.       // formatting the first column of document
  148.       DocHeight := Printer.PageHeight-DocTop-HeaderTop;
  149.       if not rvh.FormatNextPage(DocHeight) then
  150.         break;
  151.       // starting new page
  152.       if PageNo>1 then
  153.         Printer.NewPage;
  154.       // drawing line between header and document
  155.       with Printer.Canvas do begin
  156.         Pen.Style := psInsideFrame;
  157.         Pen.Width := 10;
  158.         Pen.Color := clBlack;
  159.         LineY := HeaderTop+rvh2.EndAt+HeaderTop div 4;
  160.         MoveTo(HeaderLeft*2, LineY);
  161.         LineTo(Printer.PageWidth-HeaderLeft*2, LineY);
  162.       end;
  163.       // drawing header and document
  164.       rvh2.DrawPageAt(HeaderLeft, HeaderTop, 1, Printer.Canvas, False, rvh2.EndAt);
  165.       rvh.DrawPageAt(Col1Left, DocTop, PageNo*2-1, Printer.Canvas, False, DocHeight);
  166.       if rvh.FormatNextPage(DocHeight) then
  167.         rvh.DrawPageAt(Col2Left, DocTop, PageNo*2, Printer.Canvas, False, DocHeight);
  168.       inc(PageNo);
  169.     end;
  170.   finally
  171.     Printer.EndDoc;
  172.   end;
  173. end;
  174. end.