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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, Buttons, ComCtrls, ExtCtrls, Menus,
  6.   RVStyle, RVScroll, RichView, RVEdit;
  7. {==============================================================================}
  8. { RichEditor Demo
  9.   Menu items disabling/enabling is not implemented here.
  10.   The main idea: new styles are created and added to rvs.TextStyles when needed.
  11.   The right place for this - rve.OnStyleConversion and rve.OnParaStyleConversion
  12.   IMPORTANT: If you right click the editor in design time, choose "Settings"
  13.   in the context menu, you'll see that radiogroup is in state
  14.   "Allow adding styles dynamically"
  15. {==============================================================================}
  16. type
  17.   TForm1 = class(TForm)
  18.     Panel1: TPanel;
  19.     StatusBar1: TStatusBar;
  20.     rve: TRichViewEdit;
  21.     rvs: TRVStyle;
  22.     cmbFont: TComboBox;
  23.     btnBold: TSpeedButton;
  24.     btnItalic: TSpeedButton;
  25.     btnUnderline: TSpeedButton;
  26.     btnFont: TSpeedButton;
  27.     btnLeft: TSpeedButton;
  28.     btnCenter: TSpeedButton;
  29.     btnRight: TSpeedButton;
  30.     btnJustify: TSpeedButton;
  31.     btnOpen: TSpeedButton;
  32.     btnSave: TSpeedButton;
  33.     btnSaveAs: TSpeedButton;
  34.     btnNew: TSpeedButton;
  35.     cmbFontSize: TComboBox;
  36.     Label2: TLabel;
  37.     Label3: TLabel;
  38.     MainMenu1: TMainMenu;
  39.     File1: TMenuItem;
  40.     mitOpen: TMenuItem;
  41.     mitSave: TMenuItem;
  42.     mitNew: TMenuItem;
  43.     mitSaveAs: TMenuItem;
  44.     N1: TMenuItem;
  45.     mitExit: TMenuItem;
  46.     Edit1: TMenuItem;
  47.     mitUndo: TMenuItem;
  48.     mitRedo: TMenuItem;
  49.     N2: TMenuItem;
  50.     mitCut: TMenuItem;
  51.     mitCopy: TMenuItem;
  52.     mitPaste: TMenuItem;
  53.     mitDelete: TMenuItem;
  54.     od: TOpenDialog;
  55.     sd: TSaveDialog;
  56.     fd: TFontDialog;
  57.     btnIdentInc: TSpeedButton;
  58.     btnIdentDec: TSpeedButton;
  59.     btnFontColor: TSpeedButton;
  60.     btnFontBackColor: TSpeedButton;
  61.     SpeedButton1: TSpeedButton;
  62.     cd: TColorDialog;
  63.     procedure mitNewClick(Sender: TObject);
  64.     procedure mitOpenClick(Sender: TObject);
  65.     procedure mitSaveClick(Sender: TObject);
  66.     procedure mitSaveAsClick(Sender: TObject);
  67.     procedure mitExitClick(Sender: TObject);
  68.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  69.     procedure rveChange(Sender: TObject);
  70.     procedure FormCreate(Sender: TObject);
  71.     procedure rveCurTextStyleChanged(Sender: TObject);
  72.     procedure rveCurParaStyleChanged(Sender: TObject);
  73.     procedure cmbFontClick(Sender: TObject);
  74.     procedure rveStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
  75.       UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
  76.     procedure mitUndoClick(Sender: TObject);
  77.     procedure mitRedoClick(Sender: TObject);
  78.     procedure mitCutClick(Sender: TObject);
  79.     procedure mitCopyClick(Sender: TObject);
  80.     procedure mitPasteClick(Sender: TObject);
  81.     procedure mitDeleteClick(Sender: TObject);
  82.     procedure mitFontClick(Sender: TObject);
  83.     procedure btnApplyParaClick(Sender: TObject);
  84.     procedure cmbFontSizeClick(Sender: TObject);
  85.     procedure cmbFontSizeKeyPress(Sender: TObject; var Key: Char);
  86.     procedure cmbFontSizeExit(Sender: TObject);
  87.     procedure FontStyleButtonClick(Sender: TObject);
  88.     procedure rveParaStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
  89.       UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
  90.     procedure btnIdentDecClick(Sender: TObject);
  91.     procedure btnIdentIncClick(Sender: TObject);
  92.     procedure btnFontColorClick(Sender: TObject);
  93.     procedure btnFontBackColorClick(Sender: TObject);
  94.     procedure SpeedButton1Click(Sender: TObject);
  95.   private
  96.     { Private declarations }
  97.     FileName, FontName: String;
  98.     IgnoreChanges: Boolean;
  99.     FontSize: Integer;
  100.     function SaveIfNeeded: Boolean;
  101.     function Save: Boolean;
  102.     function SaveAs: Boolean;
  103.     procedure Open;
  104.     procedure New;
  105.     function GetAlignmentFromUI: TRVAlignment;
  106.     procedure SetAlignmentToUI(Alignment: TRVAlignment);
  107.   public
  108.     { Public declarations }
  109.   end;
  110. var
  111.   Form1: TForm1;
  112. implementation
  113. // Parameters for ApplyStyleConversion
  114. const
  115.   TEXT_BOLD       = 1;
  116.   TEXT_ITALIC     = 2;
  117.   TEXT_UNDERLINE  = 3;
  118.   TEXT_APPLYFONTNAME  = 4;
  119.   TEXT_APPLYFONT      = 5;
  120.   TEXT_APPLYFONTSIZE  = 6;
  121.   TEXT_COLOR      = 7;
  122.   TEXT_BACKCOLOR  = 8;
  123. // Parameters for ApplyParaStyleConversion
  124.   PARA_ALIGNMENT  = 1;
  125.   PARA_INDENTINC  = 2;
  126.   PARA_INDENTDEC  = 3;
  127.   PARA_COLOR      = 4;  
  128. {$R *.DFM}
  129. {------------------------------------------------------------------------------}
  130. procedure TForm1.FormCreate(Sender: TObject);
  131. begin
  132.   // Filling font names combobox
  133.   cmbFont.Items.Assign(Screen.Fonts);
  134.   New;
  135. end;
  136. {------------------------------------------------------------------------------}
  137. // data in editor were changed
  138. procedure TForm1.rveChange(Sender: TObject);
  139. begin
  140.   StatusBar1.Panels[0].Text := 'Modified';
  141. end;
  142. {------------------------------------------------------------------------------}
  143. // current text style was changed
  144. procedure TForm1.rveCurTextStyleChanged(Sender: TObject);
  145. var fi: TFontInfo;
  146. begin
  147.   IgnoreChanges := True;
  148.   StatusBar1.Panels[1].Text := 'Style : '+IntToStr(rve.CurTextStyleNo);
  149.   // Changing selection in comboboxes with font names and sizes:
  150.   fi := rvs.TextStyles[rve.CurTextStyleNo];
  151.   cmbFont.ItemIndex := cmbFont.Items.IndexOf(fi.FontName);
  152.   cmbFontSize.Text := IntToStr(fi.Size);
  153.   // Checking font buttons
  154.   btnBold.Down      := fsBold      in fi.Style;
  155.   btnItalic.Down    := fsItalic    in fi.Style;
  156.   btnUnderline.Down := fsUnderline in fi.Style;
  157.   IgnoreChanges := False;
  158. end;
  159. {------------------------------------------------------------------------------}
  160. // current paragraph style was changed
  161. procedure TForm1.rveCurParaStyleChanged(Sender: TObject);
  162. begin
  163.   SetAlignmentToUI(rvs.ParaStyles[rve.CurParaStyleNo].Alignment);
  164. end;
  165. {------------------------------------------------------------------------------}
  166. function TForm1.GetAlignmentFromUI: TRVAlignment;
  167. begin
  168.   if btnLeft.Down then
  169.     Result := rvaLeft
  170.   else if btnRight.Down then
  171.     Result := rvaRight
  172.   else if btnCenter.Down then
  173.     Result := rvaCenter
  174.   else
  175.     Result := rvaJustify;
  176. end;
  177. {------------------------------------------------------------------------------}
  178. procedure TForm1.SetAlignmentToUI(Alignment: TRVAlignment);
  179. begin
  180.   case Alignment of
  181.     rvaLeft:
  182.       btnLeft.Down := True;
  183.     rvaCenter:
  184.       btnCenter.Down := True;
  185.     rvaRight:
  186.       btnRight.Down := True;
  187.     rvaJustify:
  188.       btnJustify.Down := True;
  189.   end;
  190. end;
  191. {------------------------------------------------------------------------------}
  192. // applying font name
  193. procedure TForm1.cmbFontClick(Sender: TObject);
  194. begin
  195.   if (cmbFont.ItemIndex<>-1) then begin
  196.     if not IgnoreChanges then begin
  197.       FontName := cmbFont.Items[cmbFont.ItemIndex];
  198.       rve.ApplyStyleConversion(TEXT_APPLYFONTNAME);
  199.     end;
  200.   end;
  201.   if Visible then
  202.     rve.SetFocus;
  203. end;
  204. {------------------------------------------------------------------------------}
  205. // applying font size
  206. procedure TForm1.cmbFontSizeClick(Sender: TObject);
  207. begin
  208.   if (cmbFontSize.Text<>'') and not IgnoreChanges then begin
  209.       FontSize := StrToIntDef(cmbFontSize.Text, 10);
  210.       rve.ApplyStyleConversion(TEXT_APPLYFONTSIZE);
  211.   end;
  212.   if Visible then
  213.     rve.SetFocus;
  214. end;
  215. {------------------------------------------------------------------------------}
  216. // bold, italic, underline
  217. procedure TForm1.FontStyleButtonClick(Sender: TObject);
  218. var Button: TSpeedButton;
  219. begin
  220.   Button := Sender as TSpeedButton;
  221.   // constants TEXT_BOLD, TEXT_ITALIC and TEXT_UNDERLINE are
  222.   // assigned to the tags of corresponding buttons
  223.   rve.ApplyStyleConversion(Button.Tag);
  224. end;
  225. {------------------------------------------------------------------------------}
  226. // applying font
  227. procedure TForm1.mitFontClick(Sender: TObject);
  228. begin
  229.   fd.Font.Assign(rvs.TextStyles[rve.CurTextStyleNo]);
  230.   if fd.Execute then begin
  231.     rve.ApplyStyleConversion(TEXT_APPLYFONT);
  232.   end;
  233. end;
  234. {------------------------------------------------------------------------------}
  235. // applying text color
  236. procedure TForm1.btnFontColorClick(Sender: TObject);
  237. begin
  238.   cd.Color := rvs.TextStyles[rve.CurTextStyleNo].Color;
  239.   if cd.Execute then
  240.     rve.ApplyStyleConversion(TEXT_COLOR);
  241. end;
  242. {------------------------------------------------------------------------------}
  243. // applying text background color
  244. procedure TForm1.btnFontBackColorClick(Sender: TObject);
  245. begin
  246.   case Application.MessageBox('Make the selected text background transparent?'#13+
  247.                             '(YES - make transparent; NO - choose color)',
  248.                             'Text Background', MB_YESNOCANCEL or MB_ICONQUESTION) of
  249.     IDYES:
  250.       cd.Color := clNone;
  251.     IDNO:
  252.       begin
  253.         cd.Color := rvs.TextStyles[rve.CurTextStyleNo].BackColor;
  254.         if cd.Color=clNone then
  255.           cd.Color := clWhite;
  256.         if not cd.Execute then
  257.           exit;
  258.       end;
  259.     IDCANCEL:
  260.       exit;
  261.   end;
  262.   rve.ApplyStyleConversion(TEXT_BACKCOLOR);
  263. end;
  264. {------------------------------------------------------------------------------}
  265. // applying paragraph background color
  266. procedure TForm1.SpeedButton1Click(Sender: TObject);
  267. begin
  268.   case Application.MessageBox('Make the selected paragraph background transparent?'#13+
  269.                             '(YES - make transparent; NO - choose color)',
  270.                             'Text Background', MB_YESNOCANCEL or MB_ICONQUESTION) of
  271.     IDYES:
  272.       cd.Color := clNone;
  273.     IDNO:
  274.       begin
  275.         cd.Color := rvs.ParaStyles[rve.CurParaStyleNo].Background.Color;
  276.         if cd.Color=clNone then
  277.           cd.Color := clWhite;
  278.         if not cd.Execute then
  279.           exit;
  280.       end;
  281.     IDCANCEL:
  282.       exit;
  283.   end;
  284.   rve.ApplyParaStyleConversion(PARA_COLOR);
  285. end;
  286. {------------------------------------------------------------------------------}
  287. // The heart of this demo: rve.OnStyleConversion
  288. procedure TForm1.rveStyleConversion(Sender: TCustomRichViewEdit; StyleNo,
  289.   UserData: Integer; AppliedToText: Boolean; var NewStyleNo: Integer);
  290. var FontInfo: TFontInfo;
  291. begin
  292.   FontInfo := TFontInfo.Create(nil);
  293.   try
  294.     FontInfo.Assign(rvs.TextStyles[StyleNo]);
  295.     case UserData of
  296.       TEXT_BOLD:
  297.         if btnBold.Down then
  298.           FontInfo.Style := FontInfo.Style+[fsBold]
  299.         else
  300.           FontInfo.Style := FontInfo.Style-[fsBold];
  301.       TEXT_ITALIC:
  302.         if btnItalic.Down then
  303.           FontInfo.Style := FontInfo.Style+[fsItalic]
  304.         else
  305.           FontInfo.Style := FontInfo.Style-[fsItalic];
  306.       TEXT_UNDERLINE:
  307.         if btnUnderline.Down then
  308.           FontInfo.Style := FontInfo.Style+[fsUnderline]
  309.         else
  310.           FontInfo.Style := FontInfo.Style-[fsUnderline];
  311.       TEXT_APPLYFONTNAME:
  312.         FontInfo.FontName := FontName;
  313.       TEXT_APPLYFONTSIZE:
  314.         FontInfo.Size     := FontSize;
  315.       TEXT_APPLYFONT:
  316.         FontInfo.Assign(fd.Font);
  317.       TEXT_COLOR:
  318.         FontInfo.Color := cd.Color;
  319.       TEXT_BACKCOLOR:
  320.         FontInfo.BackColor := cd.Color;
  321.       // add your code here....
  322.     end;
  323.     NewStyleNo := rvs.TextStyles.FindSuchStyle(StyleNo,FontInfo,RVAllFontInfoProperties);
  324.     if NewStyleNo=-1 then begin
  325.       rvs.TextStyles.Add;
  326.       NewStyleNo := rvs.TextStyles.Count-1;
  327.       rvs.TextStyles[NewStyleNo].Assign(FontInfo);
  328.       rvs.TextStyles[NewStyleNo].Standard := False;
  329.     end;
  330.   finally
  331.     FontInfo.Free;
  332.   end;
  333. end;
  334. {------------------------------------------------------------------------------}
  335. procedure TForm1.rveParaStyleConversion(Sender: TCustomRichViewEdit;
  336.   StyleNo, UserData: Integer; AppliedToText: Boolean;
  337.   var NewStyleNo: Integer);
  338. var ParaInfo: TParaInfo;
  339. begin
  340.   ParaInfo := TParaInfo.Create(nil);
  341.   try
  342.     ParaInfo.Assign(rvs.ParaStyles[StyleNo]);
  343.     case UserData of
  344.       PARA_ALIGNMENT:
  345.         ParaInfo.Alignment := GetAlignmentFromUI;
  346.       PARA_INDENTINC:
  347.         begin
  348.           ParaInfo.LeftIndent := ParaInfo.LeftIndent+20;
  349.           if ParaInfo.LeftIndent>200 then
  350.             ParaInfo.LeftIndent := 200;
  351.         end;
  352.       PARA_INDENTDEC:
  353.         begin
  354.           ParaInfo.LeftIndent := ParaInfo.LeftIndent-20;
  355.           if ParaInfo.LeftIndent<0 then
  356.             ParaInfo.LeftIndent := 0;
  357.         end;
  358.       PARA_COLOR:
  359.         ParaInfo.Background.Color := cd.Color;
  360.       // add your code here....
  361.     end;
  362.     NewStyleNo := rvs.ParaStyles.FindSuchStyle(StyleNo,ParaInfo,RVAllParaInfoProperties);
  363.     if NewStyleNo=-1 then begin
  364.       rvs.ParaStyles.Add;
  365.       NewStyleNo := rvs.ParaStyles.Count-1;
  366.       rvs.ParaStyles[NewStyleNo].Assign(ParaInfo);
  367.       rvs.ParaStyles[NewStyleNo].Standard := False;
  368.     end;
  369.   finally
  370.     ParaInfo.Free;
  371.   end;
  372. end;
  373. {------------------------------------------------------------------------------}
  374. // applying paragraph style
  375. procedure TForm1.btnApplyParaClick(Sender: TObject);
  376. begin
  377.   rve.ApplyParaStyleConversion(PARA_ALIGNMENT);
  378. end;
  379. {------------------------------------------------------------------------------}
  380. // changing left indents
  381. procedure TForm1.btnIdentDecClick(Sender: TObject);
  382. begin
  383.   rve.ApplyParaStyleConversion(PARA_INDENTDEC);
  384. end;
  385. procedure TForm1.btnIdentIncClick(Sender: TObject);
  386. begin
  387.   rve.ApplyParaStyleConversion(PARA_INDENTINC);
  388. end;
  389. {------------------------------------------------------------------------------}
  390. procedure TForm1.cmbFontSizeKeyPress(Sender: TObject; var Key: Char);
  391. begin
  392.   if ord(Key)=VK_RETURN then begin
  393.     Key := #0;
  394.     cmbFontSizeClick(nil);
  395.   end;
  396. end;
  397. {------------------------------------------------------------------------------}
  398. procedure TForm1.cmbFontSizeExit(Sender: TObject);
  399. begin
  400.   cmbFontSizeClick(nil);
  401. end;
  402. {------------------------------------------------------------------------------}
  403. procedure TForm1.mitUndoClick(Sender: TObject);
  404. begin
  405.   rve.Undo;
  406. end;
  407. {------------------------------------------------------------------------------}
  408. procedure TForm1.mitRedoClick(Sender: TObject);
  409. begin
  410.   rve.Redo;
  411. end;
  412. {------------------------------------------------------------------------------}
  413. procedure TForm1.mitCutClick(Sender: TObject);
  414. begin
  415.   rve.CutDef;
  416. end;
  417. {------------------------------------------------------------------------------}
  418. procedure TForm1.mitCopyClick(Sender: TObject);
  419. begin
  420.   rve.CopyDef;
  421. end;
  422. {------------------------------------------------------------------------------}
  423. procedure TForm1.mitPasteClick(Sender: TObject);
  424. begin
  425.   rve.Paste;
  426. end;
  427. {------------------------------------------------------------------------------}
  428. procedure TForm1.mitDeleteClick(Sender: TObject);
  429. begin
  430.   rve.DeleteSelection;
  431. end;
  432. {------------------------------------------------------------------------------}
  433. function TForm1.SaveIfNeeded: Boolean;
  434. begin
  435.   Result := True;
  436.   if rve.Modified then
  437.     case Application.MessageBox('Save file now?','File was modified',
  438.                                 MB_ICONQUESTION or MB_YESNOCANCEL) of
  439.       IDYES:
  440.         Result := Save;
  441.       IDNO:
  442.         Result := True;
  443.       IDCANCEL:
  444.         Result := False;
  445.     end;
  446. end;
  447. {------------------------------------------------------------------------------}
  448. function TForm1.Save: Boolean;
  449. begin
  450.   if FileName='' then
  451.     Result := SaveAs
  452.   else begin
  453.     rve.SaveRVF(FileName, False);
  454.     rve.Modified := False;
  455.     StatusBar1.Panels[0].Text := '';
  456.     Result := True;
  457.   end;
  458. end;
  459. {------------------------------------------------------------------------------}
  460. function TForm1.SaveAs: Boolean;
  461. begin
  462.   if sd.Execute then begin
  463.     FileName := sd.FileName;
  464.     Result := Save;
  465.     if Result then
  466.       Caption := ExtractFileName(FileName) + '- RDemo';
  467.     end
  468.   else
  469.     Result := False;
  470. end;
  471. {------------------------------------------------------------------------------}
  472. procedure TForm1.Open;
  473. begin
  474.   if not SaveIfNeeded then exit;
  475.   if od.Execute then begin
  476.     FileName := od.FileName;
  477.     rve.LoadRVF(FileName);
  478.     rve.Format;
  479.     rveCurTextStyleChanged(nil);
  480.     rveCurParaStyleChanged(nil);
  481.     StatusBar1.Panels[0].Text := '';
  482.     Caption := ExtractFileName(FileName) + '- RDemo';
  483.   end;
  484. end;
  485. {------------------------------------------------------------------------------}
  486. procedure TForm1.New;
  487. begin
  488.   if not SaveIfNeeded then exit;
  489.   FileName := '';
  490.   StatusBar1.Panels[0].Text := '';
  491.   Caption := 'Unnamed - RDemo';
  492.   rve.Clear;
  493.   rve.Format;
  494.   // you can delete non default styles here...
  495.   rveCurTextStyleChanged(nil);
  496.   rveCurParaStyleChanged(nil);
  497. end;
  498. {------------------------------------------------------------------------------}
  499. procedure TForm1.mitNewClick(Sender: TObject);
  500. begin
  501.   New;
  502. end;
  503. {------------------------------------------------------------------------------}
  504. procedure TForm1.mitOpenClick(Sender: TObject);
  505. begin
  506.   Open;
  507. end;
  508. {------------------------------------------------------------------------------}
  509. procedure TForm1.mitSaveClick(Sender: TObject);
  510. begin
  511.   Save;
  512. end;
  513. {------------------------------------------------------------------------------}
  514. procedure TForm1.mitSaveAsClick(Sender: TObject);
  515. begin
  516.   SaveAs;
  517. end;
  518. {------------------------------------------------------------------------------}
  519. procedure TForm1.mitExitClick(Sender: TObject);
  520. begin
  521.   Close;
  522. end;
  523. {------------------------------------------------------------------------------}
  524. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  525. begin
  526.   CanClose := SaveIfNeeded;
  527. end;
  528. end.