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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       A set of functions retrieving text from         }
  5. {       document.                                       }
  6. {                                                       }
  7. {       Copyright (c) 2003, Sergey Tkachenko            }
  8. {       svt@trichview.com                               }
  9. {       http://www.trichview.com                        }
  10. {                                                       }
  11. {*******************************************************}
  12. unit RVGetText;
  13. interface
  14. uses RVItem, RichView, RVEdit, CRVData;
  15. // Returns text of line with caret
  16. function GetCurrentLineText(rve: TCustomRichViewEdit): String;
  17. // Returns visible text (may be, with a line before and after)
  18. function GetVisibleText(rv: TCustomRichView): String;
  19. // Returns all text
  20. function GetAllText(rv: TCustomRichView): String;
  21. // Returns all text in RVData
  22. function GetRVDataText(RVData: TCustomRVData): String;
  23. // Returns text of paragraph section with caret
  24. // (paragraph section is a part of document limited either by
  25. // paragraph breaks or by new line breaks (added with Shift+Enter)
  26. function GetCurrentParaSectionText(rve: TCustomRichViewEdit): String;
  27. // Returns text of paragraph with caret
  28. function GetCurrentParaText(rve: TCustomRichViewEdit): String;
  29. // Returns character to the left of caret.
  30. // If caret is at the beginning of line, - to the right.
  31. // If no character, returns empty string
  32. function GetCurrentChar(rve: TCustomRichViewEdit): String;
  33. // Returns the current word
  34. function GetCurrentWord(rve: TCustomRichViewEdit): String;
  35. implementation
  36. function GetItemText(rv: TCustomRichView; ItemNo: Integer): String;
  37. begin
  38.   if rv.GetItemStyle(ItemNo)>=0 then
  39.     Result := rv.GetItemTextA(ItemNo)
  40.   else if rv.GetItem(ItemNo).GetBoolValue(rvbpAlwaysInText) then
  41.     Result := rv.GetItem(ItemNo).AsText(0, rv.RVData, rv.GetItemText(ItemNo), '', True, False)
  42.   else
  43.     Result := '';
  44. end;
  45. function GetItemText2(RVData: TCustomRVData; ItemNo: Integer): String;
  46. begin
  47.   if RVData.GetItemStyle(ItemNo)>=0 then
  48.     Result := RVData.GetItemTextA(ItemNo)
  49.   else if RVData.GetItem(ItemNo).GetBoolValue(rvbpAlwaysInText) then
  50.     Result := RVData.GetItem(ItemNo).AsText(0, RVData, RVData.GetItemText(ItemNo), '', True, False)
  51.   else
  52.     Result := '';
  53. end;
  54. function GetCurrentLineText(rve: TCustomRichViewEdit): String;
  55. var i, DNo1, DNo2, DOffs: Integer;
  56.     No1, No2, Offs1, Offs2: Integer;
  57.     s: String;
  58. begin
  59.   Result := '';
  60.   rve := rve.TopLevelEditor;
  61.   rve.RVData.Item2DrawItem(rve.CurItemNo, rve.OffsetInCurItem, DNo1, DOffs);
  62.   DNo2 := DNo1+1;
  63.   while not rve.RVData.DrawItems[DNo1].FromNewLine do
  64.     dec(DNo1);
  65.   while (DNo2<rve.ItemCount) and not rve.RVData.DrawItems[DNo2].FromNewLine do
  66.     inc(DNo2);
  67.   dec(DNo2);
  68.   rve.RVData.DrawItem2Item(DNo1, rve.RVData.GetOffsBeforeDrawItem(DNo1), No1, Offs1);
  69.   rve.RVData.DrawItem2Item(DNo2, rve.RVData.GetOffsAfterDrawItem(DNo2), No2, Offs2);
  70.   if No1<>No2 then begin
  71.     if rve.GetItemStyle(No1)>=0 then begin
  72.       s := rve.GetItemTextA(No1);
  73.       Result := Copy(s, Offs1, Length(s));
  74.     end;
  75.     for i := No1+1 to No2-1 do
  76.       if rve.GetItemStyle(i)>=0 then
  77.         Result := Result+rve.GetItemTextA(i);
  78.     if rve.GetItemStyle(No2)>=0 then begin
  79.       s := rve.GetItemTextA(No2);
  80.       Result := Result+Copy(s, 1, Offs2-1);
  81.     end;
  82.     end
  83.   else if rve.GetItemStyle(No1)<0 then
  84.     Result := GetItemText(rve, No1)
  85.   else
  86.     Result := Copy(rve.GetItemTextA(No1), Offs1, Offs2-Offs1);
  87. end;
  88. function GetVisibleText(rv: TCustomRichView): String;
  89. var i: Integer;
  90. begin
  91.   i := rv.FirstItemVisible;
  92.   if i<0 then begin
  93.     Result := '';
  94.     exit;
  95.   end;
  96.   Result := GetItemText(rv, i);
  97.   for i := i+1 to rv.LastItemVisible do begin
  98.     if rv.IsFromNewLine(i) then
  99.       Result := Result + #13#10;
  100.     Result := Result+GetItemText(rv, i);
  101.   end;
  102. end;
  103. function GetRVDataText(RVData: TCustomRVData): String;
  104. var i: Integer;
  105. begin
  106.   if RVData.ItemCount=0 then begin
  107.     Result := '';
  108.     exit;
  109.   end;
  110.   i := 0;
  111.   Result := GetItemText2(RVData, i);
  112.   for i := i+1 to RVData.ItemCount-1 do begin
  113.     if RVData.IsFromNewLine(i) then
  114.       Result := Result + #13#10;
  115.     Result := Result+GetItemText2(RVData, i);
  116.   end;
  117. end;
  118. function GetAllText(rv: TCustomRichView): String;
  119. begin
  120.   Result := GetRVDataText(rv.RVData);
  121. end;
  122. function GetCurrentParaSectionText(rve: TCustomRichViewEdit): String;
  123. var i: Integer;
  124.     No1, No2, Offs1, Offs2: Integer;
  125. begin
  126.   Result := '';
  127.   rve := rve.TopLevelEditor;
  128.   rve.RVData.GetSelectionBoundsEx(No1,Offs1,No2,Offs2,True);
  129.   rve.RVData.ExpandToParaSection(No1,No2,No1,No2);
  130.   for i := No1 to No2 do
  131.     if rve.GetItemStyle(i)>=0 then
  132.       Result := Result+GetItemText(rve, i);
  133. end;
  134. function GetCurrentParaText(rve: TCustomRichViewEdit): String;
  135. var i: Integer;
  136.     No1, No2, Offs1, Offs2: Integer;
  137. begin
  138.   Result := '';
  139.   rve := rve.TopLevelEditor;
  140.   rve.RVData.GetSelectionBoundsEx(No1,Offs1,No2,Offs2,True);
  141.   rve.RVData.ExpandToPara(No1,No2,No1,No2);
  142.   Result := GetItemText(rve,No1);
  143.   for i := No1+1 to No2 do begin
  144.     if rve.IsFromNewLine(i) then
  145.       Result := Result + #13#10;
  146.     Result := Result+GetItemText(rve,i);
  147.   end;
  148. end;
  149. function GetCurrentChar(rve: TCustomRichViewEdit): String;
  150. var ItemNo, Offs: Integer;
  151. begin
  152.   Result := '';
  153.   rve := rve.TopLevelEditor;
  154.   ItemNo := rve.CurItemNo;
  155.   Offs := rve.OffsetInCurItem;
  156.   if (Offs<rve.GetOffsBeforeItem(ItemNo)) and
  157.     (ItemNo>0) and not rve.IsFromNewLine(ItemNo) then begin
  158.     dec(ItemNo);
  159.     Offs := rve.GetOffsAfterItem(ItemNo);
  160.   end;
  161.   if rve.GetItemStyle(ItemNo)>=0 then begin
  162.     dec(Offs);
  163.     if Offs=0 then Offs := 1;
  164.     Result := rve.GetItemTextA(ItemNo);
  165.     if Length(Result)>=Offs then
  166.       Result := Result[Offs]
  167.     else
  168.       Result := '';
  169.   end;
  170. end;
  171. function GetCurrentWord(rve: TCustomRichViewEdit): String;
  172. var first, last, ItemNo, Offs, Len: Integer;
  173.     s: String;
  174. begin
  175.   Result := '';
  176.   rve := rve.TopLevelEditor;
  177.   if rve.GetItemStyle(rve.CurItemNo)<0 then
  178.     exit;
  179.   Offs   := rve.OffsetInCurItem;
  180.   ItemNo := rve.CurItemNo;
  181.   Last   := Offs;
  182.   First  := Offs;
  183.   s      := rve.GetItemTextA(ItemNo);
  184.   Len    := Length(s);
  185.   while (Last<=Len) do begin
  186.     if Pos(s[Last], rve.Delimiters)>0 then
  187.       break;
  188.     inc(Last);
  189.   end;
  190.   dec(First);
  191.   while (First>0) do begin
  192.     if Pos(s[First], rve.Delimiters)>0 then begin
  193.       inc(First);
  194.       break;
  195.     end;
  196.     dec(First);
  197.   end;
  198.   if First=0 then
  199.     inc(First);
  200.   Result := Copy(s, First, Last-First);
  201. end;
  202. end.