суббота, 27 апреля 2013 г.

Ещё правки в VCL (6)


function TWinControl.IsMenuKey(var Message: TWMKey): Boolean;
var
  Control: TWinControl;
  {$IfNDef Nemesis}
  // переменная не используется в проекте Немезис
  Form: TCustomForm;
  {$EndIf Nemesis}
  LocalPopupMenu: TPopupMenu;
begin
  if (Message.CharCode = vk_Control) OR (Message.CharCode = VK_SHIFT) OR
     (Message.CharCode = VK_MENU) OR (Message.CharCode = VK_Capital) then {V}
  begin
   // - эти клавиши в одиночку не могут быть ShortCut'ами - значит нечего их пытаться транслировать в
   //   ShortCut.
   Result := false;
   Exit;
  end;//Message.CharCode = vk_Control..
  Result := True;
  if not (csDesigning in ComponentState) then
  begin
    Control := Self;
    while Control <> nil do
    begin
      LocalPopupMenu := Control.GetPopupMenu;
      if Assigned(LocalPopupMenu) and (LocalPopupMenu.WindowHandle <> 0) and
        LocalPopupMenu.IsShortCut(Message) then Exit;
      Control := Control.Parent;
    end;
    {$IfNDef Nemesis}
    // в Немезисе это не нужно, потому, что ShortCut пункта меню вызывается
    // через механизм VCM-а, а если этот код оставить, то на Celeron 333 будут
    // значительные задержки при вводе символов
    Form := GetParentForm(Self);
    if (Form <> nil) and Form.IsShortCut(Message) then Exit;
    {$EndIf Nemesis}
  end;
  with Message do
    if SendAppMessage(CM_APPKEYDOWN, CharCode, KeyData) <> 0 then Exit;
  Result := False;
end;

Комментариев нет:

Отправить комментарий