data.awB zeigt nicht auf die Stringdaten, sondern einen internen Zeiger ...
wenn du den einfac so überschreibst, und so die innere Struktur
zerstörst, dann dreht da auch schonmal was durch
data.awB[1] = Position des ersten Zeichens und damit der Anfang des enthaltenen Textes.
Delphi-Quellcode:
f.ReadBuffer(data.nr, sizeOf(data.nr));
f.ReadBuffer(i, SizeOf(Integer));
SetLength(data.kat, i);
f.ReadBuffer(data.kat[1], i);
f.ReadBuffer(i, SizeOf(Integer));
SetLength(data.frage, i);
f.ReadBuffer(data.frage[1], i);
...
Beim Speichern speicherst du ohne die [1] nur den Zeiger und irgendwas anderes und nicht den Text.
außerdem mußt du die länge des Strings vorm Reinladen des Textes setzen.
dabei mußt du aber aufpassen, daß ein String nie leer ist. (außer du machst eine Abfrage rein)
Delphi-Quellcode:
f.ReadBuffer(i, SizeOf(Integer));
SetLength(data.kat, i);
if i > 0 then f.ReadBuffer(data.kat[1], i);
(dieses ebenso beim Speichern)