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

jchrr9hc  于 2023-02-12  发布在  Linux
关注(0)|答案(2)|浏览(162)

我有一个包含Linux风格换行符的字符串。Linux风格是#13,而Windows风格是#13#10
我想在TMemo中显示此字符串。看起来TMemo只接受Windows样式,并且不将#13视为新行。
TMemo化新行的唯一方法是插入#10吗?或者我可以以某种方式要求TMemo按照Linux风格操作吗?

gfttwv5a

gfttwv5a1#

我想在备忘录中显示此字符串。看起来备忘录只接受Windows样式,并且不将#$13视为新行。
这取决于您如何将string赋给Memo。
TMemo Package 的基础Win32 EDIT控件仅在内部支持#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属性。

niknxzdl

niknxzdl2#

实际上,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。

相关问题