PDA

Ver la Versión Completa : Pintar todos los componentes del sistema dinámicamente


strelok
02-02-2018, 18:15:05
Hola, tengo un gran problema:

Componente: TAdvComboBox

¿Qué quiero hacer?: Pintar todos los componentes del sistema dinámicamente

¿Cómo hago esto?: En el OnCreate() de todos los formularios invoco a una función, la cual recorre todos los componentes y según su tipo usa un color u otro.

¿Cuál es el problema?: Pues, inicialmente se pinta perfecto (tanto el color principal, borde, color de foco, texto de foco, etc), sin embargo, cuando pierde el foco toma el valor del DFM, es decir, si en el DFM el color es verde, y en tiempo de ejecución lo pinto rojo, cuando se ve por primera vez es rojo, cuando saco el foco, se ve verde, NO TIENE LÓGICA
Miré internamente el código de ese componente y parece ser que si lo guarda, ¿qué parche me recomiendan aplicar?

A - cambiar manualmente todos los dfm no lo veo viable, y tampoco es una solución genérica

B- hacer una función y asignarla en tiempo de ejecución al método OnExit() que vuelva a repintar, podría ser..., pero, ¿quien me asegura que alguno de esos componentes en una parte X de la aplicación ya no tenga asignado OnExit()?, por lo tanto este último parche podría ser un arma de doble filo, y ya no se me ocurre nada mas.

Necesito consejos de expertos :cool:

roman
02-02-2018, 18:31:04
NO TIENE LÓGICA

Sí que la tiene. Es sólo que Windows no funciona como estás pensando. Lo que tú pintes va a desaparecer porque la programación en un entorno gráfico se basa en eventos. Si una ventana oculta a la tuya, lo que hayas pintado en el OnCreate se pierde. Lo que debes manejar es el evento OnPaint o similar para pintar cada vez que sea necesario.

LineComment Saludos

Neftali [Germán.Estévez]
05-02-2018, 11:34:47
...inicialmente se pinta perfecto (tanto el color principal, borde, color de foco, texto de foco, etc), sin embargo, cuando pierde el foco toma el valor del DFM

Si una ventana oculta a la tuya, lo que hayas pintado en el OnCreate se pierde. Lo que debes manejar es el evento OnPaint o similar para pintar cada vez que sea necesario.


O probar en el evento OnActivate del formulario.

ElDioni
05-02-2018, 15:38:50
Hola, ¿no será que los componentes tienen asignado el colorparent, colorfont y demás enseres a true y por eso en un principio parece que cambian de color pero luego vuelven a su ser?

Saludos.

strelok
05-02-2018, 18:41:25
Lo que comentaron de probar en el "OnActivate", no lo probé, pero si en el OnPaint del formulario, y era bastante inviable, ya que resultó ser muy lento.

Mi función que pinta es recursiva, le mando "SELF" y recorre todos sus hijos, y pregunta que componente es, para posteriormente pintarlo de un color u otro.

¿Cuál sería la diferencia en el OnActivate?

Voy a probar las propiedades que dices.

Neftali [Germán.Estévez]
06-02-2018, 09:14:24
Lo que comentaron de probar en el "OnActivate", no lo probé, pero si en el OnPaint del formulario, y era bastante inviable, ya que resultó ser muy lento.

Mi función que pinta es recursiva, le mando "SELF" y recorre todos sus hijos, y pregunta que componente es, para posteriormente pintarlo de un color u otro.

¿Cuál sería la diferencia en el OnActivate?


...sin embargo, cuando pierde el foco toma el valor del DFM, es decir, si en el DFM el color es verde...


Realizar "cosas" en el OnPaint es delicado, porque es un evento que se lanza continuamente. Por ejemplo, simplemente con pasar el ratón por encima o con colocar algo delente del form.
El OnActivate es un evento del formulario que se lanza cuando el formulario recibe el foco, que parece ser cuando llegan los problemas.
Evento OnActivate (http://docwiki.embarcadero.com/Libraries/Berlin/en/Vcl.Forms.TCustomForm.OnActivate)

strelok
06-02-2018, 13:47:25
;524355']Realizar "cosas" en el OnPaint es delicado, porque es un evento que se lanza continuamente. Por ejemplo, simplemente con pasar el ratón por encima o con colocar algo delente del form.
El OnActivate es un evento del formulario que se lanza cuando el formulario recibe el foco, que parece ser cuando llegan los problemas.
Evento OnActivate (http://docwiki.embarcadero.com/Libraries/Berlin/en/Vcl.Forms.TCustomForm.OnActivate)

Sigue exactamente igual :(

Neftali [Germán.Estévez]
07-02-2018, 12:05:34
¿Pero has comprobado que el evento salta cuando reactivas el formulario?
¿Es lo que necesitas?