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)-4, 4);
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) + 1, 1); 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), 0, 0); // 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), 0, 0); 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), 0, 0); 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;
|