Hallo,
ich habe eine Frage zum AnsiString und dessen Verwaltung im Speicher.
Folgendes Konstrukt (ich möchte keine Diskussion über Nutzen/Zweck/Sinnhaftigkeit etc. des QT erzeugen):
Delphi-Quellcode:
//Global
var
MyAnsi: AnsiString;
procedure TForm1.MakeStr(aStr: PAnsiString; Laenge: Integer);
var
TmpStr : String[4];
begin
SetLength(aStr^, 0);
SetLength(aStr^, Laenge);
TmpStr := 'HA';
Move(TmpStr[1], aStr^[1], 2);
end;
procedure TForm1.MakeStr2(aStr: PAnsiString);
var
NewMsgString : AnsiString;
begin
NewMsgString := Copy(aStr^, 1, 2) + 'HALLO WELT';
aStr^ := NewMsgString;
end;
procedure TForm1.MakeStr3(aStr: PAnsiString);
var
NewMsgString : AnsiString;
begin
NewMsgString := Copy(aStr^, 1, 2) + 'KURZ';
aStr^ := NewMsgString;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeStr(@MyAnsi, SizeOf(Word));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MakeStr2(@MyAnsi);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
MakeStr3(@MyAnsi);
end;
Beim Aufruf von MakeStr, wird die Länge des Strings gesetzt auf die Länge, welche im Parameter übergeben wurde.
Anschließend wird etwas in den String geschrieben.
Im Aufruf von MakeStr2 wird das SetLength nicht aufgerufen aber die Länge des Ursprungsstrings vergrößert, da ich noch was hinten dran hänge.
Im Aufruf von MakeStr3 wird das SetLength nicht aufgerufen aber die Länge des Ursprungsstrings verkürzt, da ich am Ende was "abschneide".
Meine Frage ist nun, muss ich das SetLength eigentlich machen bzw. kann mir beim Aufruf von MakeStr2/MakeStr3 etwas im Speicher hängen bleiben?
Ich hoffe ich versteht meine Frage und könnt mir weiterhelfen.