![]() |
Menejar un TypeCast con varios componentes
Hola a todos, resulta que quiero hacer dos procedimientos donde uno de ellos le cambie el color y la fuente cuando reciba el foco y el otro que vuelva a restaurar ambas cosas cuando sale.
En los eventos enter y exit es donde estoy escribiendo las llamadas a estos procedimientos, pero mi duda es la siguiente: procedure enter(.............); begin ...........color := clred; ............font.color := cdmaroon; end; ¿Qué debería recibir este procedimiento y como lo debería tratar para que sea lo que sea que reciba lo pueda tratar como indica el procedimiento? Lo grandioso del desierto es que siempre esconde un pozo de agua. |
Si lo entendí bien creo que esto te servirá:
Código:
procedure TForm1.teditEnter(Sender: TObject); Código:
procedure TForm1.teditEnter(Sender: TObject); Hasta otra. |
Valla,
os habreis dado cuenta que el codigo es igual (tanto copiar y pegar pa ná es tonteria) para la salida es lo mismo pero: procedure TForm1.tedit1Exit(Sender: TObject); |
Perdonar el retraso he estado de puente.
Tú solución es correcta pero no es la que busco, lo que yo quiero es no tener que hacer un type cast al componente u objeto que que recibo según lo que sea, sino simplemente reciba lo que reciba me sirva para todos los componentes. Con tú solución tendría que hacer comparaciones para saber si lo que recibo es un Tedit, TDBEdit o TDBlookupcombox, etc. Yo busco algo que que me haga el type cast pero sin tener que hacer esas comparaciones, algo que sea mas menos así: procedure enter(elemento:Tobject;tipo:Classtype); begin tipo(elemento).color := clred; end; Este es el aspecto de mi solución buscada. De nuevo gracias a todos por vuestra ayuda. La grandeza del desierto reside en que siempre esconde un pozo de agua. |
Vale, vale. ya entiendo, eso me pregunté yo hace no mucho tiempo, pero no queria investigar como se hacia y lo hice de la manera que he escrito.
Pero yo creo que se podria aplicar un override a la funcion "enter" por ejemplo y asi poder añadir otro parametro como indicas: procedure enter(elemento:Tobject;tipo:Classtype); Pero desconozco como se pone en practica. Pues eso, siento no ser de mas ayuda. Hasta otra |
Cita:
- Que los procedimientos reciban las clases de cuanto mas arriba en el arbol jerárquico de clases mejor... el tema es ver cual es la clase indicada para ver a las propiedades que quieres acceder. Si son clases propietarias te recomendaría crear clases abstractas... mejor dicho clases con métodos abstractos, de donde hereden todas tus clases. - Usar RTTI, te recomiendo buscar hilos anteriores de esta utilidad, pues ya se ha comentado en mas de una oportunidad. Saludos! |
Hola CORBATIN, el problema está en heredar las propiedades del ancestro de los controles a colocar en tu form. Si revisas la herencia de las componentes verás que el tcontrol tiene las propiedades Color y Font que son después heredadas por sus descendientes, pero esto tiene un problema y es que en el tcontrol esas propiedades son protegidas, entonces el primer paso sería crear una nueva clase del tcontrol que haga published esas dos propiedades:
Código:
implementation Código:
procedure TForm1.Edit1Enter(Sender: TObject); Creo que te debe funcionar, prueba y después nos comentas. Saludos y suerte |
Eso era lo que yo buscaba. Sabía que la clase Tcontrol era la equivalente en todos y con la propiedad color pero no sabía el motivo de que no me permitiese utilizar esta propiedad.
Muchas gracias a todos por vuestra ayuda. Ahora me toca investigar para crear los diversos componentes que utilizo para que lo puedan hacer ellos solos, sin que tener que añadirle a cada uno de mis componentes código alguno, sería una buena idea. La grandeza del desierto reside en que siempre esconde un pozo de agua. (y en este caso me lo han mostrado). |
Hola CORBATIN
Cita:
Saludos |
Bueno, en realidad solo era un comentario pero mi intención es tal y como has dicho crear componentes que tengan estas propiedades para no tener que añadirlas una a una con código y así poder ser más rápido.
Aunque lo que quería era investigar por mi cuenta, si alguién quiere ayudar también le estaría muy agradecido, saludos. |
La franja horaria es GMT +2. Ahora son las 04:16:44. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi