![]() |
Funktionsrückgabe freigeben
Hallo.
Es geht um Funktionen, die für die Rückgabe einen Datentyp besitzen, der innerhalb der Funktionen ersteinmal erstellt werden muss. Als Beispiel soll folgender Code dienen, den ich in einem älteren Posting fand:
Delphi-Quellcode:
Ich habe zum Testen nun simpel und einfach eine Zuweisung vorgenommen, die auch tadellos funktioniert:
function GetFileIcon(AFileName: string; AIndex: integer = 0): TIcon;
begin Result := TIcon.Create; Result.Handle := ExtractIcon(HInstance, PCHAR(AFileName), AIndex); end;
Delphi-Quellcode:
Startet man nun den Taskmanager, so kann man schön beobachten, wie der Speicherbedarf dieser Testanwendung steigt, wenn man vielfach auf den Button klickt.
procedure TForm1.Button1Click(Sender: TObject);
begin // Icon aus Exe auslesen und Image zuweisen Image1.Picture.Graphic := GetFileIcon('C:\Windows\NotePad.exe'); end; Nun betrachte ich stattdessen eine Prozedur als Lösung, bei der ich im ButtonClick eine TIcon-Variable anlege, erstelle und der Prozedur als Var-Parameter übergebe. Kehrt der Ablauf nach der Prozedur in das ButtonClick zurück, erfolgt die Zuweisung an Image1.Picture.Graphic. Danach gebe ich diese TIcon-Variable im ButtonClick frei. Hierbei ist im Taskmanager beim Klicken auf den Button kein Zuwachs an Speicherbedarf zu erkennen. Fazit: Offensichtlich werden die Speicherresourcen nicht freigegeben, die von der Funktionen mit TIcon als Datentyp belegt wurden. Frage: Wie kann man den belegten Speicher einer Funktionen, wie sie in obigen Beispiel zu sehen ist, wieder freigeben? Guido. |
Re: Funktionsrückgabe freigeben
Hallo,
probier mal
Delphi-Quellcode:
Icon:= GetFileIcon('C:\Windows\NotePad.exe');
Image1.Picture.Graphic.Assign(Icon); Icon.Free; Heiko |
Re: Funktionsrückgabe freigeben
Hi,
das hat mit Funktion bzw. Prozecuren direkt doch nichts zu tun. Du schreibst doch selbst Zitat:
|
Re: Funktionsrückgabe freigeben
Zunächst mal danke für eure Antworten.
Zitat:
Wie gesagt, probiert habe ich selbst schon (auch diese Möglichkeit). An Lösungen bin ich interessiert. Denn hierbei wird lediglich der Speicher für "Icon" freigegeben, NICHT der von der Funktion belegte! Dann hätte ich gerne gewust, wie ihr Postings lest!? Jetzt habe ich mich doch wirklich bemüht, das Problem möglichst verständlich zu beschreiben. Und um zu unterscheiden was gemeint ist, habe ich Prozedur und Funktion farblich hervorgehoben! Zitat:
Guido. |
Re: Funktionsrückgabe freigeben
Indem man keine Funktionen nimmt die da drin ein Objekt erstellen. Sowas ist totaler Müll, Prozeduren mit var Parmatern sollte man benutzen.
Hat man dennoch mal das Problem (und zwar wenn man scheisse Programmiert hat) dann geht das so:
Delphi-Quellcode:
Das was du da schreibst (mit Assign) is eigentlich so richtig gemacht, weiß nicht was du da noch freigeben willst ausser
Icon := IrgendNefuntionDieNenIconZurückgibt;
// ... was mit icon amchen Icon.Free; Bitmap.Assign(nil) vill |
Re: Funktionsrückgabe freigeben
Und um noch brechis Aussage zu ergänzen: Es ist dann sehr hilfreich (finde ich), wenn diese Funktion im Namen irgendetwas von "create" mit drin hat. Das hilft bei der Fehlersuche :mrgreen:
@brechi, sollte man die Variable nicht mit const übergeben? |
Re: Funktionsrückgabe freigeben
Moin Zusammen,
um das Ganze mal zu verallgemeinern:
Delphi-Quellcode:
Es ginge statt der Prozedur natürlich auch eine Funktion, solange diese kein Objekt zurückliefert.
// Das const soll verhindern, dass man sich den Pointer auf das Objekt zerschiesst
procedure IchMacheWasMitIrgendeinemObjekt(const AObjekt : TIrgendeineKlasse); begin //... end; var ObjektVariable : TIrgendeineKlasse; begin ObjektVariable := TIrgendeinKlasse.Create; try IchMacheWasMitIrgendeinemObjekt(ObjektVariable); finally FreeAndNil(ObjektVariable); // oder ObjektVariable.Free; end; end; |
Re: Funktionsrückgabe freigeben
Kleine Zwischenfrage:
Welche Unit brauche ich, um ExtractIcon(HInstance, PCHAR(AFileName), AIndex) benutzen zu können? :gruebel: Danke. |
Re: Funktionsrückgabe freigeben
Windows?
|
Re: Funktionsrückgabe freigeben
Ich verwende immer sowas:
Delphi-Quellcode:
Was ist daran falsch? Ich gebe es ja wieder frei oder?
function IchGebeEinObjectZurueck : TMeinObject;
begin Result:=TMeinObject.Create; end; . . begin with IchGebeEinObjectZurueck do try // Tu was.. finally Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz