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
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 02:35 PM
Antonio,

Perdón por no ser más explícito.

Me refiero a lo indicado por el checkres:

65 BMP 67442497 (b)LISTOTRABAJOSXBRO 2313

O sea que no cierra un bmp al salir del dialog.

Tu me consultaste: "Puedes mostrar el código de la línea 2313 ?"

Y, esta es la línea en cuestión:

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()) )


gracias.

Rolando :-)
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Sat Aug 03, 2013 02:42 PM
Antonio,

Uso como lo explicas, pero son dialogs NOWAIT. Cuando los cierro, SOLAMENTE los fonts de los dialogs quedan sin cerrar. A estos fonts exclusivamente les aplico esta función y los cierra. No entiendo el porqué, ¿quizás porque son dialogs NOWAIT?, pero la cuestión es que a estos fonts no los cierra si no le aplico esta función.

Gracias.

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

Este ejemplo aqui funciona correctamente, por favor pruébalo, gracias:

Code (fw): Select all Collapse
#include "FiveWin.ch"

function Main()

   local oDlg, oFont

   SetResDebug( .T. )

   DEFINE FONT oFont NAME "Verdana" SIZE 0, -12

   DEFINE DIALOG oDlg FONT oFont

   ACTIVATE DIALOG oDlg NOWAIT CENTERED

   MsgInfo( "a non modal dialog" )

   oDlg:End()
   
   oFont:End()

   CheckRes()
   WinExec( "notepad checkres.txt" )

return nil
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 08:44 PM
Antonio,

Probé el ejemplo como lo sugieres y por supuesto que funciona. Lamentablemente la aplicación que desarrollé es muchísimo más compleja.

Como dije tengo los dialogs en una DLL.

Desde una window principal, se llama por menú a un dialog, desde este se llama a otro dialog NOWAIT y, desde este último dialog NOWAIT se llama a otros dialogs NOWAIT. Todo esto rodeado de infinidad de botones, brushes, etc.. Lo que trato de plasmar es que es bastante complejo todo por la cantidad de controles de los dialogs.

Lo único que me dio resultado para cerrar los fonts de los DLGs, es ejecutar la función que sugeriste en uno de los post.

Voy a seguir buscando y, si encuentro la solución, comentaré al respecto. Igual me queda todavía encontrar porque no cierrar algunos BMP's.

Como curiosidad te comento que cambiando un poco el PRG que mandaste y asignandole el font de la manera que sugeriste:

Code (fw): Select all Collapse
oDlg:setfont(oFont)


No cierra el oFont, pero si lo hace cuando lo asigno de la manera que lo hacía antes:

Code (fw): Select all Collapse
oDlg:oFont:=oFnt


Si quieres puedes probarlo:

Code (fw): Select all Collapse
#include "FiveWin.ch"

function Main()

   local oDlg, oFont

   SetResDebug( .T. )

   DEFINE FONT oFont NAME "Verdana" SIZE 0, -12

  // DEFINE DIALOG oDlg FONT oFont

   DEFINE DIALOG oDlg //FONT oFont

      oDlg:setfont(oFont)

   ACTIVATE DIALOG oDlg NOWAIT CENTERED

   MsgInfo( "a non modal dialog" )

   oDlg:End()

   oFont:End()

   CheckRes()
   WinExec( "notepad checkres.txt" )

return nil


Gracias.

Rolando :-)
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Liberar BMP y FONT
Posted: Sun Aug 04, 2013 05:56 PM
Antonio

Como puedo liberar un Brush que genera el MSLogo?
Code (fw): Select all Collapse
       MsgLogo(".\Bmps\portada512.png", 2 )                    //  ---> Linea 350


Detalle del CheckRes:


04/08/2013 19:49:54: BRUSH,17830657,TDIALOG:SETCOLOR(2519)->TDIALOG:NEW(194)->MSGLOGO(14)->MAIN(350)


El mismo resultado con .bmp:
Code (fw): Select all Collapse
       MsgLogo(".\Bmps\portada512.bmp", 2 )                    //  ---> Linea 350


Saludos
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Sun Aug 04, 2013 10:23 PM
Buenas tardes,

Encontré que:

--> Si uso:
Code (fw): Select all Collapse
oDlg:setfont(oFnt)
oBrw:setfont(oFnt)
oLbx:setfont(oFnt)

El oFnt:end() NO cierra el font.




--> En cambio si uso:

Code (fw): Select all Collapse
oDlg:oFont:=oFnt
oBrw:oFont:=oFnt
oLbx:oFont:=oFnt

El oFnt:end() SI cierra el font.




--> Que en dialogos NOWAIT hay que hacer oFnt:end() dos veces, una en el valid y otra antes del return
para que el font sea cerrado (para el caso del font del oDlg)



Todavía tengo por revisar una gran parte del programa que no cierra recursos (la función que estoy revisando ahora, en el dialog tiene la friolera de 160 controles en uso), pero comencé rehaciendo de a poco la functión, agregando controles de a tres y controlando que se cierre el BMP que da como no cerrado y aumenta mucho los GDI ya que es la parte del programa que más se usa.
Supongo que así encontraré donde está el fallo.

Rolando :-)
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Liberar BMP y FONT
Posted: Sun Aug 04, 2013 10:59 PM
Por si sirve de referencia

En mi caso los Font de los FolderEx no eran liberados
Solo consegui liberarlos cuando los asignaba fuera del comando.
Tanto si los asignaba con DEFINE FOLDEREX oFld ... FONT oFont PIXEL, como si no lo asignaba en el comando, y cogia el Font del dialogo al que pertenecian.
Sin embargo si asignaba el Font con:
oFld:SetFont( oFont )
Si eran liberados sin necesidad de usar los valid

En mi caso no consigo liberar los botones del ribbon que son .png

Saludos
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Liberar BMP y FONT
Posted: Mon Aug 05, 2013 02:09 AM
.

¡¡¡ Solucionado !!!

Gracias a todos y especialmente a Antonio por las enseñanzas.

Comento que lo que faltaba resolver era el cerrado de un BMP. Cada vez que se abría una función con un dialog que contiene muchos controles, se iba guardando un bitmap muchas veces en memoria (cuatro por cada apertura) y, como este dialog es el más utilizado por la aplicación, la cuenta de GDI subía mucho llegando a veces a "bloquear" la aplicación (junto con otros objetos que tampoco cerraban pero pude solucionar fácilmente).

La cuestión era encontrar que era lo que indicaba el checkres()

65 BMP 67442497 (b)LISTOTRABAJOSXBRO 2313

Gracias a Antonio pude ver que la (b) se refiere a que la falla está en una función que es llamada, en este caso, por la línea 2313 de la función LISTOTRABAJOSXBRO. Está línea ponía en funcionamiento la Editorepa() que era en donde estaba la falla y era un
Code (fw): Select all Collapse
aBitmaps:= {LoadBitmap (GetResources(),"CHECKON") , LoadBitmap (GetResources(),"CHECKOFF") }

Que había dejado de usar y olvidé borrar.

Gracias

Rolando :-)
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Liberar BMP y FONT -&gt;&gt; SOLUCIONADO
Posted: Mon Aug 05, 2013 04:29 AM
Antonio
Como puedo liberar un Brush que genera el MSLogo?
Código: Seleccionar todo Expandir vista
MsgLogo(".\Bmps\portada512.png", 2 ) // ---> Linea 350

Detalle del CheckRes:
04/08/2013 19:49:54: BRUSH,17830657,TDIALOG:SETCOLOR(2519)->TDIALOG:NEW(194)->MSGLOGO(14)->MAIN(350)

Saludos


Maestro Antonio:

Misma duda, no todos los fonts son liberados, en mi caso estoy trabajando con la clase TGraph nativa de FW, el cual llama internamente a los fonts, lo mismo que con la clase TWindow:

checkres.txt

Code (fw): Select all Collapse
04/08/2013 23:02:00: FONT,1527386396,MAIN(82)
04/08/2013 23:02:00: FONT,201986268,MAIN(86)
04/08/2013 23:02:00: FONT,1292504950,TWINDOW:GETFONT(2731)->TWINDOW:NEW(847)->MAIN(92)
04/08/2013 23:02:00: FONT,302648543,TGRAPH:REDEFINE(295)->CONSUDSK(110)->MAIN(94)
04/08/2013 23:02:00: FONT,-1559621827,TGRAPH:REDEFINE(296)->CONSUDSK(110)->MAIN(94)


Así defino mis fuentes de la línea 80 a 87 de Main():

Code (fw): Select all Collapse
DEFINE FONT oFontArB16 NAME   "ARIAL"      BOLD SIZE 00, 16
DEFINE FONT oFontArB12 NAME   "ARIAL"      BOLD SIZE 00, 12
DEFINE FONT oFontAri10 NAME   "ARIAL"           SIZE 06, -10  //->No se Libera (82)
DEFINE FONT oFontCom10 NAME   "COMICS"     BOLD SIZE 00, 12
DEFINE FONT oFontTaB14 NAME   "TAHOMA"     BOLD SIZE 00, 14
DEFINE FONT oFontTaB16 NAME   "TAHOMA"     BOLD SIZE 00, 16
DEFINE FONT oFontMSS06 NAME   "MS SANS SERIF"   SIZE 00, 06  //->No se Libera (86)
DEFINE FONT oFontMSS13 NAME   "MS SANS SERIF"   SIZE 00, -13

DEFINE WINDOW   oWnd TITLE  "Catalogador de Discos"  //->No se Libera (92)
...


Las fuentes las establesco así:

Code (fw): Select all Collapse
oDlg:oFont   := oFontCom10
oBtn1:oFont  := oFontTaB16
oBtn2:oFont  := oFontTaB16

y las libero después del Activate

Code (fw): Select all Collapse
ACTIVATE WINDOW      oWnd MAXIMIZED

oFontMSS06:END()
oFontTaB14:END()
oFontTaB16:END()
oFontMSS13:END()
oFontArB16:END()
oFontAri10:END()
oFontArB12:END()
oFontCom10:END()

Return nil


Como liberar las fuentes cuendo son invocadas internamente por las clases de FW..?

Saludos..
Soluciones y Diseño de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Diseñador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 518
Joined: Fri Jun 29, 2012 12:49 PM
Re: Liberar BMP y FONT -&gt;&gt; SOLUCIONADO
Posted: Mon Aug 05, 2013 08:29 AM
Amigos,

Acabo de poner checkres en mi aplicación y me dice que los siguientes no son liberados, y son de controles internos de Fivewin:

Code (fw): Select all Collapse
05-08-2013 10:21:03: FONT,-838200666,TWINDOW:GETFONT(2752)->TWINDOW:NEW(851)->MAIN(274)
    
    
05-08-2013 10:21:03: FONT,621417608,TRICHEDIT:REDEFINE(391)->ALTAS(350)


05-08-2013 10:25:21: BRUSH,-451931077,TRPANEL:REGISTER(691)->TRPANEL:NEW(51)->TRIBBONBAR:NEW(355)->MAIN(285)
    
05-08-2013 10:25:21: BMP,1694831359,TBITMAP:REDEFINE(497)->ACTIVARPROGRAMA(305)
    
05-08-2013 10:25:21: FONT,1175065340,TURLLINK:REDEFINE(105)->ACTIVARPROGRAMA(315)



¿No se supone que antes de salir Fivewin debería liberar todo automáticamente?.

Muy agradecida :-).
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Liberar BMP y FONT
Posted: Wed Aug 07, 2013 06:26 PM
cnavarro wrote:Antonio

Como puedo liberar un Brush que genera el MSLogo?
Code (fw): Select all Collapse
       MsgLogo(".\Bmps\portada512.png", 2 )                    //  ---> Linea 350


Detalle del CheckRes:


04/08/2013 19:49:54: BRUSH,17830657,TDIALOG:SETCOLOR(2519)->TDIALOG:NEW(194)->MSGLOGO(14)->MAIN(350)


El mismo resultado con .bmp:
Code (fw): Select all Collapse
       MsgLogo(".\Bmps\portada512.bmp", 2 )                    //  ---> Linea 350


Saludos


+1
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT -&gt;&gt; SOLUCIONADO
Posted: Fri Aug 09, 2013 07:25 AM
La función MsgLogo() usa un diálogo no modal, que para que se cierre adecuadamente ha de ser llamado desde una ventana principal, ó se inicia un proceso de cierre de la aplicación (si solo hay una ventana y se cierra, Windows inicia el proceso de cierre de la aplicación) y en este caso, parece ser que el VALID de la caja de diálogo no modal no se evalúa. Aqui hay un ejemplo real de uso de MsgLogo() desde una aplicación y podeis comprobar como limpia correctamente todo:

Code (fw): Select all Collapse
#include "fivewin.ch"

Static MainWnd

Function Main()

   SetResDebug( .T. )

   DEFINE WINDOW MainWnd FROM 1, 1 TO 22, 75 ;
      TITLE "Test" ;
      MENU BuildMenu()
      
   ACTIVATE WINDOW MainWnd MAXIMIZED ;
      VALID MsgYesNo( "Want to end ?" )
   
   FErase( "checkres.txt" )
   CheckRes()
   WinExec( "notepad checkres.txt" )
   
Return NIL

Function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Try" ACTION Try( )

      MENUITEM "E&xit" ACTION MainWnd:End()
   ENDMENU
   
Return oMenu

Function Try()

   Local oDlg

   DEFINE DIALOG oDlg TITLE "Non modal dialog"
   
   @ 2, 2 BUTTON "&End" OF oDlg ACTION oDlg:End( )
   
   ACTIVATE DIALOG oDlg CENTERED NOWAIT ;
      VALID MsgYesNo( "Want to close it ?" )

return NIL


Tambien comentar que los recursos que muestra checkres.txt son liberados por FWH al cerrar la aplicación. Es decir, CheckRes() nos informa de lo que quedó y que FWH tuvo que liberar de forma automática.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Liberar BMP y FONT -&gt;&gt; SOLUCIONADO
Posted: Fri Aug 09, 2013 07:30 AM

Elvira,

FWH crea una serie de recursos, que luego han podido reutilizarse en la aplicación y variar asi su contador de uso, y de aqui el no ser liberados correctamente. Por supuesto, tambien pudiera ser un fallo de FWH a localizar y arreglar, pero llevamos mucho tiempo probando y controlando esto en FWH, aún asi para eso estan estas funciones para ayudarnos a mejorar la aplicación :-)

Es necesario un pequeño ejemplo, como el que yo he proporcionado, que reproduzca la pérdida. Gracias,

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Liberar BMP y FONT -&gt;&gt; SOLUCIONADO
Posted: Fri Aug 09, 2013 03:41 PM

Antonio
Tenia usted toda la razon. La pérdida será debida a otro brush que tenga en la aplicacion pero aparecia el mensaje que adjunté y eso me despistó.
He hecho un ejemplo pequeño con una MDICHILD y el MSGLOGO y el fichero checkres.txt aparece vacio.
Inclui en la ventana un BRUSH y no lo cerré despues del ACTIVATE y aparecía el mismo mensaje que puse en mi pregunta anterior
Añadí el oBrush:End() y el checkres.txt aparece vacio.
Gracias una vez mas
Saludos

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces

Continue the discussion