【问题标题】:How to select certain table rows in TRichedit with Delphi (Xe10)如何使用 Delphi (Xe10) 在 TRichedit 中选择某些表行
【发布时间】:2016-11-27 18:25:31
【问题描述】:

我有一个 TjvRichedit 控件,其中包含一个表格,其中一些行/单元格填充了文本。 我想选择一些整行(例如行 firstLine 和 firstLine+1)并将它们复制到剪贴板(或流)。我使用下面的代码:

SelStart := Perform(EM_LINEINDEX, firstLine, 0);
SelLength:= length(lines[firstLine]) + length(lines[firstLine+1]);
CopyToClipboard;

但它从 firstLine 到 firstLine+3 进行选择(甚至从下一个表中选择行!)。 如果我减少长度(例如 SelLength:= 2),它会选择两行! 请问我该怎么做我想要的?

【问题讨论】:

  • firstLine 和 firstLine+1) 是什么意思?你的意思是第一行+第二行的第一个字符?
  • 我在 Delphi 7 和 Delphi 10 西雅图试了试,效果很好。
  • 您可以查看我的更新并尝试一下。
  • 我试过你的代码,但它和我遇到的问题一样。当文档有 tables 时会发生这种情况,它似乎计算了一些不可见的字符(超出每行的 CR+LF)。所以这是我的问题。女巫,他们有多少人?
  • 我看到每个带有一些单元格的表格行的文本都由 RichEdit 行表示。这样一行的文本以字符#$FFF9#$D 开头,以#$FFF9#$D 结尾。单元格之间的文本除以#7 length(richedit.lines[i]) 计算所有这些字符,但 selstart 和 sellength 不计算 (?)。在这种情况下,我该如何解决?

标签: delphi trichedit


【解决方案1】:

要选择第一个Line 并将所选文本复制到剪贴板:

RichEdit1.SelStart:=0;
RichEdit1.SelLength:=length(RichEdit1.Lines.[0]);
RichEdit1.CopyToClipboard;

从第二个Line 中选择第一个Line + 第一个字符并将所选文本复制到剪贴板:

RichEdit1.SelStart:=0;
RichEdit1.SelLength:=length(RichEdit1.Lines[0])+2;
RichEdit1.CopyToClipboard;

要选择第二个Line

RichEdit1.SelStart:=length(RichEdit1.Lines[0])+1;
RichEdit1.SelLength:=length(RichEdit1.Lines[1]);

【讨论】:

    【解决方案2】:

    如果选择在表行的开头,则必须排除前两个字符

    RichEdit1.SelStart := Perform(EM_LINEINDEX, LineNo, 0) + 2; // start two chars beyond the linestart
    RichEdit1.SelLength:= Perform(EM_LINELENGTH, RichEdit1.SelStart,0) - 2; // decrease the whole length by these two chars
    

    多于一行的情况相同(整个长度只减少一次)

    【讨论】:

    • 总是选择第一行的前两个字符。
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多