Ir al contenido


Foto

[RESUELTO] Evento click de MenuItem en ejecución


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

#1 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 28 septiembre 2010 - 11:30

Pretendo agregar en un menú en tiempo de ejecución información desde un archivo ini para controlar favoritos o archivos recientes, por ej.
Consigo mediante este código agregar los Items.




delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   i: Integer;
  4.   NuevoItem: TMenuItem;
  5. begin
  6.   for i:= 0 to 3 do
  7.   begin
  8.   NuevoItem:=TMenuItem.Create(self);
  9.   MainMenu1.Items[0].Items[1].Add(NuevoItem);
  10.   NuevoItem.Caption := 'Agregado ' + IntToStr(i);
  11.   end;
  12.  
  13. end;



Lo que no consigo hacer es manejar el evento click de uno de los Items creados para que se haga algo, por ej. lanzar un ShowMessage.

He Probado con códigos como este:



delphi
  1. procedure TForm1.FormClick(Sender: TObject);
  2. var
  3.   i:integer;
  4.  
  5. begin
  6.  
  7. for i:= 0 to Mainmenu1.Items[0].Items[1].Count -1 do
  8. begin
  9.       if mainmenu1.Items[i].Caption = 'Agregado 2' then
  10.       mainmenu1.Items[i].Click:=ShowMessage('Hola');
  11.  
  12. end;
  13. end;


Si me pueden dar alguna orientación se los agradecería.
Un saludo

Nota:Adjunto el ejemplo

Archivos adjuntos


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 septiembre 2010 - 11:46

Pues debes hacer uso del Evento OnClick:



delphi
  1. mainmenu1.Items[i].OnClick := 'Nombre del procedimiento';



Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2010 - 11:47

Hola

Yo usaría el evento Onclick de uno los Items y lo asigno a todos los items del menu, algo Así:



delphi
  1. procedure TForm1.Uno1Click(Sender: TObject);
  2. begin
  3.   ShowMessage((Sender as TmenuItem).Caption);
  4. end;



Con eso te va a mostrar el caption de cualquier Item que selecciones con el Clic.

Salud OS
  • 0

#4 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 28 septiembre 2010 - 12:18

Hola de nuevo.
Disculpen pero no me sale.
¿Podrían en el ejemplo que adjunté hacer que al hacer click en Archivo\recientes\Agregado 2  se muestre un message 'Agregado dos' y que esto sólo suceda si es este Item el clickeado?
Gracias por la paciencia
Un saludo
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2010 - 12:27

Aquí me parece que hay dos opciones, utilizamos el mismo concepto de usar solo un evento OnClick para todos los items.

1. Utilizar el Tag del Item y hacer esto:



delphi
  1. procedure TForm1.Uno1Click(Sender: TObject);
  2. var
  3.   Etiqueta: string;
  4. begin
  5.   case (Sender as TmenuItem).Tag of
  6.     1: Etiqueta := 'Agregado UNO';
  7.     2: Etiqueta := 'Agregado DOS';
  8.   end;
  9.   ShowMessage(Etiqueta);
  10. end;



2. Utilizar el Hint del Item y hacer esto:



delphi
  1. procedure TForm1.Uno1Click(Sender: TObject);
  2. begin
  3.   ShowMessage((Sender as TmenuItem).Hint);
  4. end;


  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2010 - 12:30

Adjunto el código

Salud OS

Archivos adjuntos


  • 0

#7 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 28 septiembre 2010 - 01:09

Hola egostar:
Algo estoy haciendo mal. Aunque creo entender la idea quje me has dado no me sale.
Te adjunto mi prueba dinde trato de aplicar tu sugerencia.
Muchas gracias

Archivos adjuntos


  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 septiembre 2010 - 01:42

Ya vi cual es el asunto, tu lo que estás haciendo es creando en tiempo de ejecución los items del menu.

Sólo se requiere de unos pequeños ajustes.



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3.   i: Integer;
  4.   NuevoItem: TMenuItem;
  5. begin
  6.   for i:= 0 to 3 do
  7.   begin
  8.     NuevoItem:=TMenuItem.Create(self);
  9.     MainMenu1.Items[0].Items[1].Add(NuevoItem);
  10.     NuevoItem.Caption := 'Agregado ' + IntToStr(i);
  11.     //Le asignamos un Tag
  12.     NuevoItem.Tag := i + 1;
  13.     //Le asignamos el evento al que debe hacer referencia
  14.     NuevoItem.OnClick := Recientes1Click;
  15.   end;
  16.  
  17. end;
  18.  
  19. procedure TForm1.Recientes1Click(Sender: TObject);
  20. var
  21.   Etiqueta: string;
  22. begin
  23.   case (Sender as TmenuItem).Tag of
  24.     1: Etiqueta := 'Agregado UNO';
  25.     2: Etiqueta := 'Agregado DOS';
  26.     3: Etiqueta := 'Agregado TRES';
  27.     4: Etiqueta := 'Agregado CUATRO';
  28.   end;
  29.   ShowMessage(Etiqueta);
  30. end;



Salud OS
  • 0

#9 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 septiembre 2010 - 01:45

Hola
Aqui esta tu ejemplo pero usando la idea de Egostar, mas o menos.
Saludos

Archivos adjuntos


  • 0

#10 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 28 septiembre 2010 - 03:24

Muchas gracias enecumene, egostar y Caral. Ahora entiendo la explicación y el ejemplo corregido funciona perfectamente
El problema está RESUELTO
Un saludo


  • 0

#11 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 septiembre 2010 - 03:37

Hola
Otro caso resuelto por el equipo de DelphiAcess....... (y) (b)
[move]...DelphiAccess,...DelphiAccess..... ra, ra, ra,............ (b).[/move]
Saludos
  • 0




IP.Board spam blocked by CleanTalk.