【问题标题】:Delphi - How to get WrapText to behave like RichEdit.Lines.Text?Delphi - 如何让 WrapText 表现得像 RichEdit.Lines.Text?
【发布时间】:2012-02-14 17:48:25
【问题描述】:

我使用 TRichEdit 来编辑文本。我打开了 WordWrap,它会在控件边缘自动换行文本,这样就没有滚动条了。 RichEdit 的宽度设置为适合 80 列。

只要单词之间偶尔有空格,WordWrap 就可以很好地模拟这种行为。但是如果你有一个非常冗长的单词 RichEdit wrap 会自动破坏它,而 WordWrap 不会!

如果我现在想访问这些换行符,我可以通过RichEdit.Lines.Text 获取它,它会自动将 CRLF 放在第 80 列。如果我使用 RichEdit.Text,我会得到没有适合 WordWrap 的 CRLF 的原始文本。

正如我已经尝试过的那样,在自定义函数中完成这项任务并非易事,而且它不是一个小函数,但是否有办法使用 TRichEdit 的包装函数?我有一个创建隐藏 RichEdit 的想法,但对于这项任务来说,这似乎很愚蠢,因为我必须计算它的宽度才能进行自动换行 - 我认为这毫无意义。

问题 - 有没有办法强制 WordWrap 剪切无法以其他方式换行的长词?那么如果一个单词有 170 个字符长,它会被包装成 3 行 80 + 80 + 10 并且还要处理之前的单词来填充前后行?

【问题讨论】:

  • 80 个字符是你想要的吗?还是你关心可变宽度字体?
  • 我需要一个固定宽度的列 80(或任何其他)换行。如果超过第 80 列,则剪切并换行到另一行。如果太长,剪掉。

标签: delphi c++builder word-wrap


【解决方案1】:

试穿一下尺寸:

procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
const
   MAX_LENGTH = 80;
var
  nLineCount:   integer;
  sCurrentLine: string;
begin
  for nLineCount := 0 to RichEdit1.Lines.Count - 1 do
  begin
    // no space in this line
    if (pos(' ',RichEdit1.Lines.Strings[nLineCount]) = 0) then
    begin
      if (length(RichEdit1.Lines.Strings[nLineCount]) > MAX_LENGTH) then
      begin
        // hold the whole line
        sCurrentLine := RichEdit1.Lines.Strings[nLineCount];
        // the current line, make the max value
        RichEdit1.Lines.Strings[nLineCount] := copy(sCurrentLine,1,MAX_LENGTH);
        // build the next line
        RichEdit1.Lines.Add(
        copy(sCurrentLine,MAX_LENGTH + 1,1));
      end;
    end;
  end;
end;

【讨论】:

  • 我不能使用它,因为我需要在输入后重新格式化文本,而不是在输入过程中。 RichEdit.Lines.Text 在没有任何代码的情况下打开 WordWrap 时已经这样做了。感谢您的回答,但如果有人提出不同的解决方案,我需要等待。
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2017-10-19
  • 2018-02-10
相关资源
最近更新 更多