如何在 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 控件可以提供的范围。
在显示 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 控件可以提供的范围。