Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda con DeleteObject (https://www.clubdelphi.com/foros/showthread.php?t=54564)

MAXIUM 23-03-2008 23:09:39

Duda con DeleteObject
 
Tengo la siguiente duda:

Creando un archivo de recursos en el que uno de ellos es un bitmap con nombre ClubDelphi.

Código Delphi [-]
var
    FBitmap: HBITMAP;
begin
       FBitmap:= LoadBitmap(hinstance, 'ClubDelphi');
    // Hago algo y luego libero el recurso.
       DeleteObject(FBitmap);
end;

Ahora todo OK, la duda es si al usar el siguiente código debo liberar algo usando DeleteObject o el mismo EXE libera el recurso del compente Image

Código Delphi [-]
begin
       Image1.Picture.Bitmap.Handle:= LoadBitmap(HInstance, 'ClubDelphi');
    // ¿Estara esto de más?  DeleteObject(HInstance);
end;

Caro 24-03-2008 00:40:25

Hola MAXIUM, sobre los objetos que te creas una vez que los termines de utilizarlos debes liberarlos.

Código Delphi [-]
   try
     FBitmap:= LoadBitmap(hinstance, 'ClubDelphi');
     // Hago algo y luego libero el recurso.
   finally
     FBitmap.Free;
   end;

Saluditos

keyboy 24-03-2008 01:18:50

Creo que la pregunta de Maxium va encaminada a saber si al liberar el objeto (método Free) también se libera el handle que devuelve Windows en la función LoadBitmap.

Digamos que uno está acostumbrado a la comodidad de la VCL sin recurrir a llamadas a la API de Windows (como lo es LoadBitmap) y es natural que uno se desconcierte al usarlas, sobre todo si tenemos en cuenta el tajante texto de la ayuda del SDK de Windows:

Cita:

The application must call the DeleteObject function to delete each bitmap handle returned by the LoadBitmap function
Pero, es bueno recordar también que la VCL hace un gran trabajo para protegernos de estos detalles.

Hay que recordar que una propiedad como Bitmap.Handle, no es una variable cualquiera, y la asignación de un valor a ella, pasa por un método (SetHandle) que, entre otras cosas, se encargará de aplicar el DeleteObject al handle anterior, en caso de que ya hubiera uno asignado. Y, al liberarse el objeto, el destructor se encargará igualmente de aplicar DeleteObject cuando sea necesario.

En resumen, no es necesario aplicar DeleteObject uno mismo, pues la VCL se encarga de ello, pero, claro está, como dice Caro, es indisplensable liberar el objeto Bitmap con Free.

Bye

MAXIUM 24-03-2008 14:39:45

Excelente respuesta, muchas gracias las cosas me han quedado claras.


La franja horaria es GMT +2. Ahora son las 06:28:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi