Rebar y Toolbars XP

jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Rebar y Toolbars XP

Post 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
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

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

Post 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 ) )
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Post 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
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

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

Post by Antonio Linares »

Joaquín,

Gracias,

Este se puede simplificar así:

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42582
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 36 times
Been thanked: 86 times
Contact:

Post by Antonio Linares »

Joaquín,

Y lChekOnOff() queda mejor así:

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

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

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

Post by Antonio Linares »

Joaquín,

Sí, Toggle significa conmutar, cambiar.

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

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

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

Post by Antonio Linares »

Joaquín,

Es lo mismo que hacer:

oToolbar:ToggleCheck( 1 )
::lBold := oToolbar:IsChecked( 1 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Post 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
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Post by jmartial »

Aparte,

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


Un Saludo,
Joaquín
User avatar
Antonio Linares
Site Admin
Posts: 42582
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 36 times
Been thanked: 86 times
Contact:

Post by Antonio Linares »

Joaquín,

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

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

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