[RESUELTO] Compartir un evento entre varios componentes.
#1
Escrito 12 julio 2010 - 08:30
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.
#2
Escrito 12 julio 2010 - 08:32
Usa el Sender para que realice el proceso en el objeto que se presiona.
Salud OS
#3
Escrito 12 julio 2010 - 08:34
procedure CargaImagen (Contenedor: TImage); begin // Código que carga la imágen utilizando la variable Contenedor para ello 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 !
#4
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"...
#5
Escrito 12 julio 2010 - 08:44
Saludox !
#6
Escrito 12 julio 2010 - 09:00
Porqué no pones tu código y te regresamos un ejemplo de uso del Sender ?
Saludox !
Por que no sé hacerlo.
#7
Escrito 12 julio 2010 - 09:10
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
procedure TForm1.Image1DblClick(Sender: TObject); begin if Sender is TImage then Timage(Sender).Picture.LoadFromFile('miarchivo'); end;
#8
Escrito 12 julio 2010 - 09:14
Declaré un procedimiento así:
procedure CargaImagen(Contenedor: TImage);
Después hice:
procedure TForm1.CargaImagen(Contenedor: TImage); begin if AbreImagen.Execute then Contenedor.Picture.LoadFromFile(AbreImagen.FileName); end;
Y en cada evento de los TImage:
procedure TForm1.Image1Click(Sender: TObject); begin CargaImagen(Image1); end; procedure TForm1.Image2Click(Sender: TObject); begin CargaImagen(Image2); end;
Es lo mejor ?... tal vez no... Funciona ? Si...
Saludox !
#9
Escrito 12 julio 2010 - 09:17
procedure TForm1.Image1Click(Sender: TObject); begin CargaImagen(Sender as TImage); end; procedure TForm1.Image2Click(Sender: TObject); begin CargaImagen(Sender as TImage); end;
#10
Escrito 12 julio 2010 - 09:17
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:
procedure TForm1.Image1Click(Sender: TObject); begin end;
3. Luego añade una instrucción como esta:
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:
mitag := TComponent(Sender).Tag; case miTag of: ....
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,
#11
Escrito 12 julio 2010 - 09:17
Yo hice otro ejemplito...
Deja lo pruebo.
#12
Escrito 12 julio 2010 - 09:24
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,
#13
Escrito 12 julio 2010 - 10:22
Me choca trabajar con gráficos, en serio que no domino el tema...