Я могу предложить подсказку, что я только что работал над тем же типом проблемы в C ++ Builder Rio. У меня нет Delphi, только C ++ Builder, но эти два продукта настолько взаимосвязаны, что я все время использую подсказки (или код) из Delphi для решения своих проблем.
В C / C ++ вы обычно можете использовать «\ r» или его эквивалент «\ n \ l» для отображения возврата каретки (который я пытался отобразить в TMemo). TMemo выглядело так, как будто он просто отбрасывал коды (за исключением того, что считал "\ l" для перевода строки недопустимым escape-кодом, поэтому он отображал только "l") и отображал все в одной строке. Я заметил, что ярлык для вкладки ("\ t") работает.
Опять же, в C / C ++ есть и другие варианты создания символов. Эквивалент того, что вы делаете, «char (13) + char (10)» просто отображает символы «23» со всем в одной строке (как вы описываете). Вот как можно добавлять символы при использовании десятичной дроби (основание 10). Если бы я хотел использовать шестнадцатеричный код, я бы написал «\ 0xd \ 0xa» (который просто удаляется из текста и отображается в одной строке, как это показано во втором абзаце выше).
Решением, которое я нашел и которое работало в C ++ Builder, было использование восьмеричной нотации для моей кодировки символов ("\ 015 \ 012"). Лично за 50 лет программирования я никогда раньше не сталкивался с ситуацией, когда шестнадцатеричный код не удался, но восьмеричный код работал, но я был достаточно отчаянным, чтобы попробовать его.
Для всего этого тестирования и отладки я создал новый проект, добавил TMemo и кнопку (и установил ShowHint = true для кнопки) в форму и добавил следующий код для кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString CR = "\015\012";
Memo1->Text = "a" + CR + "b";
Button1->Hint = Memo1->Text + " (hint)";
}
Итак, мое решение вашей проблемы - выяснить, как вы можете ввести восьмеричные коды для символов и отобразить соответствующий текст в Delphi, а затем использовать эту кодировку для восьмеричных символов "015" и "012".