Brush en Browse

Brush en Browse

Postby fgondi » Tue Feb 14, 2012 9: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: Select all  Expand view  RUN
...
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: Select all  Expand view  RUN
...
if ::hBrushRecSel<>NIL //fgondi
   DeleteObject( ::hBrushRecSel )
endif
::hBrushRecSel := CreateSolidBrush( ::nRecSelColor )
...
 
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Brush en Browse

Postby horacio » Tue Feb 14, 2012 7: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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Brush en Browse

Postby fgondi » Tue Feb 14, 2012 9: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
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Brush en Browse

Postby Francisco Horta » Tue Feb 21, 2012 3: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=6&t=23502&start=15
saludos
paco
____________________
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Brush en Browse

Postby Francisco Horta » Tue Feb 21, 2012 5: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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Brush en Browse

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

Re: Brush en Browse

Postby Francisco Horta » Tue Feb 21, 2012 9: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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Brush en Browse

Postby Antonio Linares » Tue Feb 21, 2012 9: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: Select all  Expand view  RUN
...
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: Select all  Expand view  RUN
...
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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Brush en Browse

Postby Antonio Linares » Tue Feb 21, 2012 9:59 pm

Francisco Horta wrote: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,

La forma correcta sería:

Code: Select all  Expand view  RUN

   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
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Brush en Browse

Postby Antonio Linares » 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: Select all  Expand view  RUN

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

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

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

Re: Brush en Browse

Postby Francisco Horta » 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 ) } ), ::oFont:End(), Super:Destroy()

Es correcto?
gracias
paco
____________________
Paco
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Brush en Browse

Postby hmpaquito » Wed Feb 22, 2012 8: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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: FiveWiDi and 104 guests