Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tecla que llamó al PopupMenu (https://www.clubdelphi.com/foros/showthread.php?t=84550)

gluglu 02-11-2013 16:38:03

Tecla que llamó al PopupMenu
 
Hola a tod@s !

Hace tiempo que no aparezco por aquí ... mis disculpas a todos los que me han echado de menos ! :D

Cuando asigno un PopupMenu a un elemento (por ejemplo un Grid), puedo asignar ShortCuts a cada elemento del PopupMenu. Si asigno a uno de los elementos la tecla 'Del/Supr', al pulsar la tecla Suprimir en el Grid, se ejecuta el evento OnPopup del PopupMenu.

Quiero saber qué tecla ha provocado el evento OnPopup. Para saber si se ha pulsado Supr o si el usuario ha hecho Click Derecho.

Al parecer en el evento OnPopup, en ese momento del OnPopup, no está disponible el (Sender as TMenuItem).Name, por lo que no logro averiguar qué tecla (porque hay varias teclas asociadas a los diferentes ShortCuts) ha provocado la llamada.

He hecho esto :
Código Delphi [-]
procedure TForm.PopupActionBar1Popup(Sender: TObject);
begin

  if not (Sender is TMenuItem) then
    // La llamada fue efectuada con click derecho
  else if (Sender as TMenuItem).Name = 'Nombre del MenuItem asociado a la tecla Supr' then
    .....

Agradecer como siempre vuestra inestimable ayuda !

Saludos

ecfisa 02-11-2013 19:16:28

Hola gluglú.

Disculpas aceptadas :D

No entiendo del todo a donde apunta el capturar la tecla, pero fíjate si esta forma de capturar la tecla Del/Supr te sirve:
Código Delphi [-]
...
type
  TPopupMenu = class(Menus.TpopupMenu)
  protected
    function IsShortCut(var Msg: TWMKey): Boolean; override;
  end;

  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
  ...

implementation

var
  DelKeyPressed : Boolean;

{ TPopupMenu }
function TPopupMenu.IsShortCut(var Msg: TWMKey): Boolean;
begin
  DelKeyPressed := Msg.CharCode = VK_DELETE;
  inherited IsShortcut(Msg);
end;

// Ejemplo, capturar Del en OnPopup
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
   if DelKeyPressed then
    ShowMessage('Presiono la tecla Delete');
end;

Saludos :)

gluglu 02-11-2013 20:19:14

Pues si ... probablemente sirva !! Ahora me pongo con ello ...

No obstante, encontré una solución de otra manera a mi problema.

El asunto surge de la necesidad de 'restringir' ciertas acciones a ciertos usuarios según privilegios. Por ejemplo, en este caso, quiere restringir el poder 'Suprimir' un registro.

Consigo fácilmente ocultar la opción del PopupMenu correspondiente a la tecla de Supr (eso es inmediato), pero el problema es que al estar la opción del PopupMenu asignada a la tecla Supr mediante ShortCut, si pongo esa opción Enabled := False, ni siquiera entra a ejecutar el procedimiento correspondiente a 'Suprimir Registro'. Entonces, lo que pretendía era que si el usuario pulsa el botón derecho del ratón (y no tiene privilegio), la opción de Supr le salga Enabled := False, pero si pulsa directamente la tecla Suprimir sobre el Grid, le salga un 'letrero'.

Si Enabled := False en la opción del Popupmenu, no entra en el procedimiento y no puedo mostrar el cartel. Si pongo el cartel en el evento OnPopup del Menú, entonces SIEMPRE me saldría el cartelito si el usuario no tiene privilegio, y claro ... eso no queda bien.

Cómo lo he hecho finalmente ... Compruebo si 'Sender is TMenuItem' en el evento OnPopup. Si lo es, es que se ha pulsado tecla, y entonces NO pongo Enabled := False, con lo cual acaba yendo al procedimiento de Borrado y ahí puedo mostrar el Cartel. Si no es 'Sender is TMenuItem' entonces se ha pulsado Botón Derecho del ratón para abrir el menú contextual, y entonces después de la comprobación del privilegio pongo Enabled := False.

De esta manera consigo lo que me había propuesto, deshabilitar la opción del Menú contextual en caso de pulsar el botón derecho del ratón (o la tecla de menú contextual del teclado), y poder mostrar el cartel en caso de que se pulsa la tecla Suprimir.

Gracias por la ayuda !!!

;)


La franja horaria es GMT +2. Ahora son las 00:47:02.

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