Ir al contenido


Foto

[RESUELTO] Compartir un evento entre varios componentes.


  • Por favor identifícate para responder
12 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 julio 2010 - 08:30

Buen día, amiguit@s del foro:

Les comento lo que necesito hacer. Tengo 20 TImage's con sus respectivos contenidos, que se muestran al usuario en una forma.

El usuario necesita y quiere poder poner CUALQUIER imagen de las contenidas dentro de un directorio dentro de cada TImage, lo cual ya tengo controlado.

Pero ahora, necesito saber cómo ponerle a los 20 TImage's UNA SOLA FUNCIÓN OnRightClick que llamaría la carga de la imagen nueva, identificando plenamente el componente desde es llamada e insertando en ése mismo componente la imagen.

Ejemplo: hago click derecho en la imagen 14, selecciono una imagen y se carga SOLAMENTE en la imagen 14, y si repito el procedimiento con la imagen 3, debe hacer EXACTAMENTE la llamada a la función.

Gracias de antemano por su apoyo.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 julio 2010 - 08:32

Pues así como lo dices, genera el evento en un TImage y asignas el mismo a todos :)

Usa el Sender para que realice el proceso en el objeto que se presiona.

Salud OS
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 julio 2010 - 08:34

Algo así como una función o procedimiento con parámetros:



delphi
  1. procedure CargaImagen (Contenedor: TImage);
  2. begin
  3.     // Código que carga la imágen utilizando la variable Contenedor para ello
  4. end;



... y mandarla llamar en el evento que quieras de cada componente ?

Algo así o de plano mi hamster aún no se pone activo ?

Saludox ! :)
   

  • 0

#4 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 julio 2010 - 08:43

..Usa el Sender para que realice el proceso en el objeto que se presiona...


Aquí es precisamente donde se me "hace bolas el atole"...
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 julio 2010 - 08:44

Porqué no pones tu código y te regresamos un ejemplo de uso del Sender ? (y)

Saludox ! :)
  • 0

#6 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 julio 2010 - 09:00

Porqué no pones tu código y te regresamos un ejemplo de uso del Sender ? (y)

Saludox ! :)


Por que no sé hacerlo.
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 julio 2010 - 09:10

Eso que quieres hacer se llama polimorfismo



delphi
  1. Timage(Sender).Picture.LoadFromFile('miarchivo');



yo siempre acostumbro a verificar que el Sender sea miembro de la clase que se le hara el cast para evitar errores involuntarios



delphi
  1. procedure TForm1.Image1DblClick(Sender: TObject);
  2. begin
  3.   if Sender is TImage then
  4.       Timage(Sender).Picture.LoadFromFile('miarchivo');
  5. end;


  • 0

#8 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 julio 2010 - 09:14

Yo hice otro ejemplito... que no usa el Sender pero funciona (y)

Declaré un procedimiento así:



delphi
  1. procedure CargaImagen(Contenedor: TImage);



Después hice:



delphi
  1. procedure TForm1.CargaImagen(Contenedor: TImage);
  2. begin
  3.   if AbreImagen.Execute then
  4.     Contenedor.Picture.LoadFromFile(AbreImagen.FileName);
  5. end;



Y en cada evento de los TImage:



delphi
  1. procedure TForm1.Image1Click(Sender: TObject);
  2. begin
  3.   CargaImagen(Image1);
  4. end;
  5.  
  6. procedure TForm1.Image2Click(Sender: TObject);
  7. begin
  8.   CargaImagen(Image2);
  9. end;



Es lo mejor ?... tal vez no... Funciona ? Si...

Saludox ! :)
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 12 julio 2010 - 09:17

O....



delphi
  1. procedure TForm1.Image1Click(Sender: TObject);
  2. begin
  3.   CargaImagen(Sender as TImage);
  4. end;
  5.  
  6. procedure TForm1.Image2Click(Sender: TObject);
  7. begin
  8.   CargaImagen(Sender as TImage);
  9. end;


  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 julio 2010 - 09:17

Hola Felipe.mx

el parámetro Sender identifica al objeto en cuestión. Un ejemplo sencillo del tema:

1. Te ubicas en el primer componente, en tu caso TImage.
2. Crea el evento, digamos OnClick. Tendrás algo como esto:



delphi
  1. procedure TForm1.Image1Click(Sender: TObject);
  2. begin
  3.  
  4. end;



3. Luego añade una instrucción como esta:


delphi
  1. TImage(Sender).Picture.LoadFromFile(....)



Con ello consigues que ante un click se abra en el TImage la imagen que pases como parámetro en el método LoadFromFile.

En tu caso necesitarás ahora asociar el "número" de TImage con la imagen. Una posible manera es consultando el nombre (si en el nombre hay algo con lo cual lo podamos identificar), o incluso aprovechar la propiedad Tag y actuar en consecuencia. Por ejemplo:



delphi
  1. mitag := TComponent(Sender).Tag;
  2. case miTag of:
  3. ....





Se arma la ruta adecuada a la imagen en cuestión y se pasa como parámetro.

4. Luego selecciona el resto de tus TImage y en el evento OnClick, en vez de crearlo seleccionas el evento OnClick del primer TImage.
¡Listo! ya tienes asociado a todos los controles el mismo evento.

Como observarás... el truco está en aprovechar el parámetro Sender y hacer algunos castings.
Espero que esta mini guía te sea de ayuda.

Saludos,
  • 0

#11 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 julio 2010 - 09:17

Yo hice otro ejemplito...


Deja lo pruebo.
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 julio 2010 - 09:24

Amiguitos... vamos a tener que implementar un sistema de turnos  ^o|, 3 ejemplos en segundos.... ¡que veloces! Para que no nos estemos peleando luego pongámonos de acuerdo... jajaja  :D

No broma. Espero que Felipe pueda encaminar y que gracias a nuestros ejemplos entienda el tema. Muy recomendable el consejo de eduardo: en ocasiones es mejor tener ese chequeo previo para saber si es el tipo adecuado.

Saludos,
  • 0

#13 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 julio 2010 - 10:22

Pues bueno..., una combinación del ejemplo de Fenareth y EduardoCOL ha resuelto el problema...

Me choca trabajar con gráficos, en serio que no domino el tema...
  • 0




IP.Board spam blocked by CleanTalk.