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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. {==============================================================================}
  4. { Demo:                                                                        }
  5. { 1. how to load RVF file saved in demo editor.                                }
  6. { 2. HTML export with custom saving of images                                  }
  7. {    (uses free Anders Melander's TGifImage:                                   }
  8. {     http://www.torry.net/vcl/graphics/gif/gifimage.exe)                      }
  9. {     http://www.trichview.com/resources/thirdparty/gifimage.zip (update)      }
  10. {     but can be modified to work with other GIF implementations               }
  11. {     supporting assignment from other graphic formats)                        }
  12. {------------------------------------------------------------------------------}
  13. { Note: Gif images have 256 colors or less. Some pictures may lose quality     }
  14. { when converting to Gifs                                                      }
  15. {------------------------------------------------------------------------------}
  16. { Sergey Tkachenko                                                             }
  17. {==============================================================================}
  18. {$I RV_Defs.inc}
  19. uses
  20.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  21.   RVScroll, RichView, StdCtrls, ExtCtrls, RVStyle, OleCtnrs,
  22.   {$IFDEF RICHVIEWDEF4}
  23.   ImgList,
  24.   {$ENDIF}
  25.   ComCtrls, CRVData, CRVFData, RVTable, GifImage;
  26. type
  27.   TForm1 = class(TForm)
  28.     RichView1: TRichView;
  29.     OpenDialog1: TOpenDialog;
  30.     Panel1: TPanel;
  31.     Button1: TButton;
  32.     StatusBar1: TStatusBar;
  33.     Button2: TButton;
  34.     CheckBox1: TCheckBox;
  35.     SaveDialog1: TSaveDialog;
  36.     Label1: TLabel;
  37.     Edit1: TEdit;
  38.     Label2: TLabel;
  39.     Edit2: TEdit;
  40.     ImageList1: TImageList;
  41.     RVStyle1: TRVStyle;
  42.     procedure Button1Click(Sender: TObject);
  43.     procedure RichView1RVFImageListNeeded(Sender: TCustomRichView;
  44.       ImageListTag: Integer; var il: TCustomImageList);
  45.     procedure FormCreate(Sender: TObject);
  46.     procedure RichView1RVMouseMove(Sender: TObject; id: Integer);
  47.     procedure RichView1Jump(Sender: TObject; id: Integer);
  48.     procedure RichView1HTMLSaveImage(Sender: TCustomRichView;
  49.       RVData: TCustomRVData; ItemNo: Integer; const Path: String;
  50.       BackgroundColor: TColor; var Location: String;
  51.       var DoDefault: Boolean);
  52.     procedure Button2Click(Sender: TObject);
  53.     procedure RichView1SaveComponentToFile(Sender: TCustomRichView; Path: string;
  54.       SaveMe: TPersistent; SaveFormat: TRVSaveFormat; var OutStr: string);
  55.     procedure RichView1SaveHTMLExtra(Sender: TCustomRichView;
  56.       Area: TRVHTMLSaveArea; CSSVersion: Boolean; var HTMLCode: String);
  57.     procedure RichView1WriteHyperlink(Sender: TCustomRichView; id: Integer;
  58.       RVData: TCustomRVData; ItemNo: Integer; SaveFormat: TRVSaveFormat;
  59.       var Target, Extras: String);
  60.   private
  61.     { Private declarations }
  62.   public
  63.     { Public declarations }
  64.   end;
  65. var
  66.   Form1: TForm1;
  67. implementation
  68. {$R *.DFM}
  69. {==================== Notes about loading from RVF files:=======================
  70. 1. In simplest cases you can just write: RichView1.LoadRVF(<file name>);
  71. 2. If file contains inserted Delphi Controls, these controls must be registered
  72.    with RegisterClasses functions before loading (see FormCreate below)
  73. 3. If file contains images from image lists, you need to process
  74.    OnRVFImageListNeeded event (see RichView1RVFImageListNeeded below)
  75.    If you have several image lists, you can distinguish them using
  76.    ImageListTag parameter of this event.
  77. 4. You must have the same (or compatible) TRVStyle object assigned to
  78.    RichView1.Style as in editor.
  79.    Otherwise, you need to set option "Allow adding styles dynamically"
  80.    both in richview which saves and in richview which loads RVF
  81.    (right-click RichView in Delphi, choose "Settings" in the context menu)
  82. 5. If some items in RVF file have character strings associated as items' tags
  83.    (rvoTagsArePChars was in editor's Options), you need also set rvoTagsArePChars
  84.    in RichView1.Options.
  85. ===============================================================================}
  86. {===================== Notes about HTML export =================================
  87. 1. There are 2 methods for saving HTML files:
  88.    a) SaveHTML - saving HTML file, where formatting is made by <FONT>,<B>,
  89.      <I> tags, etc.
  90.    b) SaveHTMLEx - saving HTML file, where formatting is made by Cascading
  91.      Style Sheet
  92. 2. Images are saved in separate files in JPG-files (or in BMP-files for Delphi2,
  93.    or if RVDONOTUSEJPEGIMAGE directive is defined)
  94. 3. By default, images are saved in the same directory as HTML file, and have
  95.    names built as Prefix + Number + .JPG.
  96.    You can specify your own prefix as a parameter of SaveHTML[Ex].
  97.    You can include subdirectory in prefix (such as 'imagesimg'), but this
  98.    subdirectory will NOT be created automatically.
  99. 4. JPEG/BMP do not support transparency. Transparent color (of metafiles,
  100.    icons, imagelist images) is replaced with the current background color
  101.    (of RichView or table cell or paragraph background)
  102. 5. By default, images from imagelists (bullets and hotspot) are saved like
  103.    other images, but the same image saved only one time (next occurrences
  104.    point to the same image file, if they have the same background color)
  105. 6. You can save images yourself using OnHTMLSaveImage event (new in v1.4).
  106.    You need to store image to file and return its location in 'Location'
  107.    parameter.
  108.    This demo shows
  109.    a) how to save images in GIF-files
  110.    b) how to save bullets in a way allowing to use the same image files for
  111.       all HTML document generated by your application.
  112. 7. By default hypertext is not saved.
  113.    You can specify destinations of [some/all] hypertext jumps
  114.    using OnWriteHyperlink event.
  115. 8. By default inserted controls are not saved.
  116.    You can save them using OnSaveComponentToFile event
  117. 9. You can save additional information in OnSaveHTMLExtra.   
  118. ===============================================================================}
  119. procedure TForm1.FormCreate(Sender: TObject);
  120. begin
  121.   RegisterClasses([TButton, TEdit, TOleContainer]);
  122. end;
  123. {============================== RVF loading ===================================}
  124. procedure TForm1.Button1Click(Sender: TObject);
  125. begin
  126.   if OpenDialog1.Execute then begin
  127.     if not RichView1.LoadRVF(OpenDialog1.FileName) then
  128.       Application.MessageBox('Error Loading File', nil, MB_OK);
  129.     RichView1.Format;
  130.   end;
  131. end;
  132. {------------------------------------------------------------------------------}
  133. procedure TForm1.RichView1RVFImageListNeeded(Sender: TCustomRichView;
  134.   ImageListTag: Integer; var il: TCustomImageList);
  135. begin
  136.   il := ImageList1;
  137. end;
  138. {============================ Hypertext testing ===============================}
  139. procedure TForm1.RichView1RVMouseMove(Sender: TObject; id: Integer);
  140. var RVData: TCustomRVFormattedData;
  141.     ItemNo: Integer;
  142. begin
  143.   if id=-1 then
  144.     StatusBar1.SimpleText := ''
  145.   else begin
  146.     RichView1.GetJumpPointLocation(id, RVData, ItemNo);
  147.     StatusBar1.SimpleText := PChar(RVData.GetItemTag(ItemNo));
  148.   end;
  149. end;
  150. {------------------------------------------------------------------------------}
  151. procedure TForm1.RichView1Jump(Sender: TObject; id: Integer);
  152. var RVData: TCustomRVFormattedData;
  153.     ItemNo: Integer;
  154. begin
  155.   RichView1.GetJumpPointLocation(id, RVData, ItemNo);
  156.   StatusBar1.SimpleText := PChar(RVData.GetItemTag(ItemNo));
  157.   Application.MessageBox(PChar(StatusBar1.SimpleText),'Click', 0);
  158. end;
  159. {============================ SAVING TO HTML ==================================}
  160. procedure TForm1.Button2Click(Sender: TObject);
  161. var SaveOptions: TRVSaveOptions;
  162. var r: Boolean;
  163. begin
  164.   if SaveDialog1.Execute then begin
  165.     Screen.Cursor := crHourglass;
  166.     if Checkbox1.Checked then
  167.       SaveOptions := [rvsoOverrideImages]
  168.     else
  169.       SaveOptions := [];
  170.     case SaveDialog1.FilterIndex of
  171.       1:
  172.         r := RichView1.SaveHTML(SaveDialog1.FileName,'Demo File',Edit2.Text, SaveOptions);
  173.       2:
  174.         r := RichView1.SaveHTMLEx(SaveDialog1.FileName,'Demo File',Edit1.Text,
  175.                                       '','','',SaveOptions);
  176.       else
  177.         r := False;
  178.     end;
  179.     Screen.Cursor := crDefault;
  180.     if not r then
  181.       Application.MessageBox('Error during saving', 'Error', 0);
  182.   end;
  183. end;
  184. {------------------------------------------------------------------------------}
  185. // Event: overriding default saving of images: saving as Gifs
  186. procedure TForm1.RichView1HTMLSaveImage(Sender: TCustomRichView;
  187.   RVData: TCustomRVData; ItemNo: Integer; const Path: String;
  188.   BackgroundColor: TColor; var Location: String; var DoDefault: Boolean);
  189. var gif: TGifImage;
  190.     wmf: TMetafile;
  191.     gr: TGraphic;
  192.     s: String;
  193.     AVAlign: TRVVAlign;
  194.     ATag: Integer;
  195.     ImageList: TCustomImageList;
  196.     ImageIndex: Integer;
  197.     Canvas: TMetafileCanvas;
  198. begin
  199.   // Parameters:
  200.   // Saving item is defined by pair (RVData, ItemNo).
  201.   // It is the ItemNo-th item in RVData object.
  202.   // RVData may be RichView.RVData, or cell, or RVData of cell inplace editor.
  203.   // Path - destination directory of HTML file.
  204.   // BackgroundColor - color of background under this item. Not used here
  205.   // because GIFs support true transparency.
  206.   // Location - output parameter to specify filename of image file
  207.   // DoDefault - set to false if you save this item as image yourself.
  208.   if ItemNo<0 then begin
  209.     // saving background
  210.      gif := TGifImage.Create;
  211.      try
  212.        gif.ColorReduction := rmQuantize;
  213.        if RVData is TRVTableCellData then
  214.          gif.Assign(TRVTableCellData(RVData).BackgroundImage) // table cell background
  215.        else
  216.          gif.Assign(Sender.BackgroundBitmap); // document background
  217.        Location := RVData.GetNextFileName(Edit2.Text, Path, '.gif', RichView1.imgSaveNo, Checkbox1.Checked);
  218.        gif.SaveToFile(Location);
  219.        Location := ExtractRelativePath(Path, Location);
  220.        DoDefault := False;
  221.      finally
  222.        gif.Free;
  223.      end;
  224.      exit;
  225.   end;
  226.   gif := nil;
  227.   case RVData.GetItemStyle(ItemNo) of
  228.     rvsPicture, rvsHotPicture:
  229.       begin
  230.         // Assigning image to GIF and saving
  231.         // (metafiles and icons will be saved with transparency)
  232.         gif := TGifImage.Create;
  233.         gif.ColorReduction := rmQuantize;
  234.         RVData.GetPictureInfo(ItemNo, s, gr, AVAlign, ATag);
  235.         gif.Assign(gr);
  236.         Location := RVData.GetNextFileName(Edit2.Text, Path, '.gif', RichView1.imgSaveNo, Checkbox1.Checked);
  237.       end;
  238.     rvsTable:
  239.       begin
  240.         // Saving table background image
  241.         gif := TGifImage.Create;
  242.         gif.ColorReduction := rmQuantize;
  243.         gif.Assign(TRVTableItemInfo(RVData.GetItem(ItemNo)).BackgroundImage);
  244.         Location := RVData.GetNextFileName(Edit2.Text, Path, '.gif', RichView1.imgSaveNo, Checkbox1.Checked);
  245.       end;
  246.     rvsBullet, rvsHotspot:
  247.       begin
  248.         // This is not efficient way, because the same image will be
  249.         // saved many times. In your application you can save bullets
  250.         // before saving HTMLs, and here only return file name.
  251.         RVData.GetBulletInfo(ItemNo, s, ImageIndex, ImageList, ATag);
  252.         wmf := TMetafile.Create;
  253.         try
  254.           gif := TGifImage.Create;
  255.           gif.ColorReduction := rmQuantize;
  256.           // Drawing image from imagelist to metafile
  257.           // This method allows to save transparency
  258.           wmf.Width := TImageList(ImageList).Width;
  259.           wmf.Height := TImageList(ImageList).Height;
  260.           Canvas := TMetafileCanvas.Create(wmf, 0);
  261.           ImageList.Draw(Canvas,0,0, ImageIndex);
  262.           Canvas.Free;
  263.           // Assigning metafile to GIF and saving
  264.           gif.Assign(wmf);
  265.           // Saving to Path + Bullets Prefix + ImageIndex + .gif
  266.           Location := Format('%s%s%d.gif', [Path, Edit1.Text, ImageIndex]);
  267.         finally
  268.           wmf.Free;
  269.         end;
  270.       end;
  271.     // List markers can also have pictures. Not processed in this demo
  272.   end;
  273.   if gif<>nil then begin
  274.     gif.SaveToFile(Location);
  275.     Location := ExtractRelativePath(Path, Location);
  276.     DoDefault := False;
  277.     gif.Free;
  278.   end;
  279. end;
  280. {------------------------------------------------------------------------------}
  281. // Event: saving hyperlinks
  282. procedure TForm1.RichView1WriteHyperlink(Sender: TCustomRichView;
  283.   id: Integer; RVData: TCustomRVData; ItemNo: Integer;
  284.   SaveFormat: TRVSaveFormat; var Target, Extras: String);
  285. begin
  286.   Target := PChar(RVData.GetItemTag(ItemNo));
  287. end;
  288. {------------------------------------------------------------------------------}
  289. // Event: saving components
  290. procedure TForm1.RichView1SaveComponentToFile(Sender: TCustomRichView;
  291.   Path: string; SaveMe: TPersistent; SaveFormat: TRVSaveFormat;
  292.   var OutStr: string);
  293. begin
  294.   case SaveFormat of
  295.    rvsfHTML:
  296.        begin
  297.          if SaveMe is TButton then begin
  298.            OutStr := '<INPUT type="button" value="'+TButton(SaveMe).Caption+'" '+
  299.                      'onClick="alert(''Just a demo'')">';
  300.            exit;
  301.          end;
  302.          if SaveMe is TEdit then begin
  303.            OutStr := '<INPUT type="text" value="'+TEdit(SaveMe).Text+'">';
  304.            exit;
  305.          end;
  306.        end;
  307.    end;
  308. end;
  309. {------------------------------------------------------------------------------}
  310. // Event: saving additional information
  311. procedure TForm1.RichView1SaveHTMLExtra(Sender: TCustomRichView;
  312.   Area: TRVHTMLSaveArea; CSSVersion: Boolean; var HTMLCode: String);
  313. begin
  314.   case Area of   rv_thms_Head:     HTMLCode := '<script></script>';   rv_thms_BodyAttribute:     HTMLCode := 'alink=#ff0000';   rv_thms_Body:     HTMLCode := 'This document was generated by '+     '<A href="http://www.trichview.com">RichView</A><BR>';   end; end;
  315. end.