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.