TMemo не может правильно обрабатывать текст Unix (LF как конец строки)
TMemo не может правильно обрабатывать вводы Unix (LF). Две строки, разделенные LF, показаны и рассматриваются как одна строка. Я хочу обрабатывать все возможные форматирования текста (Mac, Win, Unix).
Очевидно, что я мог проверить текст и заменить LF на CRLF каждый раз, когда я:
- загрузить текстовый файл формы
- вставить текст
- используйте функцию Add()
- используйте функцию Insert()
- использовать функцию Appen()
- изменить содержимое через свойство Text
Но это не будет элегантным решением.
Lazarus решил эту проблему с помощью свойства Lines.TextLineBreakStyle. Есть что-нибудь похожее в Delphi XE?
2 ответа
Вы спрашиваете конкретно о последовательностях конца строки, но мы можем легко расширить обсуждение до управления содержимым поля редактирования в целом.
В 2001 году Питер Белоу (Peter Below) написал схему всех вещей, которые вам нужно обработать для элемента управления редактирования, который принимает только цифры. Методы все еще применимы сегодня, по крайней мере, для разработки Windows. Вот резюме:
- Override
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
там.
Просто установите Lines.LineBreak
собственность на LF
:
memo1.lines.LineBreak := #10;
По умолчанию #13#10
в винде.