0

组件中有大量属性TRichViewEdit可以找到给定段落的大多数属性。例如,您可以轻松判断段落是否使用编号、使用的编号类型、是否从特定编号开始编号或者是前一段的延续等。

但是,我找不到确定正在使用的段落编号的属性或方法。例如:

A. some text
B. more text
C. etc

我不知道那some text是段落编号A,那more text是编号B,而“等”是“C”。如果我也可以访问数值,比如“1”、“2”或“3”,那就没问题了。

有没有人有经验TRichViewEdit并知道如何获得段落编号值?

4

1 回答 1

3

回答

有一种未记录的方法可以做到这一点。ifrveTRichViewEdit组件并且ItemNo是带有编号的段落的项目编号的id:

use
  RVMarker;

TRVMarkerItemInfo(rve.RVData.GetItem(ItemNo)).Counter; // paragraph number as int
TRVMarkerItemInfo(rve.RVData.GetItem(ItemNo)).DisplayString; // displayed paragraph number

例子

use
  RVMarker, TypInfo;
---
var
  i, lno, ll, sf: Integer;
  usf: Boolean;
  rvmii: TRVMarkerItemInfo;
  pi: TParaInfo;
  s: string;
begin
  for i := 0 to rve.ItemCount - 1 do
  begin
    if rve.RVData.GetItemStyle(i) = rvsListMarker then
    begin
      pi := rve.Style.ParaStyles.Items[rve.GetItemPara(i)];
      rve.GetListMarkerInfo(i, lno, ll, sf, usf);
      s := GetEnumName(TypeInfo(TRVListType), Ord(rve.Style.ListStyles.Items[lno].Levels[ll].ListType));
      rvmii := TRVMarkerItemInfo(rve.RVData.GetItem(i));

      ShowMessage(
        Concat(
          'Paragraph Info',                                      #13#10,
          '---------------------------------',                   #13#10,
          #09'OutlineLevel:',    #09, IntToStr(pi.OutlineLevel), #13#10,
          #09'ID:',           #09#09, IntToStr(pi.ID),           #13#10,
          #09'Index:',        #09#09, IntToStr(pi.Index),        #13#10,
                                                                 #13#10,
          'Marker Info',                                         #13#10,
          '---------------------------------',                   #13#10,
          #09'ListNo:',       #09#09, IntToStr(lno),             #13#10, // can also use 'rvmii.ListNo'
          #09'ListLevel:',       #09, IntToStr(ll),              #13#10, // can also use 'rvmii.Level'
          #09'StartFrom:',       #09, IntToStr(sf),              #13#10, // can also use 'rvmii.StartFrom'
          #09'UseStartFrom:',    #09, BoolToStr(usf),            #13#10, // can also use 'rvmii.Reset'
          #09'Counter:',         #09, IntToStr(rvmii.Counter),   #13#10,
          #09'DisplayType:',     #09, s,                         #13#10,
          #09'DisplayString:',   #09, rvmii.DisplayString,       #13#10,
                                                                 #13#10,
          'ItemText',                                            #13#10,
          '---------------------------------',                   #13#10,
          rve.GetItemText(i+1),                                  #13#10  // next item is text for para #
        )
      );
    end;
  end;
end;
于 2012-07-26T14:34:54.857 回答