【问题标题】:How to make TMemo treat new lines in Linux style?如何让 TMemo 以 Linux 风格处理新行?
【发布时间】:2023-02-11 02:11:01
【问题描述】:

我有一个包含 Linux 风格换行符的字符串。 Linux 风格是#13,而 Windows 风格是#13#10

我想在TMemo 中显示这个字符串。看起来 TMemo 只接受 Windows 样式并且不将 #13 视为新行。

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

【问题讨论】:

    标签: delphi vcl tmemo


    【解决方案1】:

    实际上 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 替换为您要使用的适当编码。

    【讨论】:

    • 另一种可能的选择是使用 Memo.Lines.LineBreak 属性。
    • @MarkF:不幸的是,这在 Memo.Lines TStrings 后代中不起作用。当您使用 Memo.Lines.Text 读出文本时,它总是返回带有 #13#10 换行符的文本(我相信这是由于从 Windows 读取整个备忘录而不是逐行读取的优化)。此外,无论您在分配给 Memo.Lines.Text 时是否设置 LineBreak,它都支持 #10 换行符。
    • 当您将字符串分配给 TMemo.Lines.Text 时,它会在内部将所有样式的换行符调整为 #13#10,然后将 WM_SETTEXT 消息发送到底层窗口。
    【解决方案2】:

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

    这取决于您如何将 string 提供给备忘录。

    TMemo包裹的底层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 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 2012-07-19
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多