Ver Mensaje Individual
  #1  
Antiguo 22-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
TActionMainMenuBar con TPopupMenu, una pequeña retribución.

Hace unas semanas me ví en la necesidad de desplegar un TPopupMenu asociado a un TActionMainMenuBar y en Delphi 7,
este componente no trae la posibilidad de hacerlo.
La actualización 'no oficial' del componente, al menos a mí, no me funcionó. Así que hice unas líneas de código que lo logran.
Para usarlo sólo es necesario incluir en la cláusula uses de la interface la unidad PMenuAMMB.

Espero que pueda serle de utilidad a aquellos que usan Delphi 7.

Código Delphi [-]
unit PMenuAMMB;

interface

uses Windows, Messages, Controls, Menus, ActnMenus;

type
  TActionMainMenuBar = class(ActnMenus.TActionMainMenuBar)
  private
    FRect: TRect;
    FPopupMenu: TPopupMenu;
  public
    property PopupMenu: TPopupMenu read FPopupMenu write FPopupMenu;
    procedure MouseEvent(var Msg: TMsg; var Handled: Boolean);
    procedure GetRect;
  end;

implementation

{ +------------------------------------------------------+
  | MouseEvent: Obtiene posición actual del mouse  y     |
  |             despliega el TPopupMenu asociado si      |
  |             la posición está dentro del área que     |
  |             ocupa el ActionMainMenu.                 |
  +------------------------------------------------------+ }
procedure TActionMainMenuBar.MouseEvent(var Msg: TMsg; var Handled: Boolean);
var
  Pt: TPoint;
begin
  if Msg.message = WM_RBUTTONDOWN then // Botón derecho presionado ?
  begin
    Pt:= Mouse.CursorPos; // Obtener posición actual del mouse    
    if (Pt.X >= FRect.Left)and(Pt.Y >= FRect.Top)and // Está sobre el área ?
       (Pt.X <=FRect.Right)and(Pt.Y <= FRect.Bottom) then
      FPopupMenu.Popup(Pt.X, Pt.Y);                  // Desplegar PopupMenu
  end;
end;

{ +------------------------------------------------------+
  | GetRect: Obtiene las coordenadas de las esquinas     |
  |          superior izquierda e inferior derecha del   |
  | ActionMainMenu.                                      |
  | Las almacena en la variable privada FRect.           |
  +------------------------------------------------------+ }
procedure TActionMainMenuBar.GetRect;
var
  P: TPoint;
begin
  P:= ClientOrigin; // Coordenadas esquina superior izqierda
  FRect.Left:= P.X; // Coordenada horizontal esquina sup. izquierda
  FRect.Top:=  P.Y; // Coordenada vertical esquina sup. izquierda
  FRect.Right:= P.X + Width;   // Coordenada horizontal esquina inf. derecha
  FRect.Bottom:= P.Y + Height; // Coordenada vertical esquina inf. derecha
end;

Modo de uso:
Código Delphi [-]
Unit1;

interface

uses Windows,...,PMenuAMMB;

type
 TForm1 = class(TForm)
   ActionMainMenuBar1: TActionMainMenuBar;
   PopupMenu1: TPopupMenu; 
   ...
   procedure FormShow(Sender: TObject); 
 end;

implementation
 ...

procedure TForm1.FormShow(Sender: TObject);
begin
  ActionMainMenuBar1.PopupMenu:= PopupMenu1;
  Application.OnMessage:= ActionMainMenuBar1.MouseEvent;
  ActionMainMenuBar1.GetRect;
end;
...


Saludos.
Responder Con Cita