Menus - manter aberto o ultimo menu clicado

Top  Previous  Next

// Gambiarra elevada ao cubo... manter aberto o ultimo menu clicado

// pensei ser impossivel. depois de quase um dia inteiro xeretando

// na net, google, menus.pas, e depois de ter desistido, eu resolvi

// testar um exemplo no news e funcionou!

 

var

  LastMenuItem: TMenuItem;

  LastMenuID  : Integer = 0;

 

procedure TForm1.CapturaMenu(M: TMenuItem);

var

  CaminhoMenu: string;

  Pai: TMenuITem;

  I, NSep: Integer;

  procedure CapturaCaminhoMenu(Sub: TMenuItem);

  begin

    CaminhoMenu := StrTran(Sub.Caption, '&''') + ' -> ' + CaminhoMenu;

    if Sub.Parent.Name <> '' then

      CapturaCaminhoMenu(Sub.Parent);

  end;

begin

  CaminhoMenu := '';

  CapturaCaminhoMenu(M);

  Delete(CaminhoMenu, Length(CaminhoMenu)-44);

 

  if par.copiar_clipboard then Clipboard.AsText := CaminhoMenu;

 

  LastMenuItem := M;

  LastMenuID   := LastMenuItem.MenuIndex;

 

  // tenho que descobrir quantos separadores eu tenho até o LastMenuItem...

  if LastMenuItem.Parent is TMenuItem then

  begin

    Pai := TMenuItem(LastMenuItem.Parent);

    NSep := 0;

    for I := 0 to Pai.Count-1 do

    begin

      if Pai.Items[I].IsLine then Inc(NSep);

      if LastMenuID = Pai.Items[I].MenuIndex then Break;

    end;

    LastMenuID := LastMenuID - NSep;

  end;

end;

 

procedure TForm1.ReabrirUltimoMenu;

var

  Teclas: string;

  I     : Integer;

  procedure PegaTeclas(M: TMenuItem);

  begin

    Teclas := Teclas + Copy(M.Caption, Pos('&', M.Caption) + 11);

    if M.Parent.Name <> '' then

      PegaTeclas(M.Parent);

  end;

begin

  Teclas := '';

  if LastMenuItem = nil then Exit;

  // captura hotkeys do ultimo menu

  PegaTeclas(LastMenuItem);

  Teclas := UpperCase(StrUtils.ReverseString(Teclas));

  Delete(Teclas,Length(Teclas),1);

  // ativa tecla MENU

  keybd_event(VK_MENU, MapVirtualkey(VK_MENU, 0), 00);

  // chama sequencia de teclas de atalho até o menu especificado (1 antes)

  for I := 1 to Length(Teclas) do

  begin

    keybd_event(Ord(Teclas[I]), MapVirtualKey(Ord(Teclas[I]),0), 00);

    keybd_event(Ord(Teclas[I]), MapVirtualKey(Ord(Teclas[I]),0), KEYEVENTF_KEYUP, 0);

  end;

  // percorre usando seta abaixo até o menu desejado

  for I := 0 to LastMenuID-1 do

  begin

    keybd_event(vk_down, MapVirtualKey(vk_down,0), 00);

    keybd_event(vk_down, MapVirtualKey(vk_down,0), KEYEVENTF_KEYUP, 0);

  end;

  // desativa tecla menu

  keybd_event(VK_MENU, MapVirtualkey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);

end;

 

procedure TForm1.TODOS_OS_MENUSClick(Sender: TObject);

begin

  if Sender is TMenuItem then CapturaMenu(TMenuItem(Sender));

  ...  comandos ...

  ...  comandos ...

  ...  comandos ...

  ReabrirUltimoMenu;

end;