Richtig wäre zu schreiben:
Delphi-Quellcode:
S.Insert(3, 'xx')
S.Insert(7, 'zz');
Delphi-Quellcode:
S.Insert(...); // richtig
S.Insert(...);
S := S.Insert(...); // geht, aber bissl sinnlos
S := S.Insert(...);
S.Insert(...).Insert(...) // niemals so
S.Remove(...); // falsch
S.Remove(...);
S := S.Remove(...); // richtig?
S := S.Remove(...);
S := S.Remove(...).Remove(...); // das geht ebenfalls
Insert gibt eine Kopie des Strings zurück und wenn man den nochmal ändert, dann bleibt der eigentliche String unverändert.
Das zweite Insert geht dann ins Nichts, obwohl man es "optisch" benauso gemacht hat, wie beim ersten Mal.
Insert verändert zwar den String selber, aber man sollte sich nun sicherheitshalber dennoch angewöhnen das Result neu zuzuweisen.
Während Remove, was scheinbar dem Delete entspricht, nur das Result beeinflust,
also wenn das nicht verwirrend ist?
Delphi-Quellcode:
var
S, S2: string;
begin
S := 'ace';
S.Insert(1, 'b');
S.Insert(3, 'd');
ShowMessage(S); // abcde
S := 'ace';
S.Insert(1, 'b').Insert(3, 'd'); // zweites Insert verläuft sich im Nirgendwo
ShowMessage(S); // abce !
S := 'ace';
S := S.Insert(1, 'b').Insert(3, 'd'); // S wurde geändert, in abce, und wurde dann vom Result überschrieben
ShowMessage(S); // abcde
S := 'ace'.Insert(1, 'b').Insert(3, 'd'); // keine Problem, da nur Result benutzt und die Änderung an der Konstante ins Nix ging
ShowMessage(S); // abcde
// Insert als Erstes verhält sich anders, wie nachfolgende Aufrufe
S := 'ac';
S.Insert(1, 'b');
S2 := S.Remove(1, 1);
ShowMessage(S + ' ' + S2); // abc ac
S := 'ac';
S2 := S.Insert(1, 'b').Remove(1, 1); // Insert ändert S und Result, Remove geht nur auf Result
ShowMessage(S + ' ' + S2); // abc ac
S := 'abc';
S.Remove(1, 1); // Remove hat auf S keine Wirkung
S2 := S.Insert(1, 'b'); // Insert ändert S und S2
ShowMessage(S + ' ' + S2); // abbc abbc
S := 'abc';
S2 := S.Remove(1, 1).Insert(1, 'b'); // Insert hat keine Wirkung auf S (und Remove auch nicht ... sieht aber so aus, als ging es)
ShowMessage(S + ' ' + S2); // abc abc
end;
Naja, die Helper können nett sein, aber für Insert, Delete, Length und vorallem SetLengeh kann man sich selber doch fast nur empfehlen beim Alten zu bleiben.
PS: AnsiString, UTF8String und dyn. Arrays fehlen
noch ganz. Was soll's, AnsiStrings kann man bei Multiplatform eh vergessen.
http://andy.jgknet.de/blog/2013/10/t...-byte-strings/
Keine Ahnung was mit dem 0-Index los war. Inzwischen scheint es zu laufen.