RichForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit RichForm;
  2. interface
  3. uses
  4.   SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, ComCtrls, ExtCtrls, Menus, ActnList, ToolWin, ImgList, ClipBrd,
  6.   RichEdit, AppEvnts;
  7. type
  8.   TFormRichNote = class(TForm)
  9.     RichEdit: TRichEdit;
  10.     OpenDialog: TOpenDialog;
  11.     SaveDialog: TSaveDialog;
  12.     ToolBar1: TToolBar;
  13.     tbtnNew: TToolButton;
  14.     tbtnOpen: TToolButton;
  15.     tbtnSave: TToolButton;
  16.     tbtnPrint: TToolButton;
  17.     ToolButton5: TToolButton;
  18.     tbtnUndo: TToolButton;
  19.     tbtnCut: TToolButton;
  20.     tbtnCopy: TToolButton;
  21.     tbtnPaste: TToolButton;
  22.     tbtnBold: TToolButton;
  23.     tbtnItalic: TToolButton;
  24.     ToolButton13: TToolButton;
  25.     ToolButton21: TToolButton;
  26.     Images: TImageList;
  27.     tbtnSize: TToolButton;
  28.     ComboFont: TComboBox;
  29.     SizeMenu: TPopupMenu;
  30.     Small1: TMenuItem;
  31.     Medium1: TMenuItem;
  32.     Large1: TMenuItem;
  33.     ColorBox1: TColorBox;
  34.     ToolButton1: TToolButton;
  35.     ToolButton2: TToolButton;
  36.     ApplicationEvents1: TApplicationEvents;
  37.     StatusBar: TStatusBar;
  38.     procedure BoldExecute(Sender: TObject);
  39.     procedure ItalicExecute(Sender: TObject);
  40.     procedure OpenExecute(Sender: TObject);
  41.     procedure FormCreate(Sender: TObject);
  42.     procedure NewExecute(Sender: TObject);
  43.     procedure SaveExecute(Sender: TObject);
  44.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  45.     procedure PrintExecute(Sender: TObject);
  46.     procedure RichEditChange(Sender: TObject);
  47.     procedure CutExecute(Sender: TObject);
  48.     procedure CopyExecute(Sender: TObject);
  49.     procedure PasteExecute(Sender: TObject);
  50.     procedure UndoExecute(Sender: TObject);
  51.     procedure tbtnSizeClick(Sender: TObject);
  52.     procedure SetFontSize(Sender: TObject);
  53.     procedure ComboFontClick(Sender: TObject);
  54.     procedure RichEditSelectionChange(Sender: TObject);
  55.     procedure ColorBox1Change(Sender: TObject);
  56.     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  57.     procedure ApplicationEvents1Hint(Sender: TObject);
  58.   private
  59.     FModified: Boolean;
  60.     FileName: string;
  61.     procedure SetModified(const Value: Boolean);
  62.     property Modified: Boolean read FModified write SetModified;
  63.     procedure CheckCapslock;
  64.   public
  65.     function SaveChanges: Boolean;
  66.     function Save: Boolean;
  67.     function SaveAs: Boolean;
  68.   end;
  69. var
  70.   FormRichNote: TFormRichNote;
  71. implementation
  72. {$R *.DFM}
  73. // status bar panels
  74. const
  75.   sbpMessage = 0;
  76.   sbpCaps = 1;
  77.   sbpPosition = 2;
  78. /////////// Font operations
  79. procedure TFormRichNote.BoldExecute(Sender: TObject);
  80. begin
  81.   with RichEdit.SelAttributes do
  82.     if fsBold in Style then
  83.       Style := Style - [fsBold]
  84.     else
  85.       Style := Style + [fsBold];
  86. end;
  87. procedure TFormRichNote.ItalicExecute(Sender: TObject);
  88. begin
  89.   with RichEdit.SelAttributes do
  90.     if fsItalic in Style then
  91.       Style := Style - [fsItalic]
  92.     else
  93.       Style := Style + [fsItalic];
  94. end;
  95. procedure TFormRichNote.tbtnSizeClick(Sender: TObject);
  96. begin
  97.   RichEdit.SelAttributes.Size :=
  98.     RichEdit.SelAttributes.Size + 2;
  99. end;
  100. procedure TFormRichNote.SetFontSize(Sender: TObject);
  101. begin
  102.   RichEdit.SelAttributes.Size :=
  103.     (Sender as TMenuItem).Tag;
  104. end;
  105. procedure TFormRichNote.ComboFontClick(Sender: TObject);
  106. begin
  107.   RichEdit.SelAttributes.Name := ComboFont.Text;
  108. end;
  109. procedure TFormRichNote.ColorBox1Change(Sender: TObject);
  110. begin
  111.   RichEdit.SelAttributes.Color := ColorBox1.Selected;
  112. end;
  113. /////////// File operations
  114. procedure TFormRichNote.NewExecute(Sender: TObject);
  115. begin
  116.   if not Modified or SaveChanges then
  117.   begin
  118.     RichEdit.Text := '';
  119.     Modified := False;
  120.     FileName := '';
  121.     Caption := Application.Title + ' - [Untitled]';
  122.   end;
  123. end;
  124. procedure TFormRichNote.OpenExecute(Sender: TObject);
  125. begin
  126.   if not Modified or SaveChanges then
  127.     if OpenDialog.Execute then
  128.     begin
  129.       Filename := OpenDialog.FileName;
  130.       RichEdit.Lines.LoadFromFile (FileName);
  131.       Modified := False;
  132.       Caption := Application.Title + ' - ' + FileName;
  133.       RichEdit.ReadOnly := ofReadOnly in
  134.         OpenDialog.Options;
  135.     end;
  136. end;
  137. // return False to skip current operation
  138. function TFormRichNote.SaveChanges: Boolean;
  139. begin
  140.   case MessageDlg (
  141.     'The document ' + filename + ' has changed.' +
  142.     #13#13 + 'Do you want to save the changes?',
  143.     mtConfirmation, mbYesNoCancel, 0) of
  144.   idYes:
  145.     // call Save and return its result
  146.     Result := Save;
  147.   idNo:
  148.     // do not save and continue
  149.     Result := True;
  150.   else // idCancel:
  151.     // do not save and abort operation
  152.     Result := False;
  153.   end;
  154. end;
  155. // return False means the SaveAs has been aborted
  156. function TFormRichNote.Save: Boolean;
  157. begin
  158.   if Filename = '' then
  159.     Result := SaveAs // ask for a file name
  160.   else
  161.   begin
  162.     RichEdit.Lines.SaveToFile (FileName);
  163.     Modified := False;
  164.     Result := True;
  165.   end;
  166. end;
  167. // return False if SaveAs dialog box is cancelled
  168. function TFormRichNote.SaveAs: Boolean;
  169. begin
  170.   SaveDialog.FileName := Filename;
  171.   if SaveDialog.Execute then
  172.   begin
  173.     Filename := SaveDialog.FileName;
  174.     Save;
  175.     Caption := Application.Title  + ' - ' + Filename;
  176.     Result := True;
  177.   end
  178.   else
  179.     Result := False;
  180. end;
  181. procedure TFormRichNote.SaveExecute(Sender: TObject);
  182. begin
  183.   if Modified then
  184.     Save;
  185. end;
  186. procedure TFormRichNote.PrintExecute(Sender: TObject);
  187. begin
  188.   RichEdit.Print (FileName);
  189. end;
  190. /////////// Form events
  191. procedure TFormRichNote.FormCreate(Sender: TObject);
  192. begin
  193.   Application.Title := Caption;
  194.   NewExecute (Self);
  195.   // initialize font selection
  196.   ComboFont.Items := Screen.Fonts;
  197.   ComboFont.ItemIndex := ComboFont.Items.IndexOf (
  198.     RichEdit.Font.Name);
  199. end;
  200. procedure TFormRichNote.FormCloseQuery(Sender: TObject;
  201.   var CanClose: Boolean);
  202. begin
  203.   // short-circuit evaluation: if not modified
  204.   // doesn't even try to save. Doesn't close if
  205.   // save request is cancelled
  206.   CanClose := not Modified or SaveChanges;
  207. end;
  208. // copy and paste operations
  209. procedure TFormRichNote.CutExecute(Sender: TObject);
  210. begin
  211.   RichEdit.CutToClipboard;
  212. end;
  213. procedure TFormRichNote.CopyExecute(Sender: TObject);
  214. begin
  215.   RichEdit.CopyToClipboard;
  216. end;
  217. procedure TFormRichNote.PasteExecute(Sender: TObject);
  218. begin
  219.   RichEdit.PasteFromClipboard;
  220. end;
  221. procedure TFormRichNote.UndoExecute(Sender: TObject);
  222. begin
  223.   RichEdit.Undo;
  224. end;
  225. // richedit events
  226. procedure TFormRichNote.RichEditChange(Sender: TObject);
  227. begin
  228.   // enables save operations
  229.   Modified := True;
  230. end;
  231. procedure TFormRichNote.RichEditSelectionChange(Sender: TObject);
  232. begin
  233.   tbtnBold.Down := fsBold in RichEdit.SelAttributes.Style;
  234.   tbtnItalic.Down := fsItalic in RichEdit.SelAttributes.Style;
  235.   tbtnCut.Enabled := RichEdit.SelLength > 0;
  236.   tbtnCopy.Enabled := tbtnCut.Enabled;
  237.   // select current font and color
  238.   ComboFont.ItemIndex :=
  239.     ComboFont.Items.IndexOf (RichEdit.SelAttributes.Name);
  240.   ColorBox1.Selected := RichEdit.SelAttributes.Color;
  241.   // update the position in the status bar
  242.   StatusBar.Panels[sbpPosition].Text := Format ('%d/%d',
  243.     [RichEdit.CaretPos.Y + 1, RichEdit.CaretPos.X + 1]);
  244. end;
  245. // events/methods udpating toolbar buttons
  246. procedure TFormRichNote.SetModified(const Value: Boolean);
  247. begin
  248.   FModified := Value;
  249.   tbtnSave.Enabled := Modified;
  250. end;
  251. procedure TFormRichNote.ApplicationEvents1Idle(Sender: TObject;
  252.   var Done: Boolean);
  253. begin
  254.   // update toolbar buttons
  255.   tbtnPaste.Enabled := SendMessage (
  256.     RichEdit.Handle, em_CanPaste, 0, 0) <> 0;
  257.   CheckCapslock;
  258. end;
  259. procedure TFormRichNote.CheckCapslock;
  260. begin
  261.   // show status in caps panel
  262.   if Odd (GetKeyState (VK_CAPITAL)) then
  263.     StatusBar.Panels[sbpCaps].Text := 'CAPS'
  264.   else
  265.     StatusBar.Panels[sbpCaps].Text := '';
  266. end;
  267. procedure TFormRichNote.ApplicationEvents1Hint(Sender: TObject);
  268. begin
  269.   // show hint in the status bar message panel
  270.   StatusBar.Panels[sbpMessage].Text := Application.Hint;
  271. end;
  272. end.