Page 1 of 2

Rebar y Toolbars XP

PostPosted: Fri Mar 31, 2006 7:50 am
by jmartial
Antonio,

Necesitaría como en las barras de botones, dejar pulsado un botón, me parece recordar que dijiste que todavía no está implementado, pero me hace bastante falta.

¿Alguien me podría dar alguna pista de que mensaje o función del api debería buscar para conseguirlo?

Mi idea es provisionalmente, añadir un método que lo haga.

Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 7:52 am
by jmartial
Perdón,

En la frase "como en la barra de botones", me refería a la antigua, a la que siempre ha llevado implementada fw.

Un saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 8:37 am
by Antonio Linares
Joaquín,

Añade este método a la clase TToolBar:

#define TB_SETSTATE 1041
#define TBSTATE_PRESSED 2
#define TBSTATE_ENABLED 4

METHOD SetPressed( nButton, lOnOff ) INLINE ;
::SendMsg( TB_SETSTATE, nButton, If( lOnOff, TBSTATE_PRESSED, TBSTATE_ENABLED ) )

PostPosted: Fri Mar 31, 2006 10:32 am
by jmartial
Antonio,

Gracias por darme una idea, pero ese método no hace lo deseado, aparte de que deja el botón deshabilitado.

A partir de esa idea, he creado 2 métodos que Sí hacen exactamente lo que buscaba y lo que hacía la antigua toolbar.

Espero que te guste la implementación.

#define TB_CHECKBUTTON (WM_USER + 2)
#define TBSTATE_CHECKED 0x01
#define TB_SETSTATE 1041
#define TBSTATE_ENABLED 4
#define TB_ISBUTTONCHECKED (WM_USER + 10)


METHOD SetChecked( nButton, lOnOff ) INLINE ;
If( lOnOff, ::SendMsg( TB_CHECKBUTTON, nButton, TBSTATE_CHECKED ),;
::SendMsg( TB_SETSTATE, nButton, TBSTATE_ENABLED ) )

METHOD IsChecked( nButton ) INLINE ;
if(::SendMsg( TB_ISBUTTONCHECKED, nButton, 0 )==0, .F., .T. )


Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 10:45 am
by jmartial
Antonio,

Si te ha parecido bien y vas a añadirlo a la clase, mira si sería posible este método también, lo veo bastante útil:


//----- Pone el estado de un botón de la manera inversa a la que está

METHOD lChekOnOff( nButton ) INLINE if( ::IsChecked( nButton ), ;
( ::SetChecked( nButton, .F. ),.F.),;
( ::SetChecked( nButton, .T. ),.T.) )


Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 11:53 am
by Antonio Linares
Joaquín,

Gracias,

Este se puede simplificar así:

METHOD IsChecked( nButton ) INLINE ::SendMsg( TB_ISBUTTONCHECKED, nButton ) != 0

PostPosted: Fri Mar 31, 2006 11:55 am
by Antonio Linares
Joaquín,

Y lChekOnOff() queda mejor así:

METHOD ToggleCheck( nButton ) INLINE ::SetCheck( nButton, ! ::IsChecked( nButton ) )

PostPosted: Fri Mar 31, 2006 12:18 pm
by jmartial
Antonio,

en el método

METHOD ToggleCheck( nButton ) INLINE ::SetCheck( nButton, ! ::IsChecked( nButton ) )


::SetCheck( nButton, ! ::IsChecked( nButton ) ) ¿que devuelve? porque se necesita que devuelva el estado en que queda el botón.

Que traducción tiene la palabra Toggle ¿Cambio de estado?

Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 12:33 pm
by Antonio Linares
Joaquín,

Sí, Toggle significa conmutar, cambiar.

Para que necesitas que devuelva el valor ? Lo puedes obtener con IsChecked()

PostPosted: Fri Mar 31, 2006 12:37 pm
by jmartial
Antonio,

es muy importante, si tengo una data que me indica un estado por ejemplo en mi caso ::lBold y la oToolbar es una variable local, que no uso en ninguna otra parte, en el action del botón pongo

::lBold := oToolbar:ToggleCheck( 1 ) // Por ejemplo


Por eso, te lo pasé de esa manera el INLINE, y así es como le veo más utilidad y no veo que repercuta en ninguna otra cosa.

Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 12:45 pm
by Antonio Linares
Joaquín,

Es lo mismo que hacer:

oToolbar:ToggleCheck( 1 )
::lBold := oToolbar:IsChecked( 1 )

PostPosted: Fri Mar 31, 2006 12:47 pm
by jmartial
Antonio,

Antes me hablabas de simplificar, y ahora quieres que use 2 métodos??

Ya sé que como dices funciona, pero trataba que fuera más legible el action de un botón por ejemplo.



Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 12:47 pm
by jmartial
Aparte,

¿Cual es el inconveniente que le ves a que devuelva el estado en que queda?


Un Saludo,
Joaquín

PostPosted: Fri Mar 31, 2006 12:49 pm
by Antonio Linares
Joaquín,

No hay ningún inconveniente, sencillamente son acciones distintas. Pero si te empeñas, lo dejamos como quieras :)

PostPosted: Fri Mar 31, 2006 12:53 pm
by jmartial
Antonio gracias,

pero yo valoro mucho tu opinión en estos campos, por eso me gusta que no le veas nada negativo.

Porque si al final va a ser más negativo que positivo el cambio, tampoco es cuestión de encabezonarse :-)

Sí lo ves bien, prefiero que devuelva el estado.


Un Saludo,
Joaquín