FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Brush en Browse
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Brush en Browse
Posted: Tue Feb 14, 2012 09:50 AM
Tengo un pequeño xbrowse que se dibuja dentro de un folder, no ocupa todo el folder sólo lo redefinido en el recurso "oBrw:CreateFromResource( 120 )"

Este browse, que toma los datos de un array, se actualiza en tiempo de ejecución según una serie de condiciones.

Cada vez que se tiene que actulizar el browse llamo a:
oBrw:SetArray( aArr )

He detectado, con checkres(), que no se limpia el brush asignado al browse.
Code (fw): Select all Collapse
...
BRUSH,1594890193,TGHE_XBROWSE:INITIATE(882)->__OBJSENDMSG(0)->HB_EXECFROMARRAY(0)->OSEND(219)->HB_EXECFROMARRAY(0)->ASEND(197)->TDIALOG:INITIATE(638)->TDIALOG:ACTIVATE(298)->TFOLDER:DEFAULT(406)->TFOLDER:INITIATE(341)->__OBJSENDMSG(0)->HB_EXECFROMARRAY(0)->OSEND(219)->HB_EXECFROMARRAY(0)->ASEND(197)->TDIALOG:INITIATE(638)->TDIALOG:ACTIVATE(298)->TGHE_EDITDAT:ONINIT(1695)->(b)TGHE_EDITDAT:ACTIVATE(199)->TWINDOW:ACTIVATE(973)->TMDICHILD:ACTIVATE(248)->TGHE_EDITDAT:ACTIVATE(199)->ARTICULO(77)->PS_ACTION(37)->(b)LARTICULO(22)->TGHE_BUSQ:EJECUTAR(518)->(b)TGHE_BUSQ:BUILDCONTROLS(393)->TBTNBMP:CLICK(465)->TGHE_BUSQ:KEYDOWN(684)->(b)TGHE_BUSQ:ACTIVATE(286)->TGHE_XBROWSE:LDBLCLICK(3560)->TWINDOW:HANDLEEVENT(0)->TCONTROL:HANDLEEVENT(1699)->TGHE_XBROWSE:HANDLEEVENT(11634)->_FWH(3159)->WINRUN(0)->TMDIFRAME:ACTIVATE(980)->MAIN(60)
...

Así que cada vez que llamo a SetArray(), deja el anterior brush sin cerrar.

Revisando el código de la clase xbrowse e visto como solucionarlo
En el método Adjust se crea el nuevo brush pero no se elimina el anterior
Code (fw): Select all Collapse
...
if ::hBrushRecSel<>NIL //fgondi
   DeleteObject( ::hBrushRecSel )
endif
::hBrushRecSel := CreateSolidBrush( ::nRecSelColor )
...
Un saludo

Fernando González Diez

ALSIS Sistemas Informáticos
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Brush en Browse
Posted: Tue Feb 14, 2012 07:15 PM

Por ahí digo una tontería pero para actualizar el array en un xbrowse la intruccion que yo uso es oBrw : aArrayData := aArray y funciona perfectamente. Salu2

Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Brush en Browse
Posted: Tue Feb 14, 2012 09:33 PM

Horacio,

Además de ::aArrayData := aArray tendrás que refrescar el browse
y dependiendo de las condiones del nuevo array y de como tengas defino el browse (ej. WIN7) tendrás que llamar a Adjust()

Por lo que al final es lo mismo, ya que setarray() y si ya estan difinidas las columnas establece el nuevo array y llama a Adjust y Refresh.
Y tengo el problema en el método Adjust().

No es un error, sólo es que el no vacia el antiguo brush, por lo que a medida se usa el sistema se va cargando los recursos.

Un saludo

Fernando González Diez

ALSIS Sistemas Informáticos
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 03:34 PM

Fer,
yo detecte con el checkres que se queda en memoria la imagen que pongo de fondo en el xbrowse...
y como comentas el 90% de los xbrowse que tengo en el sistema usan imagenes de fondo, asi que pues con el uso continuo los recursos se consumen rapido, voy a probar tu solucion a ver si me funciona, por aqui esta mi post...

viewtopic.php?f=6t=23502start=15
saludos
paco

&&

____________________

Paco
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 05:08 PM

Parece que ya solucioné modificando la clase Destroy() de la xbrowse agregando estas lineas,

if ::oBrush:hBitmap != 0 .and. ValType( ::oBrush:Cargo ) == 'N'
DeleteObject( ::oBrush:hBrush )
endif

nomas que lo confirme Antonio a ver si es correcto
saludos
paco

____________________

Paco
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 08:04 PM

Hola Francisco.
Que version usas?. Yo uso la Ver. 1006 y tengo el mismo problema.

Mi version tiene este codigo en el METHOD DESTROY():

if ::oBrush:hBitmap != 0 .and. ValType( ::oBrush:Cargo ) == 'N' .and. ;
::oBrush:hBrush != ::oBrush:Cargo
// resized brush
DeleteObject( ::oBrush:Cargo )
endif

Estos no los elimina:
DEFINE BRUSH oBrush FILENAME cBrush
DEFINE FONT oFont NAME "MS SANS SERIF" SIZE 0, -10 BOLD
DEFINE FONT oFont2 NAME "MS SANS SERIF" SIZE 0, -14 BOLD
oBrw:SetBackGround(".\STONE.BMP")

Al salir, hago esto:
oFont:End() //esta no la elimina
oFont2:End() //esta SI
oBrush:End() //este tampoco

Este es el CheckRes.txt
21/02/2012 14:02:48: BRUSH,-1693446056,TBITMAP:SETCOLOR(2462)->TBITMAP:DEFINE(265)->MAIN(101)

21/02/2012 14:02:48: FONT,-1861610563,MAIN(102)

21/02/2012 14:02:48: BMP,117773251,TMDIFRAME:HANDLEEVENT(0)->_FWH(3391)->SHOWWINDOW(0)->TMDIFRAME:ACTIVATE(959)->MAIN(130)

21/02/2012 14:02:48: BMP,923079686,TMSGBAR:PAINT(428)->TMSGBAR:HANDLEEVENT(0)->_FWH(3391)->UPDATEWINDOW(0)->TMDIFRAME:ACTIVATE(960)->MAIN(130)

21/02/2012 14:02:48: FONT,-1794501682,CREDITOS(80)->(b)MAIN(109)->TBTNBMP:CLICK(463)->TBTNBMP:LBUTTONUP(658)->TWINDOW:HANDLEEVENT(0)->TCONTROL:HANDLEEVENT(1483)->TBTNBMP:HANDLEEVENT(1437)->_FWH(3391)->WINRUN(0)->TMDIFRAME:ACTIVATE(976)->MAIN(130)

21/02/2012 14:02:48: BMP,1929712564,CREDITOS(346)->(b)MAIN(109)->TBTNBMP:CLICK(463)->TBTNBMP:LBUTTONUP(658)->TWINDOW:HANDLEEVENT(0)->TCONTROL:HANDLEEVENT(1483)->TBTNBMP:HANDLEEVENT(1437)->_FWH(3391)->WINRUN(0)->TMDIFRAME:ACTIVATE(976)->MAIN(130)

21/02/2012 14:02:48: BRUSH,672142353,TXBROWSE:SETBACKGROUND(4799)->CREDITOS(346)->(b)MAIN(109)->TBTNBMP:CLICK(463)->TBTNBMP:LBUTTONUP(658)->TWINDOW:HANDLEEVENT(0)->TCONTROL:HANDLEEVENT(1483)->TBTNBMP:HANDLEEVENT(1437)->_FWH(3391)->WINRUN(0)->TMDIFRAME:ACTIVATE(976)->MAIN(130)

21/02/2012 14:02:48: ====================================================================================================

Talvez Antonio tenga tiempo y nos ayuda con esto.

Saludos.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 09:24 PM

Francisco,

El cambio que le hice a la Destroy() no es igual a la que usas, prueba a dejarla como la muestro a ver si te funciona.. utilizo la 1103,
prueba a usar:
deleteobject( oFont )
deleteobject( oBrush )

de hecho si es un rollo, revisar que objetos se te quedan en memoria, yo revise nuevamente todo el sistema por partes, y tumbe 6 font que como me hicieron batallar, pero ya lsa saque, unicamente hay una FONT que no me mata y se el proceso que la genera, pero no le veo nada anormal, es una impresion, la compare con otra impresion igual pero con datos diferentes y no la finaliza.
Te recomiendo que revises parate por parte lo que picas, es entrar y salir muchas veces, pero asi lo detectaras rapido.
Lo que pudiera ser que tuvieras un RETURN antes del finalizar tu dialogo donde cargas las font y no las finalices, y parece que la btnbmp y msgbar por ahi traes el problema con unas imagenes y una font..
ese es mi punto de vista...
a ver si Antonio no echa una pista..
saludos
paco

____________________

Paco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 09:55 PM
fgondi wrote:Tengo un pequeño xbrowse que se dibuja dentro de un folder, no ocupa todo el folder sólo lo redefinido en el recurso "oBrw:CreateFromResource( 120 )"

Este browse, que toma los datos de un array, se actualiza en tiempo de ejecución según una serie de condiciones.

Cada vez que se tiene que actulizar el browse llamo a:
oBrw:SetArray( aArr )

He detectado, con checkres(), que no se limpia el brush asignado al browse.
Code (fw): Select all Collapse
...
BRUSH,1594890193,TGHE_XBROWSE:INITIATE(882)->__OBJSENDMSG(0)->HB_EXECFROMARRAY(0)->OSEND(219)->HB_EXECFROMARRAY(0)->ASEND(197)->TDIALOG:INITIATE(638)->TDIALOG:ACTIVATE(298)->TFOLDER:DEFAULT(406)->TFOLDER:INITIATE(341)->__OBJSENDMSG(0)->HB_EXECFROMARRAY(0)->OSEND(219)->HB_EXECFROMARRAY(0)->ASEND(197)->TDIALOG:INITIATE(638)->TDIALOG:ACTIVATE(298)->TGHE_EDITDAT:ONINIT(1695)->(b)TGHE_EDITDAT:ACTIVATE(199)->TWINDOW:ACTIVATE(973)->TMDICHILD:ACTIVATE(248)->TGHE_EDITDAT:ACTIVATE(199)->ARTICULO(77)->PS_ACTION(37)->(b)LARTICULO(22)->TGHE_BUSQ:EJECUTAR(518)->(b)TGHE_BUSQ:BUILDCONTROLS(393)->TBTNBMP:CLICK(465)->TGHE_BUSQ:KEYDOWN(684)->(b)TGHE_BUSQ:ACTIVATE(286)->TGHE_XBROWSE:LDBLCLICK(3560)->TWINDOW:HANDLEEVENT(0)->TCONTROL:HANDLEEVENT(1699)->TGHE_XBROWSE:HANDLEEVENT(11634)->_FWH(3159)->WINRUN(0)->TMDIFRAME:ACTIVATE(980)->MAIN(60)
...

Así que cada vez que llamo a SetArray(), deja el anterior brush sin cerrar.

Revisando el código de la clase xbrowse e visto como solucionarlo
En el método Adjust se crea el nuevo brush pero no se elimina el anterior
Code (fw): Select all Collapse
...
if ::hBrushRecSel<>NIL //fgondi
   DeleteObject( ::hBrushRecSel )
endif
::hBrushRecSel := CreateSolidBrush( ::nRecSelColor )
...


Fernando,

Muchas gracias, incluido para el próximo build 12.02 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 09:59 PM
Francisco Horta wrote:Parece que ya solucioné modificando la clase Destroy() de la xbrowse agregando estas lineas,

if ::hBitmap != 0 .and. ValType( ::Cargo ) == 'N'
DeleteObject( ::hBrush )
endif

nomas que lo confirme Antonio a ver si es correcto
saludos
paco


Paco,

La forma correcta sería:

Code (fw): Select all Collapse
   if ::oBrush:hBitmap != 0 .and. ValType( ::oBrush:Cargo ) == 'N'
      ::oBrush:End()
   endif


puesto que los brushes en FWH son reusables desde distintos objetos, y no podemos destruirlos directamente pues pueden estar aun en uso
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 10:04 PM
FranciscoA wrote:
Estos no los elimina:
DEFINE BRUSH oBrush FILENAME cBrush
DEFINE FONT oFont NAME "MS SANS SERIF" SIZE 0, -10 BOLD
DEFINE FONT oFont2 NAME "MS SANS SERIF" SIZE 0, -14 BOLD
oBrw:SetBackGround(".\STONE.BMP")

Al salir, hago esto:
oFont:End() //esta no la elimina
oFont2:End() //esta SI
oBrush:End() //este tampoco


Paco,

Si no se eliminan es porque se han asignado más veces de las debidas y su contador de uso no está a 1. Lo puedes comprobar llamando varias veces a :End():

Code (fw): Select all Collapse
   while oFont:nCount > 0
      oFont:End()
   end

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

Antonio Linares
www.fivetechsoft.com
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: Brush en Browse
Posted: Tue Feb 21, 2012 10:21 PM
Antonio,
Gracias por tu apoyo..
probando la clase tfolderex de mi sistema le asigno font y estas se quedaban en memoria
lo soluciones corrigiendo el metodo Destroy()

METHOD Destroy() INLINE AEval( ::aBitmaps, {| hBmp, nId | DeleteObject( hBmp[ BMP_HANDLE] ) } ), ;
AEval( ::aBrightBmp, {| hBmp, nId | DeleteObject( hBmp ) } ), ::End(), Super:Destroy()

Es correcto?
gracias
paco
____________________

Paco
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Brush en Browse
Posted: Wed Feb 22, 2012 08:47 AM
Antonio,

¿ Podrías, por favor, decirme qué significa "más veces de las debidas" en:

Antonio Linares wrote:
Si no se eliminan es porque se han asignado más veces de las debidas...
?


Saludos

Continue the discussion