【问题标题】:Delphi Copy Memo to Richedit problemDelphi Copy Memo to Richedit问题
【发布时间】:2010-11-24 23:05:59
【问题描述】:

我在将备忘录的内容复制到 Richedit 组件时遇到问题。

我以为是

Richedit.text := memo.text;

但是,如果我使用它,当备忘录文本换行到新的新行(不是 CR/LF)但只是换行时,Richedit 会开始一个新行。当备忘录开始一个新行时,richedit 也会开始一个新行。

任何人都知道如何在备忘录文本换行时将文本从备忘录复制到richeditbox,而不会在 Richedit 中中断行

谢谢

科林

【问题讨论】:

  • 请指定Delphi版本和操作系统版本好吗?
  • 它在 windows vista 上的 Delphi 7

标签: delphi word-wrap line-breaks tmemo trichedit


【解决方案1】:

当我这样做时

RichEdit1.Text := Memo1.Text

Memo1 的虚拟“换行符”不会神奇地转换为RichEdit 中的换行符 (CRLF),也不应该如此。这些“换行符”不存储在备忘录文本缓冲区中。事实上,Embarcadero 官方文档指出

将 WordWrap 设置为 true 以使编辑控件在右边距处换行文本,使其适合客户区。包装只是化妆品。该文本不包含任何未明确输入的返回字符。

无论如何,另一种方法是这样做

RichEdit1.Lines.Assign(Memo1.Lines);

虽然这将保留虚拟换行符,如下所述。

更新

您的代码中很可能还有其他一些奇怪之处(错误),或者您的问题措辞过于含糊。但是,要消除 VCL 包装器出现任何问题的风险,请尝试以下操作:

procedure TForm4.FormClick(Sender: TObject);
var
  buf: PChar;
const
  MAX_BUF_SIZE = 65536;
begin
  GetMem(buf, MAX_BUF_SIZE * sizeof(char));
  Memo1.Perform(WM_GETTEXT, MAX_BUF_SIZE, buf);
  RichEdit1.Perform(WM_SETTEXT, 0, buf);
  FreeMem(buf);
end;

【讨论】:

  • 事实上,这些根本不是换行符
  • 不,正如我所写,它们有时被称为“虚拟换行符”。
  • 实际上,当我尝试 RichEdit1.Lines.Assign(Memo1.Lines) 时,虚拟换行符确实会转移到 RichEdit。这实际上是有道理的。底层 TStringList 对每条绘制的线都有一个项目,而不仅仅是硬中断。我对 Text 属性的分配似乎如何使中断正确更感到困惑。
  • @Mark,当您读取Text 属性时,备忘录会向自身发送wm_GetText 消息以读取整个字符串,因为底层编辑控件具有它。它不使用基类 TStrings 连接每个项目的方法,用换行符分隔。
  • 2Andreas Rejbrand:是否愿意在那些“虚拟换行符”中包含证明链接?目前,我确信绘制的文本完全没有改变。 TMemo 和类似的控件现在没有 64k 限制,顺便说一句
【解决方案2】:

作为一个肮脏的黑客,你能不能在你的备忘录上关闭自动换行,然后做作业,然后再打开自动换行?这是一个令人讨厌的 hack,但如果有一些奇怪的行为,它可能会为你解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多