OK, maybe you do not understand what rvk and I were trying to explain. Therefore I fixed your demo to work. I marked all lines changed by my initials.
The code stores only the non-string elements of the record - this is easy when the string is moved to the end of the record definition, and the size of the string (the size of a pointer) is subtracted from the size of the record. Then the string is saved separately by calling ClearString.WriteAnsiString.
Reading is similar.
Alternatively you could declare the string sName as String[255] because this kind of string is NO pointer and has its characters inside the record. But because now even for an empty string 255 bytes are occupied in the file I prefer the other solution.