TMemo无法正确处理Unix文本(LF作为行结尾)

时间:2014-10-16 13:32:12

标签: delphi delphi-xe line-endings tmemo

TMemo无法正确处理Unix输入(LF)。显示用LF分开的两条线并将其视​​为一条线。我想处理所有可能的文本格式化(Mac,Win,Unix)。

显然我每次都可以检查文本并用CRLF替换LF:

  • 加载文字表格文件
  • 粘贴文字
  • 使用Add()函数
  • 使用Insert()函数
  • 使用Appen()函数
  • 通过Text属性
  • 更改内容

但这不是一个优雅的解决方案。

Lazarus使用Lines.TextLineBreakStyle属性解决了这个问题。 Delphi XE中有类似的东西吗?

2 个答案:

答案 0 :(得分:4)

你是专门询问行尾序列,但我们可以很容易地将讨论扩展到控制编辑框的内容。

2001年,Peter Below写了an outline of all the things you need to handle for an edit control that accepts only numerals。这些技术至今仍适用于Windows开发。以下是摘要:

  • 覆盖KeyPress以过滤掉不需要的击键。 (在您的情况下,您不需要这个,因为您没有要排除的任何。)
  • 处理wm_Paste消息,说明从剪贴板粘贴的文字。
  • 处理wm_SetText消息,以便以大多数其他传统方式设置文本。 (这会照顾您的大部分内容:LoadFromFileAddAppendInsertText := ...。)
  • 处理em_ReplaceSel消息,以便覆盖所选文本被覆盖。

在下面的文章中,他只是拒绝任何不符合要求的输入。但这可能不是你想要的。相反,您需要规范化输入,以便它使用统一的行结束序列。您只需按下输入,然后将其转发给普通处理程序,而不是仅仅吞下上面列出的文本更改消息。

为了控制行结尾,Delphi已经提供了一种能够进行所需按摩的功能:AdjustLineBreaks。您可以选择是否需要Unix或Windows样式的行结尾。 (请注意,即使Macintosh也不再使用Mac风格的行结尾。)您可能需要tlbsCRLF,因为这是Windows编辑控件知道如何显示的样式;正如您所指出的,如果没有任何回车,它不会显示换行符。

对于wm_SetTextem_ReplaceSel,更改很容易。这是一个草图:

procedure TLineNormalizingMemo.WMSetText(var Message: TWMSetText);
var
  s: string;
begin
  s := Message.Text;
  s := AdjustLineBreaks(s);
  Message.Text := PChar(s);
  inherited;
end;

对于wm_Paste来说,这并不是那么明显,因为你没有给出新文本,而且你不应该更改当前在剪贴板上的文本。相反,您可以选择不调用inherited,处理粘贴自己的效果。像这样:

procedure TLineNormalizingMemo.WMPaste(var Message: TWMPaste);
var
  s: string;
begin
  if Clipboard.HasFormat(cf_Text) then begin
    s := Clipboard.AsText;
    s := AdjustLineBreaks(s);
    SelText := s;
  end;
end;

由于分配SelText会通过em_ReplaceSel消息,您甚至可能不需要在那里拨打AdjustLineBreaks

答案 1 :(得分:0)

只需将Lines.LineBreak属性设置为LF

即可

memo1.lines.LineBreak := #10;

Windows中的默认值为#13#10