Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Menejar un TypeCast con varios componentes (https://www.clubdelphi.com/foros/showthread.php?t=3634)

CORBATIN 15-09-2003 02:10:01

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.

dabas 15-09-2003 03:07:34

Si lo entendí bien creo que esto te servirá:
Código:

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

y para la salida
Código:

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

Cita:

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:
Código:

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:
Código:

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
Cita:

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.


La franja horaria es GMT +2. Ahora son las 05:54:33.

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