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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. {$I RV_Defs.inc}
  3. {==============================================================================}
  4. { RichView Printing Demo.                                                      }
  5. {------------------------------------------------------------------------------}
  6. { Note:                                                                        }
  7. { This demo does not show how to create user interface to setup margins.       }
  8. {------------------------------------------------------------------------------}
  9. { Note:                                                                        }
  10. { This demo does not show how to implement custom scaling of print preview.    }
  11. { Look at the example of  RichViewEdit based editor.                           }
  12. {==============================================================================}
  13. interface
  14. {$I RV_Defs.inc}
  15. uses
  16.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  17.   RVScroll, RichView, ExtCtrls, ComCtrls, PtblRV, CRVPP, RVPP, RVStyle,
  18.   {$IFDEF RICHVIEWDEF4}
  19.   ImgList,
  20.   {$ENDIF}
  21.   StdCtrls, CtrlImg;
  22. type
  23.   TForm1 = class(TForm)
  24.     PageControl1: TPageControl;
  25.     TabSheet1: TTabSheet;
  26.     TabSheet2: TTabSheet;
  27.     Panel1: TPanel;
  28.     RichView1: TRichView;
  29.     RVPrintPreview1: TRVPrintPreview;
  30.     RVPrint1: TRVPrint;
  31.     Image1: TImage;
  32.     Panel2: TPanel;
  33.     Button1: TButton;
  34.     Edit1: TEdit;
  35.     RVStyle1: TRVStyle;
  36.     Label1: TLabel;
  37.     PrintDialog1: TPrintDialog;
  38.     btnPrint: TButton;
  39.     Image2: TImage;
  40.     StatusBar1: TStatusBar;
  41.     Panel3: TPanel;
  42.     ScrollBar1: TScrollBar;
  43.     procedure FormCreate(Sender: TObject);
  44.     procedure ScrollBar1Change(Sender: TObject);
  45.     procedure RVPrint1PrintComponent(Sender: TCustomRVPrint; PrintMe: TControl;
  46.       var ComponentImage: TBitmap);
  47.     procedure btnPrintClick(Sender: TObject);
  48.     procedure RVPrint1Formatting(Sender: TCustomRichView; PageCompleted: Integer;
  49.       Step: TRVPrintingStep);
  50.     procedure RVPrint1SendingToPrinter(Sender: TCustomRichView;
  51.       PageCompleted: Integer; Step: TRVPrintingStep);
  52.     procedure RVPrint1PagePrepaint(Sender: TRVPrint; PageNo: Integer;
  53.       Canvas: TCanvas; Preview: Boolean; PageRect, PrintAreaRect: TRect);
  54.     procedure PageControl1Change(Sender: TObject);
  55.     procedure Panel3Resize(Sender: TObject);
  56.   private
  57.     { Private declarations }
  58.     PreviewCreated: Boolean;
  59.     procedure UpdatePreview;
  60.   public
  61.     { Public declarations }
  62.   end;
  63. var
  64.   Form1: TForm1;
  65. implementation
  66. {$R *.DFM}
  67. procedure TForm1.FormCreate(Sender: TObject);
  68. const longtext:String = 'A simple way of describing Delphi is a sophisticated Pascal compiler.'+
  69.                ' Delphi抯 roots lie in Borland抯 Turbo Pascal, introduced in the mid-1980s.'+
  70.                ' This view of Delphi, however, doesn抰 capture the real power of Delphi.'+
  71.                ' Object Pascal, the object-oriented extensions to Pascal, is the underlying'+
  72.                ' language of Delphi. The Visual Component Library, or VCL, is a hierarchy of '+
  73.                'Object Pascal objects that allow you to design programs. A better way of describing '+
  74.                'Delphi is an Object Pascal-based visual development environment.'#13+
  75.                'The VCL is intimately tied to the Delphi IDE, and is what gives you the ability '+
  76.                'to quickly develop applications. The Component palette and Object Inspector allow '+
  77.                'you to drop VCL components on forms and then manipulate the properties and events of '+
  78.                'those controls without having to write a single line of code.'#13+
  79.                'Despite its name, the VCL is not entirely made up of visual components. '+
  80.                'In fact, of the over 600 objects in the VCL, most are not visual. '+
  81.                'The Delphi IDE allows you to visually add some nonvisual components to '+
  82.                'your programs. For example, if you wanted to write a database application '+
  83.                'that connected to a table, you would drop a TDataSource component on your '+
  84.                'form. TDataSource is a nonvisual component, but is represented on the form by '+
  85.                'an icon (which doesn抰 show up at runtime), and you can manipulate the properties '+
  86.                'and events of TDataSource in the Object Inspector just as you would a visual control.'#13+
  87.                'All VCL objects, and in fact all objects in Object Pascal, are derived from TObject. '+
  88.                'TObject is unique in that it is an abstract object that has no properties or events, '+
  89.                'only methods that allow you to derive objects from this base class. Use TObject as the '+
  90.                'immediate base class when writing simple objects that are not components. Components are '+
  91.                'objects that you can manipulate at design time. All components in the VCL are derived '+
  92.                'from the abstract component type TComponent. The VCL components you will likely use the '+
  93.                'most are the VCL抯 controls, such as TForm or TSpeedButton. Controls are visual components'+
  94.                ' derived from the abstract component type TControl.'#13+
  95.                'You can use Delphi to create Object Pascal objects without using the VCL, '+
  96.                'although by creating any objects in Object Pascal, both your objects and VCL '+
  97.                'objects will share a common ancestor in TObject. However, by deriving new objects '+
  98.                'from VCL object, much of the work in designing applications is done for you by Delphi. '+
  99.                'For example, if you wanted to use a progress bar in your application but didn抰 like '+
  100.                'TProgressBar, Delphi抯 control that creates a progress bar, you could create a new '+
  101.                'object based on TProgressBar and override its properties, events, or methods.';
  102. var gr: TGraphic;
  103. begin
  104.   // Creating sample document
  105.   RichView1.AddNL('Printing Demo',1,2);
  106.   RichView1.AddTextNL(longtext,0,0,0);
  107.   RichView1.AddBreak;
  108.   RichView1.AddTextNL(longtext,0,1,1);
  109.   RichView1.AddBreak;
  110.   RichView1.AddTextNL(longtext,0,2,2);
  111.   RichView1.AddBreak;
  112.   RichView1.AddTextNL(longtext,0,3,3);
  113.   RichView1.AddBreak;
  114.   RichView1.AddTextNL(longtext,0,4,4);
  115.   RichView1.AddBreak;
  116.   RichView1.AddTextNL(longtext,0,5,5);
  117.   RichView1.AddBreak;
  118.   RichView1.AddTextNL(longtext,0,7,7);
  119.   RichView1.AddControlEx('', Panel2, 2, rvvaBaseline);
  120.   gr := TIcon.Create;
  121.   gr.Assign(Image1.Picture);
  122.   RichView1.AddPictureEx( '', gr, -1,  rvvaBaseLine);
  123.   gr := TMetafile.Create;
  124.   gr.Assign(Image2.Picture);
  125.   RichView1.AddPictureEx( '', gr, -1,  rvvaBaseLine);
  126.   // Created...
  127.   RichView1.Format;
  128.   // Assigning margins: 20 mm.
  129.   RVPrint1.LeftMarginMM   := 20;
  130.   RVPrint1.RightMarginMM  := 20;
  131.   RVPrint1.BottomMarginMM := 20;
  132.   // Top margin: 25 mm.
  133.   RVPrint1.TopMarginMM    := 25;
  134.   // Making printable area on preview visible...
  135.   RVPrintPreview1.MarginsPen.Style := psDot;
  136. end;
  137. {------------------------------------------------------------------------------}
  138. { Switching page to "Preview"                                                  }
  139. {------------------------------------------------------------------------------}
  140. procedure TForm1.PageControl1Change(Sender: TObject);
  141. begin
  142.   if (PageControl1.ActivePage.PageIndex=1) and not PreviewCreated then begin
  143.     PreviewCreated := True;
  144.     UpdatePreview;
  145.   end;
  146.   RVPrintPreview1.ZoomMode := rvzmFullPage;
  147. end;
  148. {------------------------------------------------------------------------------}
  149. procedure TForm1.UpdatePreview;
  150. begin
  151.   Screen.Cursor := crHourglass;
  152.   // Assigning document for printing:
  153.   RVPrint1.AssignSource(RichView1);
  154.   // Formatting pages:
  155.   RVPrint1.FormatPages(rvdoAll);
  156.   // Updating user interface for preview:
  157.   Scrollbar1.Min := 1;
  158.   Scrollbar1.Position := 1;
  159.   {$IFDEF RICHVIEWDEF4}
  160.   Scrollbar1.PageSize := 1;
  161.   {$ENDIF}
  162.   Scrollbar1.Max := RVPrint1.PagesCount;
  163.   // Preview will show full page:
  164.   RVPrintPreview1.ZoomMode := rvzmFullPage;
  165.   // Preview will show 1st page:
  166.   RVPrintPreview1.First;
  167.   Screen.Cursor := crDefault;
  168. end;
  169. {------------------------------------------------------------------------------}
  170. { Page turning:                                                                }
  171. {------------------------------------------------------------------------------}
  172. procedure TForm1.ScrollBar1Change(Sender: TObject);
  173. begin
  174.   if Scrollbar1.Position>0 then begin
  175.     RVPrintPreview1.PageNo := Scrollbar1.Position;
  176.     StatusBar1.SimpleText := Format('Page %d of %d',
  177.       [RVPrintPreview1.PageNo, RVPrint1.PagesCount]);
  178.   end;
  179. end;
  180. {------------------------------------------------------------------------------}
  181. { Event: printing inserted components.                                         }
  182. { We need to create bitmap, draw component onto it,                            }
  183. { and assign this bitmap to ComponentImage parameter.                          }
  184. { Bitmap should have the same size as component (if not, it will be scaled)    }
  185. { CtrlImg.pas from RichView package has useful function DrawControl.           }
  186. {------------------------------------------------------------------------------}
  187. procedure TForm1.RVPrint1PrintComponent(Sender: TCustomRVPrint;
  188.   PrintMe: TControl; var ComponentImage: TBitmap);
  189. begin
  190.   ComponentImage := DrawControl(PrintMe);
  191.   // actually, DrawControl is used by default. You need to process this
  192.   // event only if you are not satisfied with its results.
  193. end;
  194. {------------------------------------------------------------------------------}
  195. { Printing...                                                                  }
  196. {------------------------------------------------------------------------------}
  197. procedure TForm1.btnPrintClick(Sender: TObject);
  198. begin
  199.   if not PreviewCreated then begin
  200.     PreviewCreated := True;
  201.     UpdatePreview;
  202.   end;
  203.   // do not print empty document!
  204.   if RichView1.ItemCount=0 then
  205.     exit;
  206.   PrintDialog1.MinPage := 1;
  207.   PrintDialog1.MaxPage := RVPrint1.PagesCount;
  208.   PrintDialog1.FromPage := 1;
  209.   PrintDialog1.ToPage := RVPrint1.PagesCount;
  210.   // we can print a whole document or specified pages:
  211.   if PrintDialog1.Execute then begin
  212.     // it's possible that current printer was changed.
  213.     // so we need to reformat document and update preview:
  214.     UpdatePreview;
  215.     case PrintDialog1.PrintRange of
  216.       prAllPages:
  217.         RVPrint1.Print( 'Test', PrintDialog1.Copies, PrintDialog1.Collate);
  218.       prPageNums:
  219.         RVPrint1.PrintPages(PrintDialog1.FromPage, PrintDialog1.ToPage,
  220.               'Test', PrintDialog1.Copies, PrintDialog1.Collate);
  221.     end;
  222.   end;
  223. end;
  224. {------------------------------------------------------------------------------}
  225. { Event: displaying formatting progress...                                     }
  226. {------------------------------------------------------------------------------}
  227. procedure TForm1.RVPrint1Formatting(Sender: TCustomRichView;
  228.   PageCompleted: Integer; Step: TRVPrintingStep);
  229. begin
  230.   case Step of
  231.     rvpsStarting:
  232.       StatusBar1.SimpleText := 'Repaginating...';
  233.     rvpsProceeding:
  234.       StatusBar1.SimpleText := Format('Repaginating (%d)',[PageCompleted]);
  235.     rvpsFinished:
  236.       StatusBar1.SimpleText := '';
  237.   end;
  238. end;
  239. {------------------------------------------------------------------------------}
  240. { Event: displaying printing (spooling) progress...                                     }
  241. {------------------------------------------------------------------------------}
  242. procedure TForm1.RVPrint1SendingToPrinter(Sender: TCustomRichView;
  243.   PageCompleted: Integer; Step: TRVPrintingStep);
  244. begin
  245.   case Step of
  246.     rvpsStarting:
  247.       StatusBar1.SimpleText := 'Starting...';
  248.     rvpsProceeding:
  249.       StatusBar1.SimpleText := Format('Printing (%d)',[PageCompleted]);
  250.     rvpsFinished:
  251.       StatusBar1.SimpleText := '';
  252.   end;
  253. end;
  254. {------------------------------------------------------------------------------}
  255. { (NEW) Event: prepaint on page                                                }
  256. {------------------------------------------------------------------------------}
  257. procedure TForm1.RVPrint1PagePrepaint(Sender: TRVPrint; PageNo: Integer;
  258.   Canvas: TCanvas; Preview: Boolean; PageRect, PrintAreaRect: TRect);
  259. var w,h: Integer;
  260.     s: String;
  261. begin
  262.   // This is a temporary solution for drawing page numbers and similalar stuff
  263.   // This example outputs string just above RichView contents
  264.   s := Format ('-- Page %d of %d --', [PageNo, Sender.PagesCount]);
  265.   Canvas.Brush.Style := bsClear;
  266.   Canvas.Font.Assign(RVStyle1.TextStyles[0]);
  267.   w := Canvas.TextWidth(s);
  268.   h := Canvas.TextHeight(s);
  269.   TextOut(Canvas.Handle, (PrintAreaRect.Right+PrintAreaRect.Left-w) div 2,
  270.                   PrintAreaRect.Top - h - 10, PChar(s), Length(s));
  271. end;
  272. procedure TForm1.Panel3Resize(Sender: TObject);
  273. begin
  274.   // In earlier versions of Delphi scrollbars do not have Align property...
  275.   // Aligning to the right side of panel
  276.   ScrollBar1.SetBounds(Panel3.ClientWidth-ScrollBar1.Width, 0,
  277.                        ScrollBar1.Width, Panel3.ClientHeight);
  278. end;
  279. end.