Delphi - 如何让WrapText像RichEdit.Lines.Text一样运行?

时间:2012-01-20 04:25:41

标签: delphi c++builder word-wrap

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

只要您在单词之间偶尔有空格,WordWrap就可以很好地模拟这种行为。但是,如果你有一个非常loooooooooooooooooong字RichEdit包装将自动打破它,WordWrap将不会!

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

在我已经尝试过的自定义函数中执行任务并不简单,这不是一个小函数,但可能有办法使用TRichEdit的包装函数吗?我有一个创建隐藏的RichEdit的想法,但这种任务似乎很愚蠢,因为我必须计算它的宽度只是为了做文字包装 - 我认为这是毫无意义的。

问题 - 是否有一种方法可以强制WordWrap删除无法包装的长词?因此,如果一个单词长度为170个字符,那么它将被包装成3行80 + 80 + 10,但在填充上一行和后续行之前还会处理单词?

1 个答案:

答案 0 :(得分:0)

尝试使用此尺寸:

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;