Brush en Browse

Post Reply
User avatar
fgondi
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Brush en Browse

Post by fgondi »

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

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

...
if ::hBrushRecSel<>NIL //fgondi
   DeleteObject( ::hBrushRecSel )
endif
::hBrushRecSel := CreateSolidBrush( ::nRecSelColor )
...
 
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
horacio
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Brush en Browse

Post by horacio »

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
User avatar
fgondi
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: Brush en Browse

Post by fgondi »

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

Re: Brush en Browse

Post by Francisco Horta »

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

Post by Francisco Horta »

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

Re: Brush en Browse

Post by FranciscoA »

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

Re: Brush en Browse

Post by Francisco Horta »

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
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Brush en Browse

Post by Antonio Linares »

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

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

...
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: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Brush en Browse

Post by Antonio Linares »

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


   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: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Re: Brush en Browse

Post by Antonio Linares »

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


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

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

Antonio Linares
www.fivetechsoft.com
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Re: Brush en Browse

Post by Francisco Horta »

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
hmpaquito
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Brush en Browse

Post by hmpaquito »

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
Post Reply