FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Liberar BMP y FONT ->> SOLUCIONADO
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Liberar BMP y FONT ->> SOLUCIONADO
Posted: Fri Aug 02, 2013 01:33 AM
Buenas noches,

Estoy en camino de liberar todos los GDI que queden "de más" luego de cerrar dialogs.

Me encuentro con un problema a la hora de cerrar un buttonbmp y es que no libera el BMP como pude verse en el informe que me entrega el rescheck (la línea 4424 es la final del buttonbmp).

83 BMP 0 EDITOTRABAJOS 4424
80 BMP 0 EDITOTRABAJOS 4424

Intenté de todos los modos que conozco pero no logro liberar este BMP que queda en memoria tantas veces como se abra el dialog que contiene el buttonbmp

Este es el código del Buttonbmp (quizás hay otro modo de hacerlo que libere el BMP) :

Code (fw): Select all Collapse
Redefine buttonbmp oBtnServerWebVista ;
     id 4006 of oFld:aDialogs[6] ;
     action (if(!HojeoVisitas(nTalon,oDlg),(oBtnServerWebVista:loadbitmap( "INTERNET_NO"),;
             oBtnServerWebVista:disable()),;
             oBtnServerWebVista:loadbitmap( "INTERNET_SI")) ,  ;
             oBtnServerWebVista:refresh()) ;
     bitmap {|| if( aDatosDelServer[13] , "INTERNET_SI" , "INTERNET_NO" ) }


Gracias.

Rolando :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP
Posted: Fri Aug 02, 2013 07:02 AM

Rolando,

Estas usando una clase TButtonBmp modificada ?

Es que veo que usas un codeblock para el bitmap y FWH no lo soporta:
bitmap {|| if( aDatosDelServer[13] , "INTERNET_SI" , "INTERNET_NO" ) }

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP
Posted: Fri Aug 02, 2013 02:41 PM
Antonio,

Gracias por responder.

Estoy usando la clase sin modificar. Seguramente puse el codeblock y, como no funcionó así, programé el cambio de bitmap en el action pero me olvidé de sacar el codeblock. Lo saqué y listo, problema resuelto. Lo que sí, si no se le asigna un bitmap a este tipo de botón, al cerrar el dialog que lo contiene queda un bitmap sin cerrar correspondiente a ese botón, así que le dejé:
Code (fw): Select all Collapse
bitmap "INTERNET_NO"

Y con esto se cierra bien.

AHORA LO ÚLTIMO QUE NO PUEDO CERRAR EN ESTE DIALOG, es un font y el rescheck lo presenta:
78 FONT -267766763 EDITOTRABAJOS 241

La línea 241 hace referencia al define que hago así:
Code (fw): Select all Collapse
define font oFnt NAME "Arial" size 0,-13


Luego de definir el dialog le asigno el font así:
Code (fw): Select all Collapse
oDlg:oFont:=oFnt


Pero no encuentro la manera de cerrar este font que queda luego de cerrar el dialog. Gracias.

Rolando :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Fri Aug 02, 2013 06:03 PM

Rolando,

Los fonts y los brushes nunca se pueden asignar directamente:

asi que en vez de esto:
oDlg:oFont:=oFnt

tienes que hacer siempre:
oDlg:SetFont( oFnt )

Voy a revisar lo otro que me comentas, gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Fri Aug 02, 2013 06:06 PM

Que valor tiene el handle de ese bitmap que te queda si no le asignas un bitmap ? gracias

Que valor muestra en checkres.txt ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Fri Aug 02, 2013 06:49 PM
Antonio:

Probé como indicas:
Code (fw): Select all Collapse
oDlg:SetFont( oFnt )

Pero sigue quedando el oFnt sin cerrar.

Por otro lado, si no agrego un bitmap el checkres indica:

81 BMP 0 EDITOTRABAJOS 4426

Debo aclarar que los diálogos que uso son desde recursos en una DLL y son todos NOWAIT.

Gracias.

Rolando :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Fri Aug 02, 2013 08:10 PM
Rolando,

Despues de ACTIVATE DIALOG ... estas haciendo oFnt:End() ?

El valor del handle es cero lo que confirma mi sospecha de que no se estaba comprobando si el nombre del bitmap llega vacio. De todas formas aunque aparezca en checkres.txt no significa que sea un handle no liberado porque su valor es cero. Para que no se produzca eso los cambios a implementar en buttonb.prg son:

Code (fw): Select all Collapse
   METHOD Destroy() INLINE If( ! Empty( ::hBitmap ), DeleteObject( ::hBitmap ),),;
                           ::Super:Destroy()


Code (fw): Select all Collapse
METHOD HasAlpha() INLINE ;
                      ::lHasAlpha := If( ! Empty( ::hBitmap ), HasAlpha( ::hBitmap ), .F. )


Y este aparece dos veces:
Code (fw): Select all Collapse
   if ! Empty( cBitmap )
      ::hBitmap   = If( File( ::cBitmap ), ReadBitmap( 0, ::cBitmap ),;
                        LoadBitmap( GetResources(), ::cBitmap ) )
   endif
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Fri Aug 02, 2013 11:35 PM
Antonio:

Despues de ACTIVATE DIALOG ... estas haciendo oFnt:End() ?

>>>>> Sí, pero no cierra el oFnt. Es más, estuve revisando el resto del programa y no libera NINGÚN font de NINGÚN dialog. (Uso FWH 10.04)

>>> Algo debo estar haciendo mal porque veo que tampoco libera ningún font (correctamente asignado) a las xBrowses.


Y este aparece dos veces:
Code (fw): Select all Collapse
if ! Empty( cBitmap )
      ::hBitmap   = If( File( ::cBitmap ), ReadBitmap( 0, ::cBitmap ),;
                        LoadBitmap( GetResources(), ::cBitmap ) )
   endif


>>>>> No encuentro estas líneas de código.


Rolando :-)
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 03:38 AM
rolando wrote:
Debo aclarar que los diálogos que uso son desde recursos en una DLL y son todos NOWAIT.
Rolando :-)


Por si no lo tienes asi, intenta esto:

ACTIVATE DIALOG oDlg NOWAIT ;
Valid ( oFnt:End() )

Saludos.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 06:15 AM

Rolando,

esto puede servirte:

while oFont:nCount > 0
oFont:End()
end

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 12:20 PM

Gracias Antonio y Francisco.

Sigo luchando contra esto.

Ahora, cuando llamo a un dialog mediante un buttonbmp, al retornar de ese segundo dialog da un error supuestamente ubicado en el primer dialog. Ya que tiene antes una (b) no estoy seguro que el error corresponda al primer dialog desde donde lo llamo con el botón pese a que así lo indica.

Aclaro que ese segundo dialog no tiene errores de cerrado de objetos si se entra directamente sin llamarse desde el botón del primer dialog. El rescheck muestra esto:

    65  BMP 67442497    (b)LISTOTRABAJOSXBRO    2313    
    66  BMP 50665575    (b)LISTOTRABAJOSXBRO    2313    
    69  BMP 50665871    (b)LISTOTRABAJOSXBRO    2313    
    68  BMP 67443086    (b)LISTOTRABAJOSXBRO    2313    
    64  BMP 67442496    (b)LISTOTRABAJOSXBRO    2313    
    67  BMP 50665576    (b)LISTOTRABAJOSXBRO    2313

Me llama la atención la "(b)"

Gracias.

Rolando :D

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 01:24 PM

Rolando,

65 BMP 67442497 (b)LISTOTRABAJOSXBRO 2313

Quiere decir que en la línea 2313 de tu PRG declaras un codeblock y en ese codeblock es donde se creo ese bitmap.

Puedes mostrar el código de la línea 2313 ?

En cuanto a lo otro que comentas de ButtonBmp, es necesario que nos proporciones un ejemplo que reproduzca lo que comentas, ó es imposible saber que pueda estar ocurriendo, gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 02:21 PM
Antonio,

Primero comentarte que lo que propusiste para los font parece funcionar, hice una función:

Code (fw): Select all Collapse
Function LiberoFont(oFonte)
  while oFonte:nCount > 0
    oFonte:End()
  end
Return nil


A la que llamo en el valid:

Code (fw): Select all Collapse
LiberoFont(oFnt)


Y con esto, en mis primeras pruebas, cierra correctamente todos los fonts abiertos incluyendo los de la xBrowse's.

Ahora, yendo a lo que me indicas sobre la línea 2313, aclaro que botón es un button (no buttonbmp como había expuesto antes) y comento que está al final de estas:

Code (fw): Select all Collapse
redefine button oBtnEditar ;   
  id 4003 OF oDlg ;
  action if(aListar[oBrw:nArrayAt,8] <> -1 , ;
  (EditoTrabajos(alltrim(str(aListar[oBrw:nArrayAt,8])), 40 , oDlg) ) , ;
  (msgsound(cLocalRaiz+"\AUDIO\campanada.wav") , oBrw:setfocus()) )


Para hacerla más sencilla, hice la prueba cambiando el botón a:

Code (fw): Select all Collapse
redefine button oBtnEditar ;   
  id 4003 OF oDlg ;
  action EditoTrabajos(alltrim(str(aListar[oBrw:nArrayAt,8])), 40 , oDlg) )


E indica el mismo error comentado.

Gracias.

Rolando :-)
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 02:28 PM

Rolando,

Cual es el error ? Has hablado de un error pero no has dicho cual es.

Puedes copiar aqui el comienzo del error.log ?

Puedes proporcionar un pequeño ejemplo autocontenido que lo reproduzca ? gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 02:33 PM

Rolando,

No debes usar una función para liberar los fonts como has hecho, porque FWH te permite reusar los fonts y los brushes. Es decir: distintos objetos podrian estar usando el mismo objeto font y asi no hay que tener dos iguales en memoria.

Para conseguir esto, se usa una DATA nCount que cuenta cuantos "clientes" estan compartiendo ese font. Si tu al cerrar un cliente, destruyes el font, entonces se lo estas destruyendo a todos los demas, y el font se verá mal.

Eso solo deberías usarlo al final de tu programa cuando vayas a salir y solo en los fonts que te hayan quedado. Y no debiera quedarte ninguno si los usas asi:

DEFINE FONT oFont ... ó reusa un oFont que tengas cargado previamente

DEFINE DIALOG oDlg FONT oFont

ACTIVATE DIALOG oDlg

oFont:End() // si era un font reusado, NO debes llamar a :End()

esta es la secuencia correcta. Si haces eso, no tiene porque quedarte ningun font sin liberar.

regards, saludos

Antonio Linares
www.fivetechsoft.com