Hallo Angel4585.
Zitat von
Angel4585:
Dazu muss ich sagen das ich das Problem nicht verstehe... den Speicher freigeben den eine Funktion belegt??
Was gibt es daran nicht zu verstehen?
Die Frage ist: Wie gebe ich den Speicher frei, den ein Funktion belegt, die ein Objekt zurückgibt?
Ich habe den Eindruck, dass du das schon richtig verstanden hast:
Zitat von
Angel4585:
Jedes Mal wenn die Funktion aufgerufen wird wird auch ein neues Object erzeugt, d.h. nach dem 10. Aufruf der Funktion sind es 10 Objekte.
Und die sollten wieder freigegeben werden, wenn man einen ordentlichen Programmierstil praktiziert!
Zu deinem Beispiel mit der Klasse "TMeinObject":
Zunächst mal ist es recht geschickt gemacht! Dadurch entsteht der
Eindruck als würdest du auf meine Frage antworten. Die Frage war jedoch: Wie sieht dein "Tu was.." aus, wenn du das
OBJEKT aus der Funktionsrückgabe im With-Block benutzen willst.
Du hast in deiner Antwort jedoch einfach ein
"Unter-Objekt" genommen! Das war
NICHT die Frage! Du benutzt innerhalb des With-Blocks ein
(Unter-)Objekt des Rückgabe-Objekts. In diesem Fall das Objekt einer Property. Wie gesagt, es war
NICHT die Frage, wie ein ein
Teil (Property) des Rückgabe-Objekts im With-Block benutzt werden kann, sondern wie das
Rückgabe-Objekt selbst im With-Block benutzt werden kann.
Um jedoch auf das eigentliche Thema zurückzukommen:
Du hast in deinem Beispiel das Icon zwar (leer) erstellt, ihm aber kein Icon zugewiesen. Dadurch werden (fast) keine Ressourcen belegt. Der Sinn einer solchen Funktion ist natürlich, ein Icon auch zu benutzen/füllen. Wenn du das jedoch in deinem "TMeinObject"-Beispiel tust, sind wir so weit wie vorher!
Delphi-Quellcode:
type
TMeinObject = class(TObject)
private
FIcon : TIcon;
public
constructor Create;
property ObjectIcon : TIcon read FIcon write FIcon;
end;
constructor TMeinObject.Create;
begin
FIcon:=TIcon.Create;
end;
function IchGebeEinObjectZurueck : TMeinObject;
begin
Result:=TMeinObject.Create;
Result.ObjectIcon.LoadFromFile('C:\Test.ico'); // <- Speicher belegen
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with IchGebeEinObjectZurueck do
try
// Icon aus Exe auslesen und Image zuweisen
Image1.Picture.Graphic := ObjectIcon
finally
Free;
end;
end;
Nun ergibt sich wieder das gleiche Ergebnis: Klickst du vielfach auf den Button, ist im Taskmanager ein langsames aber stetiges Ansteigen der Speicherbelegung zu erkennen!
Aber nun genug davon. Wir haben offensichtlich alle (Thread-Teilnehmer) die Prozedur-Lösung zum Favoriten "erkoren"!
Einschließlich dir selbst:
Zitat von
Angel4585:
Wenn ich jedoch das ganze mit einer Prozedur erledige in der das Object falls es schon erzeugt wurde freigebe und danach erzeuge ist klar das es immer nur ein einziges bleibt.
Fazit:
Es wurden Möglichkeiten zur Freigabe von Objekt-Funktionsrückgaben in diesem Thread gezeigt. Jedoch können diese nicht wirklich überzeugen. Die Prozedur-Lösung hingegen stellt eine saubere, übersichtliche Möglichkeit dar.
Damit ist meine Frage beantwortet. Nochmals
danke an alle!
Guido.