Windows 如何在Richedit控件中呈现软返回?

Windows 如何在Richedit控件中呈现软返回?,windows,delphi,richedit,Windows,Delphi,Richedit,在显示richedit控件的应用程序中,我希望能够直观地区分软退货(使用SHIFT-ENTER生成)和硬退货(使用ENTER生成) 我已经在使用JVCL richedit,不想在那个时候切换 你将如何着手做那件事 微软Word可能是一个灵感来源,他们展示了↵ 每行末尾的软回报和硬回报分别签名 我只是在寻找一些提示,好主意,你将如何处理这个项目。当然,我不是要求任何人做我的工作。:-) 我已经在使用JVCL richedit,不想在那个时候切换 JVCL富编辑控件包装Windows富编辑控件。Wi

在显示richedit控件的应用程序中,我希望能够直观地区分软退货(使用SHIFT-ENTER生成)和硬退货(使用ENTER生成)

我已经在使用JVCL richedit,不想在那个时候切换

你将如何着手做那件事

微软Word可能是一个灵感来源,他们展示了↵ 每行末尾的软回报和硬回报分别签名

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

我已经在使用JVCL richedit,不想在那个时候切换

JVCL富编辑控件包装Windows富编辑控件。Windows rich edit控件不会按您希望的方式显示空白。它没有这样做的功能。如果你想让控件显示这样的符号,你需要自己绘制它们,我怀疑这是否能以一种非常有效和流畅的方式完成

听起来像是在显示代码,因为您提到了语法突出显示。在这种情况下,丰富的编辑控件是错误的选择。您应该使用设计用于显示和/或编辑代码的控件

我已经在使用JVCL richedit,不想在那个时候切换

JVCL富编辑控件包装Windows富编辑控件。Windows rich edit控件不会按您希望的方式显示空白。它没有这样做的功能。如果你想让控件显示这样的符号,你需要自己绘制它们,我怀疑这是否能以一种非常有效和流畅的方式完成


听起来像是在显示代码,因为您提到了语法突出显示。在这种情况下,丰富的编辑控件是错误的选择。您应该使用设计用于显示和/或编辑代码的控件

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

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

假设您的richedit中有一段纯文本代码,并且您希望语法突出显示该部分,您可以选择该文本并将其复制到
TSynEdit
,然后将其导出到
TSynExporterRTF
,该文本现在将包含语法格式的文本(假设已正确定义高亮显示)。然后,您只需将数据写入
TMemoryStream
,并用现在语法格式的代码替换选定的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控件所能提供的范围。

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

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

假设您的richedit中有一段纯文本代码,并且您希望语法突出显示该部分,您可以选择该文本并将其复制到
TSynEdit
,然后将其导出到
TSynExporterRTF
,该文本现在将包含语法格式的文本(假设已正确定义高亮显示)。然后,您只需将数据写入
TMemoryStream
,并用现在语法格式的代码替换选定的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控件所能提供的功能,您所需的要求可能超出了范围。

我会使用一个像synedit或闪烁那样已经具有此类功能的控件。我会使用一个像synedit或闪烁那样已经具有此类功能的控件。@EmmanuelIchbiah:您可以随时从划痕如果做得好,这永远是一种能给你想要的东西的方法。像大卫一样,我怀疑RichEdit是否适合你。@EmmanuelIchbiah:你总是可以从头开始编写自己的控件!如果做得好,这永远是一种能给你想要的东西的方法。和David一样,我怀疑RichEdit是否适合您。如果程序可以从剪贴板导入或导出到剪贴板,那么它也可以从/导出到剪贴板memory@DavidHeffernan我已经用代码编辑了我的答案,现在在内存中工作,而不是在剪贴板上,尽管我不确定这与原始海报的需求有多离题/相关?我没有足够的分数来写一个简单的评论,我想你的回答是非常相关的。“我投了更高的票。”大卫·费弗南非常感谢你,和+1表示您对不使用剪贴板而使用内存的评论,这显然是更自然的方法。如果程序可以从剪贴板导入或导出到剪贴板,那么它可以从/到执行相同的操作memory@DavidHeffernan我已经用代码编辑了我的答案,现在可以在内存中工作,而不是在剪贴板中工作,尽管我不确定这与原始海报需求有多脱离主题/相关?我没有足够的分数来写一个简单的评论,我想你的回答是非常相关的。我投了更高的票。@DavidHeffernan非常感谢你,并且+1感谢你关于不使用剪贴板而使用内存的评论,这显然是更自然的方式。