Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Selector de Colores
#1

He necesitado para un proyecto un selector de colores al estilo del que el IDE muestra cuando necesita seleccionar un color, por ejemplo, al pulsar sobre el botón de la propiedad Background.
Su aspecto es éste:

[Imagen: MM1vFa3.png]

Como veis, prácticamente igual que el del IDE, salvo por el orden de los colores. Hasta donde lo he probado funciona bien... peeeero, después de tres días de pelearme con las classes del sistema para obtener los colores por defecto,  me he rendido y he acabando haciendo esto:
GAMBAS
  1.   $aColors.Add([Color.Background, "Background"])
  2.   $aColors.Add([Color.Black, "Black"])
  3.   $aColors.Add([Color.Blue, "Blue"])
  4.   $aColors.Add([Color.ButtonBackground, "ButtonBackground"])
  5.   $aColors.Add([Color.ButtonForeground, "ButtonForeground"])
  6.   $aColors.Add([Color.Cyan, "Cyan"])
  7.   $aColors.Add([Color.DarkBlue, "DarkBlue"])
  8.   $aColors.Add([Color.DarkCyan, "DarkCyan"])
  9.   $aColors.Add([Color.DarkGray, "DarkGray"])
  10.   $aColors.Add([Color.DarkGreen, "DarkGreen"])
  11.   $aColors.Add([Color.DarkMagenta, "DarkMagenta"])
  12.   $aColors.Add([Color.DarkOrange, "DarkOrange"])
  13.   $aColors.Add([Color.DarkPurple, "DarkPurple"])
  14.   $aColors.Add([Color.DarkRed, "DarkRed"])
  15.   $aColors.Add([Color.DarkRoyal, "DarkRoyal"])
  16.   $aColors.Add([Color.DarkViolet, "DarkViolet"])
  17.   $aColors.Add([Color.DarkYellow, "DarkYellow"])
  18.   $aColors.Add([Color.Default, "Default"])
  19.   $aColors.Add([Color.Foreground, "Foreground"])
  20.   $aColors.Add([Color.Gray, "Gray"])
  21. ...
  22. ...
  23. 'etc,etc


donde $aColors es un Variant[] del que se obtiene el gridview de colores.
¿Alguien conoce una manera más elegante de crear ese Variant[], es decir, obtener las constantes y los valores de la clase Color, sin tener que ponerlos a pedal?

Es que así queda como un poco cutre...

Saludos


Archivos adjuntos
.gz SelectColor-0.0.1.tar.gz Tamaño: 13.57 KB  Descargas: 3

No podemos regresar
    ¡Gracias!
#2

(04-05-2023, 12:03)Shordi escribió:  ¿Alguien conoce una manera más elegante de crear ese Variant[], es decir, obtener las constantes y los valores de la clase Color, sin tener que ponerlos a pedal?

Se me ocurre esta forma:
GAMBAS
  1. Dim myClass As Class = Classes["Color"]
  2. Dim sSymbol As String
  3.  
  4.   For Each sSymbol In myClass.Symbols
  5.     If myClass[sSymbol].Kind = Class.Constant Then
  6.       $aColors.Add([myClass[sSymbol].Value, sSymbol])
  7.     Endif
  8.   Next



1 Saludo.
    ¡Gracias!
#3

¡Joder, qué simple! Pues ya te digo que estuve dos días enteros atrapado en eso como un pasmarote. Pa que veas el nivel...

Gracias, tron, es justo lo que buscaba.


Saludos

Ah... no vale.  Con eso obtienes sólo las constantes, es decir los colores puros, pero, y son más interesantes aún, no obtienes los colores del sistema. Si modificas el código más o menos así:

GAMBAS
  1.   For Each sSymbol In myClass.Symbols
  2.     If myClass[sSymbol].Kind = Class.Property Or If myClass[sSymbol].Kind = Class.Constant Then
  3.       $aColors.Add([myClass[sSymbol].Value, sSymbol])
  4.     Endif
  5.   Next


Esto genera el Array $aColors tal como lo queremos... pero con el valor de las propiedades (los colores del sistema son propiedades) a Null. El problema es cómo acceder al valor a partir de la cadena del nombre.
algo así como

GAMBAS
  1. dim ncolor as integer
  2. dim colorname as string
  3. colorname = "Background"
  4. ncolor = color.(colorname) 'pongo los paréntesis por poner algo...



Se puede hacer un enfoque mixto donde los colores "simples" se obtengan con tu bucle y los del sistema con mi aproximación chapucera... pero sigue siendo poco elegante.

Gracias por tu interés

Saludos

No podemos regresar
    ¡Gracias!
#4

(05-05-2023, 08:46)Shordi escribió:  Se puede hacer un enfoque mixto donde los colores "simples" se obtengan con tu bucle y los del sistema con mi aproximación chapucera... pero sigue siendo poco elegante.

Si, yo estuve rompiéndome el coco un rato pero no encontré la manera de obtener esos colores Null creo que el interprete los carga de alguna manera al inicio del programa.
Encontré las siguientes clases que mencionan un método llamado defaultBackground() pero todos en el componente gb.gtk
Bash
  1. $ find . -type f -exec grep -H 'defaultBackground' {} \;
  2. ./gb.gtk/src/gcontrol.cpp:gColor gControl::defaultBackground() const
  3. ./gb.gtk/src/gcontrol.cpp:    return defaultBackground();
  4. ./gb.gtk/src/gcontrol.cpp:        return no_default ? defaultBackground() : COLOR_DEFAULT;
  5. ./gb.gtk/src/gtextbox.h:    virtual gColor defaultBackground() const;
  6. ./gb.gtk/src/gtextbox.cpp:gColor gTextBox::defaultBackground() const
  7. ./gb.gtk/src/gbutton.h:    gColor defaultBackground() const;
  8. ./gb.gtk/src/gbutton.cpp:gColor gButton::defaultBackground() const
  9. ./gb.gtk/src/gbutton.cpp:        return gControl::defaultBackground();
  10. ./gb.gtk/src/gcontrol.h:    virtual gColor defaultBackground() const;
  11. ./gb.gtk/src/gtextarea.h:    virtual gColor defaultBackground() const;
  12. ./gb.gtk/src/gtextarea.cpp:gColor gTextArea::defaultBackground() const


Pero no se me ocurre como acceder a ese método para "preguntarle" el color "BackGround"
Nota: Envié un email a la lista internacional preguntando por el asunto, a ver que sale de ahí.

1 Saludo.
    ¡Gracias!
#5

Genial. Han respondido en la lista y esto se queda así tras la respuesta de Bruce Steers

GAMBAS
  1.   Dim myClass As Class = Classes["Color"]
  2.   Dim sSymbol As String
  3.  
  4.   For Each sSymbol In myClass.Symbols
  5.     If myClass[sSymbol].Kind = Class.Constant Then
  6.       $aColors.Add([myClass[sSymbol].Value, sSymbol])
  7.     Else If myClass[sSymbol].Kind = Class.Property
  8.       $aColors.Add([Object.GetProperty(Color, sSymbol), sSymbol])
  9.     Endif
  10.   Next



Gracias!!

Saludos

Lo que me fastidia es que esas clases (object, classec, etc.) las he usado cientos de veces y aún así me lío con ellas que te cagas.

Viejuno estoy, oiga...


Saludos

No podemos regresar
    ¡Gracias!
#6

(05-05-2023, 13:03)Shordi escribió:  Genial. Han respondido en la lista y esto se queda así tras la respuesta de Bruce Steers

Perfecto. Hice unos cambios para usar una collection en vez de un Variant[]. Alguien una vez me convenció de usar colecciones Big Grin
Saludos.


Archivos adjuntos
.gz SelectColor-0.0.2.tar.gz Tamaño: 13.35 KB  Descargas: 2

1 Saludo.
    ¡Gracias!
#7

Shordi ¿Viste la version minimalista del la lista inernacional?

GAMBAS
  1.  For Each sSymbol As String In Classes["Color"].Symbols
  2.    If Classes["Color"][sSymbol].Kind = Class.Constant Or If Classes["Color"][sSymbol].Kind = Class.Property Then $Colors[sSymbol] = Object.GetProperty(Color, sSymbol)



1 Saludo.
    ¡Gracias!
#8

Sí, mola. El problema de ese tipo de sentencias es que con el tiempo, cuando tienes que releer el código se hacen farragosas... "Código ofuscado" creo que lo llaman. yo lo he dejado así en mi programa

GAMBAS
  1. aSymbols = Classes["Color"].Symbols
  2.   aSymbols.sort
  3.   For Each sSymbol As String In Classes["Color"].Symbols
  4.     If Classes["Color"][sSymbol].Kind = Class.Constant Or If Classes["Color"][sSymbol].Kind = Class.Property Then
  5.       $aColors.Add([Object.GetProperty(Color, sSymbol), sSymbol])
  6.     Endif
  7.   Next


Es lo mismo y me parece más legible.
La duda que me queda es si separar en la lista según tipo, como hace el IDE o dejarla alfabética. No sé qué es más apropiado.

También resaltar lo que ya he dicho otras veces: Te rompes el coco, haces cien pruebas escribes decenas de líneas de código y al final, cuando lo solucionas, todo se reduce a unas muy pocas líneas. A veces una sola. Ser simple es lo más difícil, lo juro.

Saludos

No podemos regresar
    ¡Gracias!
#9

(05-05-2023, 20:44)Shordi escribió:  Es lo mismo y me parece más legible.

si, estoy de acuerdo, ademas no me gusta cuando las variables están declaradas sobre la marcha y no todas al comienzo del método, pero bueno es otra manera de hacerlo en menos lineas.

1 Saludo.
    ¡Gracias!
#10

Al final he modificado el formulario ColorSelector para que ofrezca los colores de la lista como hace el IDE: por categorías. Es decir, primero el transparente, luegos los colores del tema del escritorio y luego los colores estándar.
Lo he modificado simplemente porque acostumbrado al del IDE me perdía buscando en la lista alfabética...

Lo podéis encontrar en https://gitlab.com/shordi/ColorSelector

También he subido un vídeo al Youtube presentándolo.

Espero que os guste.

Saludos

No podemos regresar
[-] Los siguientes 2 usuarios dicen gracias a Shordi por este post:
  • guizans, tincho
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)