Ok und vielen Dank, ich habe es verstanden.
Ich versuch's mal in eigene Worte zu fassen.
LString := '123456';
Der Compiler weiß bevor er LString den String '123546' zuweist, dass der Text 6 Byte lang ist, und setzt SetLength(s, 6) automatisch vorher.
LBytes := AStream.Read(LString[1], 50);
Read bedeutet, dass munter 50 Bytes in die Variable LString gelesen werden sollen und erst nachher festgestellt wird, wieviel Bytes tatsächlich gelesen wurden. Ergo hat der Compiler gar nicht die Möglichkeit im Vorhinein SetLength aufzurufen.
Noch eine letzte Frage. Was bedeutet [1] bei LString[1] genau?
Meine Vermutung ist, da wir die ganze Zeit von Speicheradressierung sprechen, dass hiermit die erste Speicheradresse, die für LString reserviert wurde, gemeint ist. Wenn ich also LString[10] schreibe, würde in den ersten 9 Bytes der für LString reservierten Speicheradressen ein zufälliger Inhalt stehen. Richtig?
Aga aga aga, einen habe ich noch:
Delphi-Quellcode:
Integer(Buffer) := 5;
Pinteger(@Buffer)^:= 5;
Beides ist mir unbekannt und kann ich so über die Hilfe auch nicht nachvollziehen. Wann darf ich sowas überhaupt anwenden?