Ver Mensaje Individual
  #5  
Antiguo 02-02-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
No te olvides que Picture es una propiedad de la clase TImage. Si te das el tiempo de revisar el código de la VCL te darás cuenta que en el método de asignación de la propiedad (SetPicture) cuando se recibe una referencia a nil, la memoria reservada por la imagen actual en efecto se libera.

Trataré de explicarte la forma en que trabaja la VCL en este sentido.

Las propiedades (un excelente invento de borland, creo yo) son una forma fantástica de introducir efectos secundarios de este tipo que al final ahorran trabajo y líneas de código. Cuando vos haces una asignación, en realidad ocurre tras bambalinas una serie de acciones que logran que esa acción sea efectiva. Por ejemplo, cuando asignas un valor al Caption de un TLabel, no solo se cambia el valor de este, sino se inválida el área que ocupa en pantalla, de manera que si está visible, el cambio se vea reflejado al usuario. Si no fuera así, siempre tendrias que llamar a Invalidate después de hacer un cambio para que este se reflejara.

En ocasiones, estas propiedades son objetos, y es muy importante comprender los efectos de invocar directamente los métodos de estos objetos, sobre todo los constructores y destructores, pues es muy probable que provoquemos un fallo en nuestro programa (como podras comprobar si compilas la recomendación que das, seguramente provocará un AccessViolation). De hecho, nunca he visto una propiedad de un objeto de la VCL que requiera que su constructor/destructor sea invocado directamente, con componentes de terceros... mejor revisar la documentación, y el código si está disponible.

Algo similar ocurre con la asignación de valores a estas propiedades, por ejemplo cuando querés asignar una imágen contenida en una variable (digamos una instancia de TBitmap) a un TImage, basta con hacer Image1.Picture := MyBMP; Si la VCL no estubiera preparada para manejar esto, en realidad harias que la propiedad Picture apunte a la misma dirección donde apunta MyBMP, y al liberar este, dejarías al TImage apuntando a una dirección donde en realidad ya no existe un objeto, lo cual a la postre seguramente provocaría un AccessViolation. Nuevamente si te das una vuelta por las unidades de la VCL verás que en realidad se hace una copia de la imágen (mediante assign), manteniendo de esa forma por un lado la independencia de las propiedades de la VCL con respecto de tus propias variables locales (o globales), y por el otro la responsabilidad de cada uno de liberar la memoria y/o recursos consumidos, la VCL su propia memoria, y vos la de tus variables, (llamando a MyBMP.Free cuando ya no lo necesites mas).

Espero haber sido claro y no confundirte con todo este rollo...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 02-02-2004 a las 04:42:30. Razón: Corregir alguna redundancia (no prometo corregirla toda... ;) )
Responder Con Cita