Забавный случай в FreePascal 3й версии идёт абсолютно классическое поведение строки как в старых версиях Delphi 6 и 7.
То-есть длина строки (type String) не может быть длиннее чем 255 байт…
Связано это с тем что строка в pascal передается как [1 байт длина][N байт буфер]
Что позволяет например получить длину строки с помощью byte(str[0]) и получить Pointer на первый символ через @str[1] ..
В Delphi более поздних версий буфер строки составляется из блоков [1 байт длина][N байт буфер][1 байт длина][N байт буфер]
То-есть если первый байт будет 255 то он добавляет еще один дополнительный буфер… [6][….] или [255][….][13][……]
Забавное поведение, но иногда создает дикие подводные камни в обработке строк… Из чего выходит что всё-таки используйте TStringstream, TStringBuilder или StrAlloc(N) для строительства заведомо длинных строк…
//fpc 3.0.0 program HelloWorld; var str: String; plen: ^byte; len: byte; begin str := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' // 100 + '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' // 200 + '01234567890123456789012345678901234567890123456789' + (* 250 *) '01234' + (* 255 *) '__AND_THIS_WILL_IGNORED__'; //plen := @str[0]; //len := plen^; len := byte(str[0]); writeln(len, ' ', length(str), ' ', str); // 255 255 .... end.