Page 1 of 1

Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Wed Jan 25, 2012 7:31 am
by JmGarcia
Quisiera cambiar, en tiempo de ejecución, el bmp de un bottonBMP segun un criterio deseado.

Este código fuente me da error en ejecución:

Code: Select all | Expand

Ok:=.T.
@ 35*25+5,225 BTNBMP OkBtn NAME "Ok_rojo" SIZE 20,20 OF ::oWndChild PIXEL ;
ACTION {Ok:=(.not.Ok),iif(Ok,OkBtn:cResName1:="Ok_rojo",OkBtn:cResName1:="Ok_verde"),OkBtn:Refresh()}

Fichero RC:
Ok_rojo BITMAP "ok_rojo.bmp"
Ok_verde BITMAP "ok_verde.bmp"

Me da este error:
Error description: Warning BASE/1004 Message not found: TBTNBMP:OK

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Wed Jan 25, 2012 11:09 am
by Bayron

Code: Select all | Expand


oBtnF[x]:SetFile( ltrim(Camino + 'graficos\botones\brush\' + botonfam->nombre) )
obtnF[x]:cCaption:= AllTrim(familia->texto_tecl)
oBtnF[x]:oFont:= oFont1
oBtnF[x]:Refresh()

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Wed Jan 25, 2012 12:20 pm
by JmGarcia
Gracias por tu ayuda pero no entiendo lo de [x]
Los BMPs los tengo en recursos ¿ valdría ? oBtnF[x]:SetFile("ok_verde.bmp")
¿ Que significa ? obtnF[x]:cCaption:= AllTrim(familia->texto_tecl) y oBtnF[x]:oFont:= oFont1

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Wed Jan 25, 2012 12:48 pm
by Daniel Garcia-Gil
JmGarcia

Supongo que "obtnF" es un array de objetos y los accede por medio de la variable "x"

viendo el titulo de tu post, no concuerda con el codigo de tu ejemplo, porque existe una clase ButtonBMP y una Clase BTNBMP...

Como expreso en mi firma, nuestra mejor documentacion es el codigo fuente, yo en lo personal cuando tengo que trabajar con una clase (incluso con las que yo mismo he diseñado), mantengo la clase abierta en el editor para recordar todas sus propiedades y metodos, de esa forma mantengo a la mano todas las caracteristicas del objeto, esto lo puedo llamar una "tecnica" para programar, como puedes ver todo lo tenemos a nuestro alcance y es mas facil que lo que nos imaginamos, espero te sirva este simple consejo

ahora abriendo el archivo btnbmp.prg, podemos examiarlo y estudiar sus metodos, que tienen nombres bastante intuitivos para un mejor entendimiento de lo que hacen

oBtn:SetFile( "ruta_nombre_imagen_para_buttonup", "ruta_nombre_imagen_para_buttondown" ) // para imagenes en disco

para ti ese metodo no sirve, pues lo necesitas desde recurso

existe otro metodo llamado LoadBitmaps( cResName1, cResName2, cBmpFile1, cBmpFile2, cResName3, cBmpFile3, cResName4, cBmpFile4 )
alli podemos ver cuales son los parametros usados para el nombre de los recurso y el usado para lso archivos

para los recursos son los parametros 1, 2, 5 y 7

el codigo del metodo nos dice para que son cada uno de esos parametros
cResName1 = Button Up (imagen en estado normal )
cResName2 = Button Down (imagen cuando se tiene el boton del mouse abajo )
cResName3 = imagen cuando el boton esta en estado "disable"
cResName4 = imagen cuando el mouse pasa sobre el boton

Nota... es importante antes de asignar nuevas imagenes, liberar las imagenes anteriores primero usa FreeBitmaps()

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Thu Jan 26, 2012 8:09 am
by JmGarcia
Daniel Garcia-Gil wrote:viendo el titulo de tu post, no concuerda con el codigo de tu ejemplo, porque existe una clase ButtonBMP y una Clase BTNBMP...
Quería decir Botón BMP en vez de BottonBMP.
Desconocía que hubiera dos clases BTNBMP y ButtonBMP y he empezado por querer usar la primera.

Sea como fuere tu explicación es estupenda pero me encuentro en la texitura de no saber cual usar.

Voy a tratar de explicarme.
Necesito un botón con clausula ACTION donde al pulsarlo pueda hacer algunas cosas. Ese boton en principio nace con un bmp con forma de aspa roja, al pulsarlo quiero cambiarlo a un aspa (o similar) de color verde. Es decir quiero cambiar el bmp en tiempo de ejecución. Además este bmp tiene que estar en recursos (en un RC).

¿ Podrías ponerme un pequeño código fuente de como sería ?

Desde ya muchas gracias por tu ayuda, por vuestra ayuda.

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Thu Jan 26, 2012 6:10 pm
by carlos vargas
este ejemplo sta aplicado a una toolbar que contiene botones btnbmp, puede ser facilmente
implementado en botones solitarios.

Code: Select all | Expand


/*-------------------------------------------------------------------------------------------------*/
/*procedimiento que muestra toolbar en dialogo*/
PROCEDURE Clientes_Toolbar()
   LOCAL oToolbar

   DEFINE BUTTONBAR oToolBar OF oDlg SIZE 70, 60 2010

   DEFINE BUTTON NAME "TB_CLOSE"       OF oToolBar ACTION oDlg:END()                 PROMPT "&Salir"
   DEFINE BUTTON NAME "TB_ADD"         OF oToolBar ACTION Clientes_Editar( TRUE  )   PROMPT "&Nuevo"      GROUP
   DEFINE BUTTON NAME "TB_EDIT"        OF oToolBar ACTION Clientes_Editar( FALSE )   PROMPT "&Editar"
   DEFINE BUTTON NAME "TB_DELETE"      OF oToolBar ACTION Clientes_Borrar()          PROMPT "&Borrar"
   DEFINE BUTTON NAME "TB_SEARCH"      OF oToolBar ACTION Clientes_BuscarXPrestamo() PROMPT "B&uscar"
   DEFINE BUTTON NAME "TB_EXPORTXLS"   OF oToolBar ACTION Clientes_Exportar()        PROMPT "&Exportar"   GROUP
   DEFINE BUTTON NAME "TB_PRINTER"     OF oToolBar ACTION Clientes_Listar()          PROMPT "&Imprimir"
   DEFINE BUTTON NAME "TB_TABLESMONEY" OF oToolBar ACTION Clientes_Prestamos()       PROMPT "&Prestamos"  GROUP
   DEFINE BUTTON NAME "TB_FILTERADD"   OF oToolBar ACTION Clientes_FiltroAplicar()   PROMPT "&Filtrar"    GROUP


   /*muestra barra de estado*/
   SET MSGBAR OF oDlg TO "INS=Nuevo, DEL=Borrar, ENTER=Editar, F2=Prestamos, F3=Buscar, F4=Filtrar, F5=Imprimir, F8=Exportar, F9=Refrescar" 2010

   oDlg:SetControl( oBrw )
   oBrw:nTop    += 1
   oBrw:nHeight -= 1

   oToolBar:bRClicked := {|| TRUE }
   oToolBar:bLClicked := {|| TRUE }

   /*objeto boton para manejar boton del filtro*/
   oBtnFilter := oToolbar:aControls[ 9 ] /*aca tomo el control no. 9 del arreglo aControls que todo control contenedor tiene*/

RETURN
 

Code: Select all | Expand


   /*si selecciono filtrar info*/
   IF lFiltrado

      IF nFNumCiu = 0 .and. ;
         nFNumRut = 0 .and. ;
         nFAmbito = 1 .and. ;
         nFSaldo  = 1 .and. ;
         Empty( dFFecIni ) .and. Empty( dFFecFin )

         Clientes_FiltroQuitar()

         RETURN

      ELSE

         STORE "" TO cFilter0, cFilter1, cFilter2, cFilter3, cFilter4, cFilter5

         IF nFNumCiu > 0
            cFilter1 := StrFormat( "NUM_CIUD=%1", AllTrim( Str( nFNumCiu ) ) )
         ENDIF

         IF nFNumRut > 0
            cFilter2 := StrFormat( "NUM_RUTA=%1", AllTrim( Str( nFNumRut ) ) )
         ENDIF

         IF nFAmbito > 1
            IF nFAmbito=2
               cFilter3 := "ACTIVO=.T."
            ELSE
               cFilter3 := "ACTIVO=.F."
            ENDIF
         ENDIF

         IF !Empty( dFFecIni ) .and. !Empty( dFFecFin )
            cFilter4 := StrFormat( "(FECHA_ING>=%1 .and. FECHA_ING<=%2)", Var2Str( dFFecIni ), Var2Str( dFFecFin ) )
         ENDIF

         IF nFSaldo > 1
            cFilter5 := "SALDO_ACT>0"
         ENDIF

         cFilter0 := IIf( !Empty( cFilter1 ), cFilter1 + " .and. ", "" ) +;
                     IIf( !Empty( cFilter2 ), cFilter2 + " .and. ", "" ) +;
                     IIf( !Empty( cFilter3 ), cFilter3 + " .and. ", "" ) +;
                     IIf( !Empty( cFilter4 ), cFilter4 + " .and. ", "" ) +;
                     IIf( !Empty( cFilter5 ), cFilter5 + " .and. ", "" )

         cFilter0 := StrTran( AllTrim( cFilter0 ), "  ", " " )

         IF Right( cFilter0, 5)==".and."
            cFilter0 := SubStr( cFilter0, 1, Len( cFilter0 ) - 5 )
         ENDIF

         oBtnFilter:LoadBitmaps( "TB_FILTERDEL" )
         oBtnFilter:cTooltip := "Elimina filtro aplicado a tabla de datos"
         oBtnFilter:Refresh()

         IF !Empty( cFilter0 )
            CLIE->( cmFilter( cFilter0 ) )
         ENDIF

      ENDIF

   ENDIF

   Refrescar_Browse( oBrw )

RETURN
 

Code: Select all | Expand


/*procedimiento para eliminar filtro en lista de clientes*/
PROCEDURE Clientes_FiltroQuitar()

   IF lFiltrado

      oBtnFilter:LoadBitmaps( "TB_FILTERADD" )
      oBtnFilter:cTooltip := "Agrega filtrado a tabla de datos"
      oBtnFilter:Refresh()

      CLIE->( cmFilter( "" ) )

      lFiltrado := FALSE

   ENDIF

   Refrescar_Browse( oBrw )

RETURN
 

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Thu Jan 26, 2012 6:25 pm
by Daniel Garcia-Gil
Carlos

tienes que liberar los bitmap anteriores antes de cargar uno nuevo, sino te quedaras sin recursos

usa el metodo FreeBitMaps(), pero ojo eso libera todos los bitmaps del objeto

Re: Cambiar imagen de un BottonBMP en tiempo de ejecucion

Posted: Thu Jan 26, 2012 10:38 pm
by carlos vargas
copiado, daniel, gracias.