ярлык менеджера действий Delphi для +, -, введите для действий - PullRequest
2 голосов
/ 28 декабря 2011

я работаю над delphi 7 , и у меня есть приложение, в котором я использую менеджер действий для создания действий и последующего назначения им ярлыков, ярлыки в диспетчере действий уже определены в ярлык свойство..но я хочу, чтобы ярлык был как

 1. ADD ,that is the + on the numpad
 2. Subtract key ,that is the - on the numpad
 3. divide key  , that is the / on the numpad.
 4. enter key

я пытался назначить свой собственный ярлык как вычитать и ДОБАВИТЬ он выдает мне это сообщение об ошибке enter image description here

я тоже пытался - но ничего не происходит

мой код для отслеживания действия

  var
      Action : TBasicAction;
      begin
        Action := Sender as TBasicAction;
       if (Action is TAction) and not TAction(Action).Enabled then   exit;
      case Action.tag of
        1                  :         ShowMessage('ADD + pressed');
        2                  :         ShowMessage ('divide / pressed');
        3                  :         ShowMessage ('subtract - pressed');
        4                  :         ShowMessage ('enter pressed');
      end;

   end;

я могу использовать обычный

   **GetKeyState(VK_ADD) AND 128)=128;** OR **GetKeyState(VK_return) AND 128)=128;** 

, чтобы найти его при нажатии клавиш в событии нажатия клавиши или нажатия клавиши, но я хочу использовать сочетания клавиш диспетчера действий

Ответы [ 3 ]

8 голосов
/ 28 декабря 2011

Вы можете назначить их во время выполнения:

Action1.ShortCut := menus.ShortCut(VK_ADD, []);
Action2.ShortCut := menus.ShortCut(VK_SUBTRACT, []);
7 голосов
/ 28 декабря 2011

Эти ключи имеют следующие специальные имена, которые могут быть назначены непосредственно через свойство ShortCut в Инспекторе объектов.

  • NUM ADD
  • NUM SUB
  • NUMMULT
  • /

Я не уверен насчет цифровой клавиатуры Введите ключ. Я не знаю, имеет ли оно специальное имя или действительно, если его можно отличить от обычного Введите , используя клавишу быстрого вызова.

Обновление

Оказывается, что названия этих ключей различаются от машины к машине. Франсуа отмечает, что имена взяты из функции Windows API GetKeyNameText, на что указывает документация:

Формат строки имени ключа зависит от текущей раскладки клавиатуры. Драйвер клавиатуры поддерживает список имен в виде символьных строк для клавиш с именами длиннее одного символа. Имя клавиши переводится в соответствии с раскладкой установленной на данный момент клавиатуры, поэтому функция может давать разные результаты для разных языков ввода.

Например, Sertac обнаружил, что в его системе имена NUM +, NUM - и т. Д.

Я сгенерировал значения, вызвав ShortcutToText, и вы можете сделать то же самое, чтобы сгенерировать имена, подходящие для вашей системы.

1 голос
/ 28 декабря 2011

Вы не можете просто придумывать имена для ключей и ожидать, что инспектор объектов поймет, что вы имеете в виду. Свойство ShortCut не является строкой; это TShortCut, и ему может быть назначено только значение, которое может быть преобразовано в TShortCut.

На клавиатуре нет клавиш с именами ADD, subtract или divide, и поэтому они не могут быть назначены как таковые для ShortCut; они не существуют, поэтому их нельзя преобразовать в TShortCut.

Вы можете установить ярлык непосредственно на + , - , / и Ввести (значения +, -, / и Enter), и они должны работать нормально. (Хотя назначение общих одиночных нажатий клавиш обычно не очень хорошая идея - если форма имеет только одну вещь, которую она может сделать в ответ на клавишу +, это может быть хорошо; если есть элемент управления для редактирования или что-то, что также может получить + разумно, тогда это ужасная идея, потому что действие ярлыка может сработать, когда пользователь не намерен это делать).

Как указывает Дэвид, это не поднимет требование цифровой клавиатуры. Для этого вам нужно будет присвоить ShortCut в коде:

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddAction.ShortCut := Shortcut(VK_ADD, []);
  SubtractAction.ShortCut := ShortCut(VK_SUBTRACT, []);
  DivideAction.ShortCut := ShortCut(VK_DIVIDE, []);
end;

Однако я не могу найти никакого различия между вводом NUMPAD и обычным вводом, используя определения виртуальных ключей. Возможно, вам потребуется сделать это с помощью модификатора или событий нажатия клавиш.

Что касается определения того, какой из них использовался, вы должны называть их соответствующим образом (как в AddAction, SubtractAction, DivideAction и EnterAction), а затем вы можете ссылаться на них по имени в события OnUpdate или OnExecute:

if (Sender = TAddAction) then // Add keypress fired
  DoAddAction
else if (Sender = TSubtractAction) then
  DoSubtractAction
// etc
...