Ich denke eher das Verhalten bei localVar1 ist der Fehler.
Richtig, der Compiler "vergisst" an der Stelle den Aufruf von CopyRecord usw., so dass die Werte nicht überschrieben werden.
Bei den beiden anderen Varianten wird der Record nach dem Operator jeweils überschrieben.
Ich glaube auch nicht, dass das Absicht ist.
Rate mal, warum ich ständig predige, daß man ein Result "immer" vollständig initialisieren muß.
Delphi-Quellcode:
function GetStr(Value: integer): string;
begin
Result := Result + IntToStr(i);
end;
var
i: Integer;
S: string;
begin
S := '';
for i := 0 to 100 do
S := S + GetStr(i);
ShowMessage(S);
end;
Denn bei Records (über 8 bytes oder mit gemanageten Typen) und gemanageten Typen (Strings, Interfaces usw.) baut der Compiler das intern so um.
Delphi-Quellcode:
procedure GetStr(Value: integer; var Result: string);
begin
Result := Result + IntToStr(i);
end;
var
i: Integer;
S, AutoTempVar: string;
begin
S := '';
for i := 0 to 100 do begin
GetStr(i, AutoTempVar);
S := S + AutoTempVar;
end;
ShowMessage(S);
end;