Page 1 of 3

Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 10:26 am
by paquitohm
Hola,

Quisiera que en un Combobox, cuando no tenga nada seleccionado, se pinte un triangulito significando "obligatorio seleccionar"
Le estaba metiendo mano a la clase Combobox pero no hay manera.


Esta caracteristica ya la tengo en Get y se ve asi:
Image

Alguna idea ? Gracias

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 11:57 am
by Antonio Linares
Paco,

Es un combobox editable ?

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 12:52 pm
by karinha

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 2:16 pm
by paquitohm
Antonio Linares wrote: Thu Apr 24, 2025 11:57 am Paco,

Es un combobox editable ?
Antonio,

No es editable.

[ACTUALIZADO] Ya parece que me van saliendo cositas. Ahora despues informo mejor

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 2:32 pm
by cnavarro
Paquito, se me ocurren varias posibilidades
La primera que intentaría sería en el objeto oCombo:oGet meterle un action { || .T- } que no hiciese nada y ponerle el bitmap que consideres, poniéndolo y quitándolo o cambiándolo según la validacion que consideres, lo único es que ese bitmap aparecería a la derecha ( en principio )
Dime qué te parece

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 3:19 pm
by paquitohm
cnavarro wrote: Thu Apr 24, 2025 2:32 pm Paquito, se me ocurren varias posibilidades
La primera que intentaría sería en el objeto oCombo:oGet meterle un action { || .T- } que no hiciese nada y ponerle el bitmap que consideres, poniéndolo y quitándolo o cambiándolo según la validacion que consideres, lo único es que ese bitmap aparecería a la derecha ( en principio )
Dime qué te parece
Gracias Cristóbal. Acabo de ver tu comentario. 17:19.
Ya me pinta el triangulito. Creo que con unos pocos ajustes tengo el temo. voy a ver. Ahora despues informaré

Re: Combobox con marca visual de obligatoriedad

Posted: Thu Apr 24, 2025 3:54 pm
by Antonio Linares
Paco, como lo has hecho ?

Aqui tienes una primera prueba pero funciona a medias:

Code: Select all | Expand

#include "FiveWin.ch"

function Main()

    local oDlg, oCmb, cSelected := "Item 1"

    DEFINE DIALOG oDlg TITLE "ComboBox Example" SIZE 300, 200 PIXEL

    @ 2, 3 COMBOBOX oCmb VAR cSelected SIZE 100, 60 ;
        ITEMS { "Item 1", "Item 2", "Item 3" }

    __clsAddMsg( oCmb:ClassH, "Display", @Display(), HB_OO_MSG_METHOD,, 1 )

    @ 3, 8 BUTTON "OK" SIZE 50, 20 ;

    ACTIVATE DIALOG oDlg CENTERED

    RETURN NIL

static function Display()    

   local Self := QSelf() 

   FillRect( ::GetDC(), { 0, 0, 23, 23 }, TBrush():New( , CLR_RED ):hBrush )
   ::ReleaseDC()

return nil    

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 8:44 am
by paquitohm
Finalmente no he podido/ sabido. Por el camino me he dado cuenta que es algo que me supera y ya desisto.
Unicamente conseguí mostrar el triangulito fuera del combobox

Image

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 11:15 am
by paquitohm
Refinalmente el chapu del siglo. Metido como un item con un bitmap triangulito. Aparte hay que dar soporte al VALID para no soportar este item extra como seleccion no valida. Ademas supone obligatoriedad fija, es decir, no puede estar en un codeblock.



Image

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 2:20 pm
by cnavarro
Paquito, al hilo de lo que ha hecho Antonio, mira este codigo ( en lugar del box, puedes pintar el bitmap o lo que consideres )
Quedo a tu disposicion si necesitas mas ayuda

Code: Select all | Expand

#include "FiveWin.ch"

function Main()

    local oDlg, oCmb, cSelected := "    "

    DEFINE DIALOG oDlg TITLE "ComboBox Example" SIZE 300, 200 PIXEL

    @ 2, 3 COMBOBOX oCmb VAR cSelected SIZE 100, 60 ;
        ITEMS { "   ", "Item 1", "Item 2", "Item 3" }

   __clsAddMsg( oCmb:ClassH, "Display", @Display(), HB_OO_MSG_METHOD,, 1 )

    @ 3, 8 BUTTON "OK" SIZE 50, 20 ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

    RETURN NIL


static function Display( o )    

   local Self := QSelf() 
   local hDC      := ::GetDC()
   local aRect    := GetClientRect( ::hWnd )

   if Empty( ::Varget() )
   RoundBox( hDC, aRect[ 2 ] - 6, aRect[ 1 ] - 6, aRect[ 4 ] + 6, aRect[ 3 ] + 6, 0, 0, ;
                         CLR_RED, 4 )
   else
   RoundBox( hDC, aRect[ 2 ] - 6, aRect[ 1 ] - 6, aRect[ 4 ] + 6, aRect[ 3 ] + 6, 0, 0, ;
                         CLR_GREEN, 4 )
   endif
  ::ReleaseDC()

return nil    


Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 4:07 pm
by paquitohm
cnavarro wrote: Fri Apr 25, 2025 2:20 pm Paquito, al hilo de lo que ha hecho Antonio, mira este codigo ( en lugar del box, puedes pintar el bitmap o lo que consideres )
Quedo a tu disposicion si necesitas mas ayuda

Code: Select all | Expand

#include "FiveWin.ch"

function Main()

    local oDlg, oCmb, cSelected := "    "

    DEFINE DIALOG oDlg TITLE "ComboBox Example" SIZE 300, 200 PIXEL

    @ 2, 3 COMBOBOX oCmb VAR cSelected SIZE 100, 60 ;
        ITEMS { "   ", "Item 1", "Item 2", "Item 3" }

   __clsAddMsg( oCmb:ClassH, "Display", @Display(), HB_OO_MSG_METHOD,, 1 )

    @ 3, 8 BUTTON "OK" SIZE 50, 20 ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

    RETURN NIL


static function Display( o )    

   local Self := QSelf() 
   local hDC      := ::GetDC()
   local aRect    := GetClientRect( ::hWnd )

   if Empty( ::Varget() )
   RoundBox( hDC, aRect[ 2 ] - 6, aRect[ 1 ] - 6, aRect[ 4 ] + 6, aRect[ 3 ] + 6, 0, 0, ;
                         CLR_RED, 4 )
   else
   RoundBox( hDC, aRect[ 2 ] - 6, aRect[ 1 ] - 6, aRect[ 4 ] + 6, aRect[ 3 ] + 6, 0, 0, ;
                         CLR_GREEN, 4 )
   endif
  ::ReleaseDC()

return nil    

Gracias Cristobal, pero me temo que no vale. Se trataría de pintar dentro del combobox que es lo complicado. Fuera ya pude pintar el triangulo. Más arriba puse un ejemplo.
Esto es lo que me pinta con tu ejemplo:
Image

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 4:27 pm
by paquitohm
Vale Cristóbal, no había entendido tu solución. Disculpa

Me parece muy buena idea. Cuadro por fuera rojo y en mi caso le he puesto, en vez de verde, que lo apague cuando se seleccione algo. De esta manera puedo poner la variable "obligatorio" como un codeblock, lo cual mejora mi solucion de un bitmap. Me gustaba más el triangulito, pero así también se queda muy bien: Una marca de "obligatorio" característica y diferenciada de los Gets: Graficamente el usuario lo entiende: Distinto objeto, distinta marca de obligatoriedad.

Una solución elegante y rápida.

Gracias a ti y a Antonio ! :D

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 4:56 pm
by cnavarro
paquitohm wrote: Fri Apr 25, 2025 4:27 pm Vale Cristóbal, no había entendido tu solución. Disculpa

Me parece muy buena idea. Cuadro por fuera rojo y en mi caso le he puesto, en vez de verde, que lo apague cuando se seleccione algo. De esta manera puedo poner la variable "obligatorio" como un codeblock, lo cual mejora mi solucion de un bitmap. Me gustaba más el triangulito, pero así también se queda muy bien: Una marca de "obligatorio" característica y diferenciada de los Gets: Graficamente el usuario lo entiende: Distinto objeto, distinta marca de obligatoriedad.

Una solución elegante y rápida.

Gracias a ti y a Antonio ! :D
Si, esa era mi intencion con la solucion que te propuse, pero cuando tenga un rato miro de poner el bitmap dentro del combo, ya como tema de I+D

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 5:10 pm
by paquitohm
Cristóbal,

Recién veo que se me confunde un poco con la marca de focus del Get que consiste tambien en un recuadro rojo alrededor del get.

Pero de momento lo dejo asi. Quiza será cuestion de que busque otra marca o de que cambie el rojo de focus del get por un azul, pongamos por caso.
Image

Gracias

Re: Combobox con marca visual de obligatoriedad

Posted: Fri Apr 25, 2025 6:33 pm
by paquitohm
De momento lo dejo asi, con un poco de naranja y sin recuadro cuando tenga contenido

Image