Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Handles bei Änderungen an Bitmaps (https://www.delphipraxis.net/52224-handles-bei-aenderungen-bitmaps.html)

Bitmap 25. Aug 2005 18:50


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:
L_Bitmap:=TBitmap.create;
{L_Bitmap.Handle = 0}

L_Bitmap.Width:=L_width;
{L_Bitmap.Handle = 173564234}
Wie kann ich dieses Verhalten verhindern? :gruebel:

Olli 25. Aug 2005 18:55

Re: Handles bei Änderungen an Bitmaps
 
So?
Delphi-Quellcode:
L_Bitmap.Free();
L_Bitmap:=TBitmap.create;
{L_Bitmap.Handle = 0}

L_Bitmap.Width:=L_width;
{L_Bitmap.Handle = 173564234}
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.

marabu 25. Aug 2005 19:00

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: klick

Grüße vom marabu

Bitmap 25. Aug 2005 19:15

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:
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;
Wieso werden hier für L_Bitmap nicht alle Ressourcen freigegeben? :gruebel:

Olli 25. Aug 2005 19:35

Re: Handles bei Änderungen an Bitmaps
 
Mache mal "L_Bitmap.FreeImage;" auch noch ins finally ...

Bitmap 26. Aug 2005 16:23

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