FillChar(Result, ALength, Ord(AChar));
Obwohl es FillChar heißt, werden da nicht Char gefüllt sondern Byte. Da Char heutzutage 2 Byte groß sind, füllt der Aufruf nur die erste Hälfte - und das auch noch ab der falschen Stelle (0 statt 1 -> Bang!). Bei Nullen könnte das sogar noch klappen, aber bei echten
Unicode-Zeichen würde auch das Ord(AChar) nur das untere Byte berücksichtigen. Fazit: FillChar für Strings ist blöd.