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

RichEdit

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. {$I RV_Defs.inc}
  4. uses
  5.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  6.   Dialogs, RVStyle, RVScroll, RichView, RVEdit, Buttons, ExtCtrls, StdCtrls;
  7. type
  8.   TForm1 = class(TForm)
  9.     RichViewEdit1: TRichViewEdit;
  10.     RVStyle1: TRVStyle;
  11.     Panel1: TPanel;
  12.     btnBullets: TSpeedButton;
  13.     btnNumbering: TSpeedButton;
  14.     procedure btnBulletsClick(Sender: TObject);
  15.     procedure RichViewEdit1CaretMove(Sender: TObject);
  16.     procedure btnNumberingClick(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.     function CreateBullets: Integer;
  20.     function CreateNumbering: Integer;
  21.     function GetListNo(rve: TCustomRichViewEdit; ItemNo: Integer): Integer;
  22.   public
  23.     { Public declarations }
  24.   end;
  25. var
  26.   Form1: TForm1;
  27. implementation
  28. {$R *.dfm}
  29. {------------------------------------------------------------------------------}
  30. function TForm1.GetListNo(rve: TCustomRichViewEdit;
  31.   ItemNo: Integer): Integer;
  32. var Level, StartFrom: Integer;
  33.     Reset: Boolean;
  34. begin
  35.   rve.GetListMarkerInfo(ItemNo, Result, Level, StartFrom, Reset);
  36. end;
  37. {------------------------------------------------------------------------------}
  38. // Returns index of bulleted list style. Creates it, if necessary.
  39. function TForm1.CreateBullets: Integer;
  40. var ListStyle: TRVListInfo;
  41. begin
  42.   // 1. Creating desired list style
  43.   ListStyle := TRVListInfo.Create(nil);
  44.   with ListStyle.Levels.Add do begin
  45.     ListType  := rvlstBullet;
  46.     Font.Name := 'Symbol';
  47.     {$IFDEF RICHVIEWCBDEF3}
  48.     Font.Charset := SYMBOL_CHARSET;
  49.     {$ENDIF}
  50.     Font.Size := 12;
  51.     FirstIndent := 0;
  52.     LeftIndent  := 24;
  53.   end;
  54.   // 2. Searching for existing style with these properties. Creating it, if not found
  55.   Result := RVStyle1.ListStyles.FindSuchStyle(ListStyle, True);
  56.   ListStyle.Free;
  57. end;
  58. {------------------------------------------------------------------------------}
  59. function TForm1.CreateNumbering: Integer;
  60. var ListStyle: TRVListInfo;
  61.     rve: TCustomRichViewEdit;
  62.     i, StartNo, EndNo, a, b, ListNo: Integer;
  63. begin
  64.   Result := -1;
  65.   // 1. Creating desired list style
  66.   ListStyle := TRVListInfo.Create(nil);
  67.   with ListStyle.Levels.Add do begin
  68.     ListType  := rvlstDecimal;
  69.     Font.Name := 'Arial';
  70.     Font.Size := 12;
  71.     FirstIndent := 0;
  72.     LeftIndent  := 24;
  73.     FormatString := '%0:s.';
  74.   end;
  75.   // 2. Searching for such style in the selected paragraphs, the paragraph before,
  76.   // and the paragraph after. If found, using it.
  77.   rve := RichViewEdit1.TopLevelEditor;
  78.   rve.GetSelectionBounds(StartNo, a, EndNo, b, True);
  79.   if StartNo<0 then begin
  80.     StartNo := rve.CurItemNo;
  81.     EndNo   := StartNo;
  82.   end;
  83.   // ExpandToPara is an undocumented method that changes item range StartNo..EndNo
  84.   // so that it completely includes paragraphs containing StartNo..EndNo
  85.   rve.RVData.ExpandToPara(StartNo, EndNo, StartNo, EndNo);
  86.   if StartNo>0 then
  87.     dec(StartNo);
  88.   if EndNo<rve.ItemCount-1 then
  89.     inc(EndNo);
  90.   rve.RVData.ExpandToPara(StartNo, EndNo, StartNo, EndNo);
  91.   for i := StartNo to EndNo do
  92.     if rve.IsParaStart(i) and (rve.GetItemStyle(i)=rvsListMarker) then begin
  93.       ListNo := GetListNo(rve, i);
  94.       if RVStyle1.ListStyles[ListNo].IsSimpleEqual(ListStyle, True, True) then begin
  95.         Result := ListNo;
  96.         break;
  97.       end;
  98.   end;
  99.   // 3. Idea for improving. You can try to reuse existing list style with the
  100.   // given properties, which is not used in the document. If you want to do it,
  101.   // you need to iterate through all items in the document, and check all markers.
  102.   // 4. If not found, creating it
  103.   if Result<0 then begin
  104.     RVStyle1.ListStyles.Add.Assign(ListStyle);
  105.     Result := RVStyle1.ListStyles.Count-1;
  106.     RVStyle1.ListStyles[Result].Standard := False;
  107.   end;
  108.   ListStyle.Free;
  109. end;
  110. {------------------------------------------------------------------------------}
  111. // CARET WAS MOVED: updating buttons
  112. procedure TForm1.RichViewEdit1CaretMove(Sender: TObject);
  113. var FirstParaItemNo: Integer;
  114.     rve: TCustomRichViewEdit;
  115.     ListNo: Integer;
  116. begin
  117.   rve := RichViewEdit1.TopLevelEditor;
  118.   FirstParaItemNo := rve.CurItemNo;
  119.   if FirstParaItemNo<0 then // document is cleared
  120.     exit;
  121.   while not rve.IsParaStart(FirstParaItemNo) do
  122.     dec(FirstParaItemNo);
  123.   if rve.GetItemStyle(FirstParaItemNo)=rvsListMarker then begin
  124.     ListNo := GetListNo(rve, FirstParaItemNo);
  125.     btnBullets.Down := not RVStyle1.ListStyles[ListNo].HasNumbering;
  126.     btnNumbering.Down := RVStyle1.ListStyles[ListNo].AllNumbered;
  127.     end
  128.   else begin
  129.     btnBullets.Down := False;
  130.     btnNumbering.Down := False;
  131.   end;
  132. end;
  133. {------------------------------------------------------------------------------}
  134. // TOGGLING BULLETS
  135. procedure TForm1.btnBulletsClick(Sender: TObject);
  136. begin
  137.   if not btnBullets.Down then
  138.     RichViewEdit1.RemoveLists(False)
  139.   else
  140.     RichViewEdit1.ApplyListStyle(CreateBullets,0,0,False,False);
  141. end;
  142. {------------------------------------------------------------------------------}
  143. // TOGGLING NUMBERING
  144. procedure TForm1.btnNumberingClick(Sender: TObject);
  145. begin
  146.   if not btnNumbering.Down then
  147.     RichViewEdit1.RemoveLists(False)
  148.   else
  149.     RichViewEdit1.ApplyListStyle(CreateNumbering,0,0,False,False);
  150. end;
  151. end.