Unit1.cpp
上传用户: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. #include <vclvcl.h>
  20. #pragma hdrstop
  21. #include "Unit1.h"
  22. //---------------------------------------------------------------------------
  23. #pragma link "RVReport"
  24. #pragma link "PtblRV"
  25. #pragma link "RVStyle"
  26. #pragma resource "*.dfm"
  27. TForm1 *Form1;
  28. //---------------------------------------------------------------------------
  29. __fastcall TForm1::TForm1(TComponent* Owner)
  30. : TForm(Owner)
  31. {
  32. }
  33. //---------------------------------------------------------------------------
  34. void __fastcall TForm1::FormCreate(TObject *Sender)
  35. {
  36.   TRVFOptions RVFOptions;
  37.   RVFOptions << rvfoSavePicturesBody << rvfoSaveControlsBody << rvfoSaveBinary <<
  38.     rvfoSaveBack << rvfoLoadBack << rvfoSaveTextStyles << rvfoSaveParaStyles <<
  39.     rvfoSaveLayout << rvfoLoadLayout;
  40.   rvh->RichView->RVFOptions = RVFOptions;
  41.   rvh->RichView->Options << rvoTagsArePChars;
  42.   rvh->RichView->RVFParaStylesReadMode = rvf_sInsertMerge;
  43.   rvh->RichView->RVFTextStylesReadMode = rvf_sInsertMerge;
  44.   rvh->RichView->Style = RVStyle1;
  45.   rvh2->RichView->Style = RVStyle2;
  46. }
  47. //---------------------------------------------------------------------------
  48. void __fastcall TForm1::Button1Click(TObject *Sender)
  49. {
  50.   if (OpenDialog1->Execute())
  51.   {
  52.     rvh->RichView->Clear();
  53.     rvh->RichView->LoadRVF(OpenDialog1->FileName);
  54.   }
  55. }
  56. //---------------------------------------------------------------------------
  57. // print one column
  58. void __fastcall TForm1::Button2Click(TObject *Sender)
  59. {
  60.   if (rvh->RichView->ItemCount==0)
  61.   {
  62.     Application->MessageBox("Document is empty!", "Empty", 0);
  63.     return;
  64.   }
  65.   Printer()->Title = "ReportHelper Test";
  66.   Printer()->BeginDoc();
  67.   int PageNo = 1;
  68.   int DocLeft = Printer()->PageWidth / 20; // margins = 5%
  69.   int DocWidth = Printer()->PageWidth - DocLeft*2;
  70.   int HeaderTop = Printer()->PageHeight / 20; // margins = 5%
  71.   rvh->Init(Printer()->Canvas, DocWidth);
  72.   while (true)
  73.   {
  74.     // creating & formatting header
  75.     rvh2->RichView->Clear();
  76.     rvh2->RichView->AddFmt("- %d -", ARRAYOFCONST((PageNo)), 0, 1);
  77.     rvh2->Init(Printer()->Canvas, DocWidth);
  78.     rvh2->FormatNextPage(Printer()->PageHeight);
  79.     int DocTop = HeaderTop + rvh2->EndAt + HeaderTop/2;
  80.     // formatting next page of document
  81.     int DocHeight = Printer()->PageHeight - DocTop - HeaderTop;
  82.     if (!rvh->FormatNextPage(DocHeight))
  83.       break;
  84.     // starting new page
  85.     if (PageNo>1)
  86.       Printer()->NewPage();
  87.     // drawing line between header and document
  88.     Printer()->Canvas->Pen->Style = psInsideFrame;
  89.     Printer()->Canvas->Pen->Width = 10;
  90.     Printer()->Canvas->Pen->Color = clBlack;
  91.     int LineY = HeaderTop + rvh2->EndAt + HeaderTop/4;
  92.     Printer()->Canvas->MoveTo(DocLeft*2, LineY);
  93.     Printer()->Canvas->LineTo(Printer()->PageWidth-DocLeft*2, LineY);
  94.     // drawing header and document
  95.     rvh2->DrawPageAt(DocLeft, HeaderTop, 1, Printer()->Canvas, false, rvh2->EndAt);
  96.     rvh->DrawPageAt(DocLeft, DocTop, PageNo, Printer()->Canvas, false, DocHeight);
  97.     PageNo++;
  98.   }
  99.   Printer()->EndDoc();
  100. }
  101. //---------------------------------------------------------------------------
  102. // print two columns
  103. void __fastcall TForm1::Button3Click(TObject *Sender)
  104. {
  105.   if (rvh->RichView->ItemCount==0)
  106.   {
  107.     Application->MessageBox("Document is empty!", "Empty", 0);
  108.     return;
  109.   }
  110.   Printer()->Title = "ReportHelper Test";
  111.   Printer()->BeginDoc();
  112.   int PageNo = 1;
  113.   int HeaderLeft = Printer()->PageWidth/20; // margins = 5%
  114.   int HeaderWidth = Printer()->PageWidth - HeaderLeft*2;
  115.   int HeaderTop = Printer()->PageHeight/20; // margins = 5%
  116.   int ColWidth = (HeaderWidth-HeaderLeft)/2;
  117.   int Col1Left = HeaderLeft;
  118.   int Col2Left = Col1Left + ColWidth + HeaderLeft/2;
  119.   rvh->Init(Printer()->Canvas, ColWidth);
  120.   while (true)
  121.   {
  122.     // creating & formatting header
  123.     rvh2->RichView->Clear();
  124.     rvh2->RichView->AddFmt("- %d -", ARRAYOFCONST((PageNo)), 0, 1);
  125.     rvh2->Init(Printer()->Canvas, HeaderWidth);
  126.     rvh2->FormatNextPage(Printer()->PageHeight);
  127.     int DocTop = HeaderTop + rvh2->EndAt + HeaderTop/2;
  128.     // formatting the first column of document
  129.     int DocHeight = Printer()->PageHeight - DocTop - HeaderTop;
  130.     if (!rvh->FormatNextPage(DocHeight))
  131.       break;
  132.     // starting new page
  133.     if (PageNo>1)
  134.       Printer()->NewPage();
  135.     // drawing line between header and document
  136.     Printer()->Canvas->Pen->Style = psInsideFrame;
  137.     Printer()->Canvas->Pen->Width = 10;
  138.     Printer()->Canvas->Pen->Color = clBlack;
  139.     int LineY = HeaderTop + rvh2->EndAt + HeaderTop/4;
  140.     Printer()->Canvas->MoveTo(HeaderLeft*2, LineY);
  141.     Printer()->Canvas->LineTo(Printer()->PageWidth-HeaderLeft*2, LineY);
  142.     // drawing header and document
  143.     rvh2->DrawPageAt(HeaderLeft, HeaderTop, 1, Printer()->Canvas, false, rvh2->EndAt);
  144.     rvh->DrawPageAt(Col1Left, DocTop, PageNo*2-1, Printer()->Canvas, false, DocHeight);
  145.     if (rvh->FormatNextPage(DocHeight))
  146.       rvh->DrawPageAt(Col2Left, DocTop, PageNo*2, Printer()->Canvas, false, DocHeight);
  147.     PageNo++;
  148.   }
  149.   Printer()->EndDoc();
  150. }
  151. //---------------------------------------------------------------------------