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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ImgList, RVStyle, RVScroll, RichView, RVEdit, ComCtrls, StdCtrls;
  6. type
  7.   TForm1 = class(TForm)
  8.     PageControl1: TPageControl;
  9.     TabSheet1: TTabSheet;
  10.     TabSheet2: TTabSheet;
  11.     TabSheet3: TTabSheet;
  12.     rve1: TRichViewEdit;
  13.     RVStyle1: TRVStyle;
  14.     Button1: TButton;
  15.     Edit1: TEdit;
  16.     Button2: TButton;
  17.     rv2: TRichView;
  18.     rv3: TRichView;
  19.     rve4: TRichViewEdit;
  20.     Button3: TButton;
  21.     Label1: TLabel;
  22.     TabSheet4: TTabSheet;
  23.     rv5: TRichView;
  24.     rve6: TRichViewEdit;
  25.     Label2: TLabel;
  26.     Button4: TButton;
  27.     ImageList1: TImageList;
  28.     procedure FormCreate(Sender: TObject);
  29.     procedure Button1Click(Sender: TObject);
  30.     procedure Button2Click(Sender: TObject);
  31.     procedure Button3Click(Sender: TObject);
  32.     procedure Button4Click(Sender: TObject);
  33.     procedure rve6KeyPress(Sender: TObject; var Key: Char);
  34.     procedure rve6KeyDown(Sender: TObject; var Key: Word;
  35.       Shift: TShiftState);
  36.     procedure rv5RVFImageListNeeded(Sender: TCustomRichView;
  37.       ImageListTag: Integer; var il: TCustomImageList);
  38.   private
  39.     { Private declarations }
  40.     procedure AddWithIcons(rv: TCustomRichView; s: String; StyleNo: Integer; var ParaNo: Integer);
  41.   public
  42.     { Public declarations }
  43.   end;
  44. var
  45.   Form1: TForm1;
  46. implementation
  47. {$R *.dfm}
  48. procedure TForm1.FormCreate(Sender: TObject);
  49. begin
  50.   rve1.Clear;
  51.   rve1.AddNL('John: ', 3, 0);
  52.   rve1.AddNL('Funny, very funny :)', 0, -1);
  53.   rve1.AddNL('Rob: ', 3, 0);
  54.   rve1.AddNL('I do not think so :(...', 0, -1);
  55.   rve1.Format;
  56.   rve4.Clear;
  57.   rve4.AddNL('La la la:):):):)', 1, 0);
  58.   rve4.AddNL('La la la:):):):)', 2, -1);
  59.   rve4.AddNL('La la la:):):):)', 0, -1);
  60.   rve4.Format;
  61. end;
  62. {------------------------------------------------------------------------------}
  63. // Using Search feature of RichViewEdit to insert emotion icons
  64. procedure TForm1.Button1Click(Sender: TObject);
  65.   procedure SearchAndInsertIcon(const Code: String; ImageIndex: Integer);
  66.   begin
  67.     rve1.SetSelectionBounds(0, rve1.GetOffsBeforeItem(0), 0, rve1.GetOffsBeforeItem(0));
  68.     while rve1.SearchText(Code, [rvseoDown]) do
  69.       rve1.InsertBullet(ImageIndex, ImageList1);
  70.   end;
  71. begin
  72.   LockWindowUpdate(rve1.Handle);
  73.   try
  74.     SearchAndInsertIcon(':)', 0);
  75.     SearchAndInsertIcon(':|', 1);
  76.     SearchAndInsertIcon(':(', 2);
  77.   finally
  78.     LockWindowUpdate(0);
  79.   end;
  80. end;
  81. {------------------------------------------------------------------------------}
  82. function GetImageIndex(mouth: Char): Integer;
  83. begin
  84.   case mouth of
  85.     ')': Result := 0;
  86.     '|': Result := 1;
  87.     else Result := 2;
  88.   end;
  89. end;
  90. {------------------------------------------------------------------------------}
  91. procedure TForm1.AddWithIcons(rv: TCustomRichView; s: String; StyleNo: Integer; var ParaNo: Integer);
  92. var s2: String;
  93.     p: Integer;
  94. begin
  95.   s2 := '';
  96.   while s<>'' do
  97.   begin
  98.     p := Pos(':', s); // searching for "eyes"
  99.     if p=0 then
  100.     begin
  101.       // not found
  102.       rv.AddNL(s2+s, StyleNo, ParaNo);
  103.       ParaNo := -1;
  104.       exit;
  105.     end;
  106.     // is it really "eyes"?
  107.     if (Length(s)>p) and (s[p+1] in [')','|','(']) then
  108.     begin
  109.       // a smile is found
  110.       s2 := s2+Copy(s, 1, p-1);
  111.       if s2<>'' then
  112.       begin
  113.         rv.AddNL(s2, StyleNo, ParaNo);
  114.         s2 := '';
  115.         ParaNo := -1;
  116.       end;
  117.       rv.AddBulletEx( '', GetImageIndex(s[p+1]), ImageList1, ParaNo);
  118.       ParaNo := -1;
  119.       s := Copy(s, p+2, Length(s));
  120.     end
  121.     else
  122.     begin
  123.       // this is not a smile
  124.       s2 := Copy(s, 1, p);
  125.       s := Copy(s, p+1, Length(s));
  126.     end;
  127.   end;
  128.   
  129.   if s2<>'' then
  130.     begin
  131.       rv.AddNL(s2, StyleNo, ParaNo);
  132.       s2 := '';
  133.       ParaNo := -1;
  134.     end;
  135. end;
  136. {------------------------------------------------------------------------------}
  137. // From TEdit
  138. procedure TForm1.Button2Click(Sender: TObject);
  139. var ParaNo: Integer;
  140. begin
  141.   if Edit1.Text<>'' then
  142.   begin
  143.     rv2.AddNL('Me: ',3,0);
  144.     ParaNo := -1; // adding to the same line
  145.     AddWithIcons(rv2, Edit1.Text, 0, ParaNo);
  146.     rv2.FormatTail;
  147.     Edit1.Text := '';
  148.   end
  149.   else
  150.     Beep;
  151. end;
  152. {------------------------------------------------------------------------------}
  153. // From TRichViewEdit with emoticons detection
  154. procedure TForm1.Button3Click(Sender: TObject);
  155. var i: Integer;
  156.     ParaNo: Integer;
  157. begin
  158.   // this example has the following limitations:
  159.   // - non-text will be ignored
  160.   // - assumes that styles of rv3 and rve4 are the same
  161.   ParaNo := 0;
  162.   for i := 0 to rve4.ItemCount-1 do
  163.   begin
  164.     if rve4.IsFromNewLine(i) then
  165.       ParaNo := rve4.GetItemPara(i);
  166.     if rve4.GetItemStyle(i)>=0 then
  167.       AddWithIcons(rv3, rve4.GetItemText(i), rve4.GetItemStyle(i), ParaNo);
  168.   end;
  169.   rv3.FormatTail;
  170.   rve4.SetFocus;
  171. end;
  172. {------------------------------------------------------------------------------}
  173. // From TRichViewEdit as is
  174. procedure TForm1.Button4Click(Sender: TObject);
  175. var Stream: TMemoryStream;
  176. begin
  177.   Stream := TMemoryStream.Create;
  178.   rve6.SaveRVFToStream(Stream, False);
  179.   Stream.Position := 0;
  180.   rv5.InsertRVFFromStream(Stream, rv5.ItemCount);
  181.   Stream.Free;
  182.   rv5.FormatTail;
  183.   rve6.SetFocus;  
  184. end;
  185. {------------------------------------------------------------------------------}
  186. // Emoticons autodetection on typing
  187. procedure TForm1.rve6KeyPress(Sender: TObject; var Key: Char);
  188. var
  189.   rve: TCustomRichViewEdit;
  190.   ItemNo, Offs: Integer;
  191.   s: String;
  192.   function GetImageIndex(mouth: Char): Integer;
  193.   begin
  194.     case mouth of
  195.       ')': Result := 0;
  196.       '|': Result := 1;
  197.       else Result := 2;
  198.     end;
  199.   end;
  200. begin
  201.   if not (Key in [')', '(', '|']) then
  202.     exit;
  203.   rve := (Sender as TCustomRichViewEdit).TopLevelEditor;
  204.   ItemNo := rve.CurItemNo;
  205.   if rve.GetItemStyle(ItemNo)<0 then
  206.     exit;
  207.   Offs := rve.OffsetInCurItem;
  208.   s := rve.GetItemTextA(ItemNo);
  209.   if (s='') or (Offs=1) then
  210.     exit;
  211.   if s[Offs-1]=':' then begin
  212.     rve.SetSelectionBounds(ItemNo, Offs-1, ItemNo, Offs);
  213.     rve.InsertBullet(GetImageIndex(Key), ImageList1);
  214.     Key := #0;
  215.   end;
  216. end;
  217. {------------------------------------------------------------------------------}
  218. // BACKSPACE disassembles emoticon
  219. procedure TForm1.rve6KeyDown(Sender: TObject; var Key: Word;
  220.   Shift: TShiftState);
  221. var
  222.   rve: TCustomRichViewEdit;
  223.   ItemNo, Offs: Integer;
  224.   function GetBulletImageIndex: Integer;
  225.   var s: String;
  226.       tag: Integer;
  227.       il: TCustomImageList;
  228.   begin
  229.     rve.GetBulletInfo(ItemNo, s, Result, il, tag);
  230.   end;
  231.   function GetSmile(ImageIndex: Integer): String;
  232.   begin
  233.     case ImageIndex of
  234.       0: Result := ':)';
  235.       1: Result := ':|';
  236.       else Result := ':(';
  237.     end;
  238.   end;
  239. begin
  240.   if Key<>VK_BACK then
  241.     exit;
  242.   rve := (Sender as TCustomRichViewEdit).TopLevelEditor;
  243.   if rve.SelectionExists then
  244.     exit;
  245.   ItemNo := rve.CurItemNo;
  246.   Offs := rve.OffsetInCurItem;
  247.   if (rve.GetItemStyle(ItemNo)=rvsBullet) and (Offs=1) then begin
  248.     Key := 0;
  249.     rve.SetSelectionBounds(ItemNo, 0, ItemNo, 1);
  250.     rve.InsertText(GetSmile(GetBulletImageIndex), False);
  251.   end;
  252. end;
  253. {------------------------------------------------------------------------------}
  254. procedure TForm1.rv5RVFImageListNeeded(Sender: TCustomRichView;
  255.   ImageListTag: Integer; var il: TCustomImageList);
  256. begin
  257.   il := ImageList1;
  258. end;
  259. end.