TMemo无法正确处理Unix输入(LF)。显示用LF分开的两条线并将其视为一条线。我想处理所有可能的文本格式化(Mac,Win,Unix)。
显然我每次都可以检查文本并用CRLF替换LF:
但这不是一个优雅的解决方案。
Lazarus使用Lines.TextLineBreakStyle属性解决了这个问题。 Delphi XE中有类似的东西吗?
答案 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
消息,以便以大多数其他传统方式设置文本。 (这会照顾您的大部分内容:LoadFromFile
,Add
,Append
,Insert
,Text := ...
。)em_ReplaceSel
消息,以便覆盖所选文本被覆盖。在下面的文章中,他只是拒绝任何不符合要求的输入。但这可能不是你想要的。相反,您需要规范化输入,以便它使用统一的行结束序列。您只需按下输入,然后将其转发给普通处理程序,而不是仅仅吞下上面列出的文本更改消息。
为了控制行结尾,Delphi已经提供了一种能够进行所需按摩的功能:AdjustLineBreaks
。您可以选择是否需要Unix或Windows样式的行结尾。 (请注意,即使Macintosh也不再使用Mac风格的行结尾。)您可能需要tlbsCRLF
,因为这是Windows编辑控件知道如何显示的样式;正如您所指出的,如果没有任何回车,它不会显示换行符。
对于wm_SetText
和em_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
。