Шоткаты Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Шоткаты Lazarus

Сообщение ssl » 20.08.2013 21:14:16

А никого не смущает алгоритм проверки ГК (гор. клавиш) в Лазаре? Судя по коду, форма тупо сканирует ВСЕ доступные ей Actions. То есть, ни вложенность контролов, ни назначенные PopupMenu с ГК (но без Action) никак не учитываются. Это ж какие OnUpdate надо писать на Action, что б, например, срабатывали только те ГК, что назначены контролам активной закладки PageControl? Или я чего не понимаю?
Для себя я сделал такой алгоритм:

Код: Выделить всё
type THackAction = class(TCustomAction) end;

function IsActionShortCut(Action: TBasicAction; Sh: TShortCut): boolean;
var ac: THackAction;
begin
  ac:= THackAction(Action);
  result:= assigned(ac) and (ac is TCustomAction) and (
             (ac.ShortCut = Sh) or
             (Assigned(ac.SecondaryShortCuts) and
             (ac.SecondaryShortCuts.IndexOfShortCut(Sh) >= 0)) and
             THackAction(ac).HandleShortCut );
end;

procedure TForm1.FormShortCut(var Msg: TLMKey; var Handled: Boolean);
var Ctl: TControl;
    pm : TPopupMenu;
    Sh : TShortCut;
begin
  Handled := false;
  Sh:= KeyToShortCut(Msg.CharCode, MsgKeyDataToShiftState(Msg.KeyData));
  if Sh = scNone then exit;

  Handled := true;
  if Assigned(Menu) and Menu.IsShortCut(Msg) then exit;

  Ctl:= Screen.ActiveControl;
  while assigned(Ctl) do begin
    pm:= Ctl.PopupMenu;
    if assigned(pm) and pm.IsShortcut(Msg) then exit;
    if IsActionShortCut(Ctl.Action, Sh) then exit;
    Ctl:= Ctl.Parent;
  end;
  Handled := false;
end;
ssl
новенький
 
Сообщения: 59
Зарегистрирован: 17.05.2005 11:27:01

Re: Шоткаты Lazarus

Сообщение Alex2013 » 21.08.2013 16:01:49

А просто в форме включить KeyPreview не получается ?
И повесить "глобальный обработчик" клавиатуры на form.onKey...
Alex2013
долгожитель
 
Сообщения: 3146
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru