Проблема в этой строке:
for j := 0 to system.Length(str) do
Это должно читаться как
for j := 1 to system.Length(str) do
В строке длины, N , индексы символов равны 1, 2, ..., N .
Это потому, что строки в Delphi используют индексирование на основе 1. На большинстве других языков индексы были бы 0, 1, 2, ..., N - 1.
Но вы также получили число символов неправильно: действительно, вы пытаетесь перечислить N + 1 символ (0, 1, 2, ... N ) в строку длиной N . (Вспомните, например, случай N = 3. 0, 1, 2, 3 - это четыре, а не три индекса!)
Купите, почему вы получаете казалось бы, пустая строка из функции? Ну, это из-за внутренней структуры Delphi строк . Перед первым символом (каждый символ составляет два байта) у вас есть длина в виде четырехбайтового (32-разрядного) целого числа. str[0]
, скорее всего, получит доступ к «персонажу» перед первым символом. Эти два байта являются MSB длины. Поскольку длина вашей строки, вероятно, не превышает $ FFFF, они равны нулю, поэтому вы получите нулевой символ. Это, вероятно, приведет к тому, что рендеринг этой строки прекратится в этой точке, и будет выглядеть, будто строка пустая.