![]() |
Handles bei Änderungen an Bitmaps
Hallo
Ich arbeite an einer Anwendung welche Bitmaps animiert. Dabei wird die Grösse, Position und Aussehen des Bitmaps laufend verändert und das Bitmap anschliessend wieder neu gezeichnet. Nach einer gewissen Zeit bekomme ich die Exception EOutOfResources. Eine Analyse mit dem Tool MemProof hat ergeben, dass bei der Veränderung der Grösse eines Bitmaps das Windows Handle neu zugewiesen wird, das alte vorher aber nicht mehr freigegeben wird.
Delphi-Quellcode:
Wie kann ich dieses Verhalten verhindern? :gruebel:
L_Bitmap:=TBitmap.create;
{L_Bitmap.Handle = 0} L_Bitmap.Width:=L_width; {L_Bitmap.Handle = 173564234} |
Re: Handles bei Änderungen an Bitmaps
So?
Delphi-Quellcode:
Mach dir klar, daß du mit TBitmap.create() einen Konstruktor aufrufst ... dieser erzeugt ein komplett neues und vom alten unabhängiges Objekt. L_Bitmap ist nur ein sog. Objekt- oder Instanzenpointer. Du kannst auch temporär L_Bitmap in eine Variable selben Typs zwischenspeichern und erst nach Erzeugung des neuen Objektes freigeben ... aber auf jeden Fall freigeben.
L_Bitmap.Free();
L_Bitmap:=TBitmap.create; {L_Bitmap.Handle = 0} L_Bitmap.Width:=L_width; {L_Bitmap.Handle = 173564234} |
Re: Handles bei Änderungen an Bitmaps
Hallo Bitmap,
herzlich willkommen in der Delphi-PRAXiS. An einer Lösung deines Problems haben wir uns vor einigen Wochen schonmal versucht: ![]() Grüße vom marabu |
Re: Handles bei Änderungen an Bitmaps
Hallo zusammen,
Danke schon mal für die Tips. Den Beitrag für die Bitmaps habe ich vorher schon gelesen. Irgendwie sehe ich aber nicht den Hinweis, der mir bei meinem Problem weiterhilft. Ich habe auch alle Punkte bzgl. Dormant, FreeImage, etc. eingebaut. Nachfolgend der ganze Code:
Delphi-Quellcode:
Wieso werden hier für L_Bitmap nicht alle Ressourcen freigegeben? :gruebel:
var L_Bitmap : TBitmap;
L_Width,L_Height: integer; begin L_Bitmap:=nil; try L_Bitmap:=TBitmap.create; L_Width:=round(max(2*abs(L_VL.X-L_M.X),2*abs(L_VR.X-L_M.X))); L_Height:=round(max(2*abs(L_VL.Y-L_M.Y),2*abs(L_VR.Y-L_M.Y))); L_Bitmap.PixelFormat := pf24bit; L_Bitmap.Width:=L_width; L_Bitmap.Height:=L_Height; ... L_Bitmap.canvas.StretchDraw(Rect(0,0,BMWidth,BMHeight),BitmapOriginal); L_Bitmap.FreeImage; ... finally begin if assigned(L_Bitmap) then begin L_Bitmap.ReleaseHandle; L_Bitmap.free; end; end; end; |
Re: Handles bei Änderungen an Bitmaps
Mache mal "L_Bitmap.FreeImage;" auch noch ins finally ...
|
Re: Handles bei Änderungen an Bitmaps
Hallo
Habe noch einiges ausprobiert und festgestellt, wenn ich die Anweisung: L_Bitmap.ReleaseHandle; im finally Block weglasse, Meldet mir MemProof keine Speicherlecks mehr bei den Änderungen des Bitmapobjekts. Hat jemand eine Idee was der Grund für das, für mich jedenfalls, seltsame Verhalten sein könnte? :roteyes: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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 by Thomas Breitkreuz