Студия/OnKeyPress

From SunFlurry wiki
Jump to: navigation, search
  OnKeyPress (Визуальные события)
Применимость:Форма, Список значений, Таблица значений, Дерево значений
Тип события:Прерывающее
Статус разработки: Реализована

Событие, возникающее при нажатии на клавишу клавиатуры, когда текущий элемент или форма активны. Не все комбинации могут быть пойманы в этом событии. Это событие используется для табличных элементов, для полей используется событие OnBeforeChange. Важно: для формы используется более сложный механизм отлова нажатия, под Windows это приводит к тому, что во время исполнения события строго не рекомендуется изменение графических свойств формы. Система пытается обойти это ограничение, однако, без реальной необходимости обработчик должен совершить невизуальные действия и вернуть управление.

Аргументы

  • <Key (INT)> - Виртуальный код нажатой клавиши (см. документацию Windows, используются коды клавиш, типа VK_BACK и т.п.). Большинство цифровых или литерных клавиш имеют коды, совпадающие с кодами ASCII.
  • <KeyCombo (STRING)> - Визуальное представление нажатой клавиши совместно с клавишами модификаторами. К примеру, "Ctrl+A". Для проверки активности клавиш-модификаторов можно также использовать функцию IsKeyComboActive.
  • <Char (STRING)> - Результат преобразования виртуального кода в введенный символ с учетом текущего языка и модификаторов клавиатуры. Если использовалась несимвольная клавиша, данный параметр будет пустой строкой.
  • <Result (INT)> - (возможен аргумент-переменная (ByRef)) Переменная результата может принимать значения:
    • 0 (по умолчанию) -- Принять нажатие (разрешить передачу этого нажатия клавиши активному элементу формы).
    • 1 -- Отвергнуть нажатие (нажатие клавиши будет проигнорировано).

Примеры

//Эмуляция поведения при нажатии Ctrl+Up, Ctrl+Down в таблице, где работа с папками задается программно (к примеру, отображается файловая система).
//Ctrl+Up 
MainTab:=Form.MainTab.Value;
If (Key=38)And(IsKeyComboActive("Ctrl")) Then
  Result:=1;
  //Выйти из текущего уровня, если он не верхний
  If спУровень.Size()>0 Then
    iNum:=спУровень.Size();
    ТекЭлемент:=спУровень.Get(iNum);
    //Создать отображение всего пути
    ТекПапка:="";
    For i:=1 To iNum-1 Do
      ТекПапка:=ТекПапка+спУровень.Get(i)+"\";
    EndDo;
    ОбновитьТаблицу();
  EndIf;
//Ctrl+Down
ElseIf (Key=40)And(IsKeyComboActive("Ctrl")) Then
  //Тоже самое, что Enter, если курсор находится на папке
  Result:=1;
  If MainTab.SelectedLine=0 Then
    Exit;
  EndIf;
  MainTab.CurLine:=MainTab.SelectedLine;
  //Проверим, находимся ли мы на папке (с помощью номера иконки, к примеру)
  If MainTab.Icon(MainTab.CurLine,"Иконка")=98 Then
    ТекЭлемент:=MainTab.Наименование;
    ТекПапка:=ТекПапка+MainTab.Наименование+"\";
    ОбновитьТаблицу();
  EndIf;
EndIf;