Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pintar todos los componentes del sistema dinámicamente (https://www.clubdelphi.com/foros/showthread.php?t=92791)

strelok 02-02-2018 18:15:05

Pintar todos los componentes del sistema dinámicamente
 
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

Cita:

Empezado por strelok (Mensaje 524325)
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

Cita:

Empezado por strelok (Mensaje 524325)
...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

Cita:

Empezado por roman (Mensaje 524326)
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

Cita:

Empezado por strelok (Mensaje 524351)
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?

Cita:

Empezado por strelok (Mensaje 524325)
...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

strelok 06-02-2018 13:47:25

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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

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?


La franja horaria es GMT +2. Ahora son las 01:16:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi