Zitat von
Alexander Roth:
aber ich möchte wissen wie man es anders hinkriegt.
Was denn eigentlich?
Du hast unter "old" eine Stringliste. Deine erste Variante:
Zitat von
Alexander Roth:
Delphi-Quellcode:
function a(old:Tstringlist):Tstringlist;
begin
result:=Tstringlist.Create;
result.Clear;
// result.Free;
end;
erzeugt eine neue Stringliste (diese ist per se leer); dann leerst Du sie und gibt sie als Ergebnis (result) zurück. "Dort" kann dann damit gearbeitet werden.
Zitat von
Khabarakh:
Rückgabewerte einer Funktion muss der Aufrufer dieser Funktion freigeben.
Du musst sie also "irgendwo" selbst wieder freigeben, z.B.:
Delphi-Quellcode:
// irgendeine Prozedur
var sListeAlt: TStringList;
sListeNeu: TStringList;
...
// sListeAlt muss bereits erzeugt sein
sListeNeu := a(sListeAlt);
...
sListeNeu.Free;
Zitat von
Alexander Roth:
und wenn man es nicht created dann zeigt anscheinend result auf old.
Nein: Wenn der Befehl "result:=Tstringlist.Create;" nicht ausgeführt werden soll, zeigt Result "irgendwohin" und führt in "irgendeiner Prozedur" sehr schnell zu Zugriffsverletzungen.
Zitat von
Alexander Roth:
Natürlich könnte ich das umgehen
Delphi-Quellcode:
procedure a(var new:Tstringlist; old:Tstringlist);
begin
new.clear;
end;
Bei diesem Verfahren wird "new" geleert (natürlich auch mit
Exception, wenn es nicht vorher erzeugt wurde) und sonst nichts - es gibt keinen Zusammenhang mit "old".
Nebenbei: Eine Stringliste muss nicht als "var" deklariert werden; man kann sie auch als "const" manipulieren. (Ich weiß nicht genau warum; vielleicht unterscheiden sich da auch Delphi-Versionen.)
Also meine Hauptfrage bleibt: Was willst Du eigentlich? Jürgen