Liberar BMP y FONT ->> SOLUCIONADO

Liberar BMP y FONT ->> SOLUCIONADO

Postby rolando » Fri Aug 02, 2013 1: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: Select all  Expand view  RUN
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 :D
Last edited by rolando on Mon Aug 05, 2013 2:10 am, edited 2 times in total.
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP

Postby Antonio Linares » Fri Aug 02, 2013 7: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP

Postby rolando » Fri Aug 02, 2013 2: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: Select all  Expand view  RUN
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: Select all  Expand view  RUN
define font oFnt NAME "Arial" size 0,-13


Luego de definir el dialog le asigno el font así:
Code: Select all  Expand view  RUN
oDlg:oFont:=oFnt


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

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP y FONT

Postby Antonio Linares » Fri Aug 02, 2013 6: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby Antonio Linares » Fri Aug 02, 2013 6: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby rolando » Fri Aug 02, 2013 6:49 pm

Antonio:

Probé como indicas:
Code: Select all  Expand view  RUN
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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP y FONT

Postby Antonio Linares » Fri Aug 02, 2013 8: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: Select all  Expand view  RUN
  METHOD Destroy() INLINE If( ! Empty( ::hBitmap ), DeleteObject( ::hBitmap ),),;
                           ::Super:Destroy()


Code: Select all  Expand view  RUN
METHOD HasAlpha() INLINE ;
                      ::lHasAlpha := If( ! Empty( ::hBitmap ), HasAlpha( ::hBitmap ), .F. )


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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby rolando » 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: Select all  Expand view  RUN
if ! Empty( cBitmap )
      ::hBitmap   = If( File( ::cBitmap ), ReadBitmap( 0, ::cBitmap ),;
                        LoadBitmap( GetResources(), ::cBitmap ) )
   endif


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


Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP y FONT

Postby FranciscoA » Sat Aug 03, 2013 3:38 am

rolando wrote:Debo aclarar que los diálogos que uso son desde recursos en una DLL y son todos NOWAIT.
Rolando :D


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
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Liberar BMP y FONT

Postby Antonio Linares » Sat Aug 03, 2013 6:15 am

Rolando,

esto puede servirte:

while oFont:nCount > 0
oFont:End()
end
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby rolando » 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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP y FONT

Postby Antonio Linares » Sat Aug 03, 2013 1: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby rolando » Sat Aug 03, 2013 2:21 pm

Antonio,

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

Code: Select all  Expand view  RUN
Function LiberoFont(oFonte)
  while oFonte:nCount > 0
    oFonte:End()
  end
Return nil


A la que llamo en el valid:

Code: Select all  Expand view  RUN
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: Select all  Expand view  RUN
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: Select all  Expand view  RUN
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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Liberar BMP y FONT

Postby Antonio Linares » Sat Aug 03, 2013 2: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Liberar BMP y FONT

Postby Antonio Linares » Sat Aug 03, 2013 2: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42120
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 37 guests