如何让 TMemo 以 Linux 风格处理新行?

问题描述 投票:0回答:3

我有一个包含 Linux 风格换行符的字符串。 Linux 风格是

#13
,而 Windows 风格是
#13#10

我想在

TMemo
中显示这个字符串。看起来
TMemo
仅接受 Windows 样式,并且不将
#13
视为换行。

TMemo
格式化新行的唯一方法是插入
#10
,或者我可以以某种方式要求
TMemo
以Linux风格行事吗?

delphi vcl tmemo
3个回答
2
投票

我想在备忘录中显示这个字符串。看起来 Memo 只接受 Windows 风格,并且不将 #$13 视为换行。

这取决于您如何在备忘录中添加

string

EDIT
换行的底层Win32
TMemo
控件仅在内部支持
#13#10
样式换行符。

如果将

string
分配给
TMemo.Text
属性,它只会按原样将
string
传递给底层 Win32 控件。因此,
string
只需要使用 Windows 风格的换行符。

但是,如果您将

string
分配给
TMemo.Lines.Text
属性,它将在内部将所有换行符样式调整为 Windows 样式,然后将调整后的
string
交给 Win32 控件。因此,在这方面,您可以同等地处理 Linux 风格和 Windows 风格的换行符。

或者,

TStringList
类支持解析所有样式的换行符(当其
LineBreak
属性与
sLineBreak
常量匹配时,默认情况下)。因此,另一种选择是首先将
string
分配给
TStringList.Text
属性,然后您可以将结果列表分配给
TMemo.Lines
属性。


0
投票

实际上 Linux 风格是#10,而不是#13(#13 是 MacOS 风格,AFAIK)。另外,请注意它是#10,而不是#$10(这是#16)。

最简单的方法是在加载/保存时替换行尾,即。而不是

Memo.Lines.LoadFromFile(FileName)
or
Memo.Lines.Text := STR;

uses System.IOUtils;

Memo.Lines.Text := TFile.ReadAllText(FileName,TEncoding.UTF8).Replace(#13#10,#13).Replace(#10,#13).Replace(#13,#13#10)
or
Memo.Lines.Text := STR.Replace(#13#10,#13).Replace(#10,#13).Replace(#13,#13#10)

而不是

Memo.Lines.SaveToFile(FileName)
or
STR := Memo.Lines.Text

uses System.IOUtils;

TFile.WriteAllText(Memo.Lines.Text.Replace(#13#10,#13),TEncoding.UTF8)
or
STR := Memo.Lines.Text.Replace(#13#10,#13)

当然,您应该将 TEncoding.UTF8 替换为您想要使用的适当编码。


0
投票

试试这个

var ls  : string; // Linux Style String
    lfs : string; // Windows Style String

begin
  lfs := stringreplace(ls,#13,#13+#10,[rfReplaceAll, rfIgnoreCase]);     
end;
© www.soinside.com 2019 - 2024. All rights reserved.