如何在 Richedit 控件中渲染 soft returns?

How would you render soft returns in a Richedit control?

在显示 richedit 控件的应用程序中,我希望能够从视觉上区分软 returns(使用 SHIFT ENTER 生成)和硬 returns(使用 ENTER 生成)。

我已经在使用 JVCL richedit,现在不想切换。

您将如何继续这样做?

Microsoft Word 可能是一个灵感来源,它们在每行末尾显示软 returns ↵ 符号和硬 returns ¶ 符号。

我只是在寻找您将如何处理这个项目的提示和好主意。当然,我不是要任何人做我的工作。 :-)

I already use the JVCL richedit and don't want to switch at that point.

JVCL rich edit 控件包装了 Windows rich edit 控件。 Windows rich edit 控件不会按照您希望的方式显示空格。它没有这样做的功能。如果您希望控件显示此类符号,您需要自己绘制它们,我怀疑这能否以一种非常有效和巧妙的方式完成。

听起来你在显示代码,因为你提到了语法高亮。在这种情况下,丰富的编辑控件是错误的选择。您应该使用专为显示 and/or 编辑代码而设计的控件。

虽然不能直接回答您的问题,但对于您提到的需要在一个控件中同时使用 Richedit 和语法高亮显示的问题,有一个可能的解决方案,那就是使用 SynEdit。

SynEdit 包括一些非可视组件,允许导出语法格式的文本,其中一个组件是 TSynExporterRTF

假设您的 richedit 中有一段纯文本代码,您想要语法高亮显示该部分,您可以 select 并将该文本复制到 TSynEdit,然后导出它到 TSynExporterRTF 现在将包含语法格式的文本(假设已正确定义荧光笔)。然后你可以简单地将数据写入 TMemoryStream 并用现在语法格式化的代码替换 selected richedit 文本。

要做到这一点,你可以尝试这样的事情:

procedure SyntaxFormatRichEditText(RichEdit: TRichEdit; SynHighlighter: TSynCustomHighlighter);
var
  SynEdit: TSynEdit;
  SynExporterRTF: TSynExporterRTF;
  MS: TMemoryStream;
begin
  SynEdit := TSynEdit.Create(nil);
  try
    SynEdit.Highlighter := SynHighlighter;
    SynEdit.Lines.Text := RichEdit.SelText;

    SynExporterRTF := TSynExporterRTF.Create(nil);
    try
      SynExporterRTF.Highlighter := SynHighlighter;

      MS := TMemoryStream.Create;
      try
        SynExporterRTF.ExportAll(SynEdit.Lines);
        SynExporterRTF.SaveToStream(MS);
        MS.Seek(0, soBeginning);
        RichEdit.SetSelTextBuf(MS.Memory);
        RichEdit.SetFocus;
      finally
        MS.Free;
      end;
    finally
      SynExporterRTF.Free;
    end;
  finally
    SynEdit.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SyntaxFormatRichEditText(RichEdit1, SynPasSyn1);
end;

如果有的话,正如其他人所建议的那样,您需要的要求可能超出了 Richedit 控件可以提供的范围。