PDA

Ver la Versión Completa : Menejar un TypeCast con varios componentes


CORBATIN
15-09-2003, 02:10:01
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.

dabas
15-09-2003, 03:07:34
Si lo entendí bien creo que esto te servirá:
procedure TForm1.teditEnter(Sender: TObject);
begin
(Sender as TTEdit).Color:=clRed;
(Sender as TTEdit).Font.Color:=clMoneyGreen;
end;

y para la salida
procedure TForm1.teditEnter(Sender: TObject);
begin
(Sender as TTEdit).Color:=clRed;
(Sender as TTEdit).Font.Color:=clMoneyGreen;
end;

(Sender as TTEdit) -> lo he usado para reutilizarlo con todos los TEdit que quiera.


Hasta otra.

dabas
15-09-2003, 03:10:52
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);

CORBATIN
17-09-2003, 14:38:27
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.

dabas
17-09-2003, 20:52:45
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

delphi.com.ar
17-09-2003, 22:09:08
Posteado originalmente por CORBATIN
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...

Yo a esto le veo dos soluciones:
- 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!

Ruben_Cu
18-09-2003, 03:35:51
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:

implementation
type tmicontrol=class (tcontrol)
published
property color;
property font;
end;

Una vez que tenemos esta clase llamamos a los eventos haciendo el typecast con el sender que será siempre un descendiente del tcontrol:

procedure TForm1.Edit1Enter(Sender: TObject);
begin
if sender is tcontrol then
with tmicontrol(sender) do begin
color:= clred;
font.Color:=clblue;
end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
if sender is tcontrol then
with tmicontrol(sender) do begin
color:= clwhite;
font.Color:=clblack;
end;
end;

Solo te resta asociar los eventos Enter y Exit de todos tus controles a los del edit u objeto elegido por tí para escribir las declaraciones.
Creo que te debe funcionar, prueba y después nos comentas.
Saludos y suerte

CORBATIN
19-09-2003, 14:45:37
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).

Ruben_Cu
19-09-2003, 14:59:55
Hola CORBATIN
Posteado originalmente por CORBATIN
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.
En realidad no entiendo bien a que te refieres con este comentario, ¿te refieres a hacer nuevas componentes que contengan ese efecto como propiedades de ellas?¿pudieras explicarte un poco para saber que deseas y ver si entre todos podemos hacerlo?
Saludos

CORBATIN
21-09-2003, 12:32:42
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.