Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi function xyz:tbitmap - wie Speicher freigeben? (https://www.delphipraxis.net/51706-function-xyz-tbitmap-wie-speicher-freigeben.html)

ichbins 17. Aug 2005 14:14


function xyz:tbitmap - wie Speicher freigeben?
 
Hallo, ich habe eine Funktion, die einen String in ein Bitmap konvertiert (einzelne Buchstaben sind in einem externen Bitmap gespeichert und werden zu dem String zusammengefügt). Die Funktion liefert direkt als Result eine TBitmap zurück. Bis jetzt verwende ich das dann folgendermaßen (getfontstring ist die Funktion):

Delphi-Quellcode:
canvas.stretchdraw(rect(100,100,500,300),getfontstring('Menü')); //Nur ein Beispiel
Jetzt habe ich nur das Problem, das ich den Speicher für die Bitmap im Result nicht wieder freigeben kann und sich das Programm nach einiger Zeit aufhängt, weil es keinen Speicher mehr hat (in einem Timer wird immer wieder die Funktion aufgerufen). Weiss jemand, was ich da tun soll? Gibt es irgendeine Funktion um verlorengegangenen Speicher zu suchen und freizugeben, die ich beim nächsten Start der Funktion aufrufen kann?

Bernhard Geyer 17. Aug 2005 14:19

Re: function xyz:tbitmap - wie Speicher freigeben?
 
Zitat:

Zitat von ichbins
Weiss jemand, was ich da tun soll?

Ja. Gib den speicher selbst frei

Delphi-Quellcode:
bmp := getfontstring('Menü');
canvas.stretchdraw(rect(100,100,500,300),bmp );
bmp.Free;
Zitat:

Zitat von ichbins
Gibt es irgendeine Funktion um verlorengegangenen Speicher zu suchen und freizugeben, die ich beim nächsten Start der Funktion aufrufen kann?

Da mußt du bei Delphi.Win32 schon selbst dafür sorgen. Erst unter .NET kannst Du dich größtenteils auf die Garbage-Collection verlassen.

ichbins 17. Aug 2005 14:25

Re: function xyz:tbitmap - wie Speicher freigeben?
 
Ich glaube jetzt habe ich selbst eine Lösung gefunden:

Ich nehme eine globale TBitmap-Variable, speichere in der Funktion das neue Bitmap in diese Variable und gebe nicht ein TBitmap zurück, sondern einen Pointer, der auf die Variable zeigt. Dann muss ich den Code nur leicht ändern. Beim nächsten Aufruf der Font-Funktion wird dann einfach der alte Inhalt der Variable überschrieben.

himitsu 17. Aug 2005 14:27

Re: function xyz:tbitmap - wie Speicher freigeben?
 
Und warum läßt du den Text nicht direkt in das Bild reinschreiben?

DrawFontString(canvas, 100, 100, 'Menü') oder so ähnlich...



[add]
aber das BitMap in der Globalen muß doch auch freigegeben werden!

ichbins 17. Aug 2005 14:31

Re: function xyz:tbitmap - wie Speicher freigeben?
 
@himitsu [ADD]: Ja, aber die globale Variable existiert nur 1 mal und wird beim nächsten Aufruf wieder überschrieben. Das Programm stürzt auch erst nach 5 Minuten ab, während denen ein 200ms Timer ständig den Screen mit wasweissich wie vielen Textstücken aktualisiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz