ich moechte folgenden Code verwenden:
Code: Alles auswählen
function Something: TObject;
var AObject: TObject
begin
AObject := TObject.Create;
AObject.Something(bla);
Result := AObject;
end;
Vielen Dank!
Code: Alles auswählen
function Something: TObject;
var AObject: TObject
begin
AObject := TObject.Create;
AObject.Something(bla);
Result := AObject;
end;
Die Frage ist ja: was soll deine Funktion machen? Ich vermute jetzt mal, sie erzeugt ein neues Objekt, tut irgendetwas damit und gibt es dann nach "draußen". Sowas nennt man im allgemein Factory Pattern und ist sehr beliebt um ein Objekt zu erzeugen und mit bestimmten Werte zu versehen.Eclipticon hat geschrieben:frage mich jetzt aber, wo ich AObject wieder freigeben muss ... innerhalb der Funktion? Diese Logik (und auch die, nach der Objekte automatisch freigegeben werden) ist mir noch nicht ganz klar ...Code: Alles auswählen
function Something: TObject; var AObject: TObject begin AObject := TObject.Create; AObject.Something(bla); Result := AObject; end;
Code: Alles auswählen
var
Dumdidum: TObject;
begin
Dumdidum := Something; //hier wird dann deine Funktion aufgerufen und das in ihr erzeugte Objekt entgegengenommen
Dumdidum.MachWas;
Dumdidum.MachWasAnderes;
FreeAndNil(Dumdidum); //nun ist das Objekt zerstört und Dumdidum zeigt auf nil;
end.
Code: Alles auswählen
var
bobjekt:TObjekt;
begin
bobjekt := something;
bobjekt.irgendwastolles
end;
Code: Alles auswählen
Signatur := nil;
Code: Alles auswählen
Signatur := nil;
Vorsicht, da kannst du in ganz üble Probleme kommen:Eclipticon hat geschrieben:Konkret wird das Funktionsergebnis (TStringList) an eine Komponente uebergeben, womit ich mich (soweit ich es richtig verstehe) nicht mehr um die Freigabe dieses Objekts kuemmern muss.
Code: Alles auswählen
var
Komponente: TKomponente; //sagen wir mal die hat eine Eigenschaft namens StringList
Objekt: TStringList;
begin
Komponente := TKomponente.Create; //eine neue Komponente wird erzeugt, dabei wird auch ihre Eigenschaft StringList mit einer neuen TSTringList belegt
Objekt := TStringList.Create;
Komponente.StringList := Objekt; //die Eigenschaft verweist nun auf die von dir erzeugte TStringList, die ursprüngliche ist immer noch da aber es gibt keinen Verweis mehr darauf
Komponente.Free; //beim Aufräumen wird die von dir erzeugt TStringList mit zerstört, die ursprüngliche oxidiert immer noch im Speicher herum
end.
Sowas soll es ja auch nie geben. Nur wird gelegentlich das Free irgendwo anders aufgerufen.Eclipticon hat geschrieben:Sorry, ich komme jedes Mal ins Schwitzen, wenn ich ein .Create ohne ein .Free sehe