Page 2 of 2

Re: Liberar BMP y FONT

PostPosted: Sat Aug 03, 2013 2:35 pm
by rolando
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: Select all  Expand view
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 :D

Re: Liberar BMP y FONT

PostPosted: Sat Aug 03, 2013 2:42 pm
by rolando
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 :D

Re: Liberar BMP y FONT

PostPosted: Sat Aug 03, 2013 6:34 pm
by Antonio Linares
Rolando,

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

Code: Select all  Expand view
#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

Re: Liberar BMP y FONT

PostPosted: Sat Aug 03, 2013 8:44 pm
by rolando
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: Select all  Expand view
oDlg:setfont(oFont)


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

Code: Select all  Expand view
oDlg:oFont:=oFnt


Si quieres puedes probarlo:

Code: Select all  Expand view
#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 :D

Re: Liberar BMP y FONT

PostPosted: Sun Aug 04, 2013 5:56 pm
by cnavarro
Antonio

Como puedo liberar un Brush que genera el MSLogo?
Code: Select all  Expand view

       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: Select all  Expand view

       MsgLogo(".\Bmps\portada512.bmp", 2 )                    //  ---> Linea 350
 


Saludos

Re: Liberar BMP y FONT

PostPosted: Sun Aug 04, 2013 10:23 pm
by rolando
Buenas tardes,

Encontré que:

--> Si uso:
Code: Select all  Expand view
oDlg:setfont(oFnt)
oBrw:setfont(oFnt)
oLbx:setfont(oFnt)
 

El oFnt:end() NO cierra el font.




--> En cambio si uso:

Code: Select all  Expand view
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 :D

Re: Liberar BMP y FONT

PostPosted: Sun Aug 04, 2013 10:59 pm
by cnavarro
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

Re: Liberar BMP y FONT

PostPosted: Mon Aug 05, 2013 2:09 am
by rolando
.

¡¡¡ 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: Select all  Expand view
aBitmaps:= {LoadBitmap (GetResources(),"CHECKON") , LoadBitmap (GetResources(),"CHECKOFF") }

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

Gracias

Rolando :D

Re: Liberar BMP y FONT ->> SOLUCIONADO

PostPosted: Mon Aug 05, 2013 4:29 am
by cuatecatl82
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: Select all  Expand view

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: Select all  Expand view

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: Select all  Expand view

oDlg:oFont   := oFontCom10
oBtn1:oFont  := oFontTaB16
oBtn2:oFont  := oFontTaB16

 

y las libero después del Activate

Code: Select all  Expand view

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..

Re: Liberar BMP y FONT ->> SOLUCIONADO

PostPosted: Mon Aug 05, 2013 8:29 am
by elvira
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: Select all  Expand view
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 ;).

Re: Liberar BMP y FONT

PostPosted: Wed Aug 07, 2013 6:26 pm
by cnavarro
cnavarro wrote:Antonio

Como puedo liberar un Brush que genera el MSLogo?
Code: Select all  Expand view

       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: Select all  Expand view

       MsgLogo(".\Bmps\portada512.bmp", 2 )                    //  ---> Linea 350
 


Saludos


+1

Re: Liberar BMP y FONT ->> SOLUCIONADO

PostPosted: Fri Aug 09, 2013 7:25 am
by Antonio Linares
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: Select all  Expand view
#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.

Re: Liberar BMP y FONT ->> SOLUCIONADO

PostPosted: Fri Aug 09, 2013 7:30 am
by Antonio Linares
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,

Re: Liberar BMP y FONT ->> SOLUCIONADO

PostPosted: Fri Aug 09, 2013 3:41 pm
by cnavarro
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