BERDAFLEX Software Systems
Главная > Delphi > Эмуляция нажатия клавиши Enter

Эмуляция нажатия клавиши Enter

История переиздания
Издание 1.0 Октябрь 2003 г. Сергей Бердачук

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

Решается данная проблема достаточно просто. Воспользуемся системным сообщением WM_NEXTDLGCTL, которое перемещает фокус курсора на следующий (или предыдущий, в зависимости от параметров) элемент управления. Для генерации данного сообщения добавим общий для формы обработчик нажатий клавиш FormKeyPress. После чего, назначим данный обработчик на все элементы управления. В общем случае, решение об изменении поведения обработчика нажатий клавиш должен решать пользователь. Для определения разрешения на перехват нажатия клавиш введем глобальную переменную gEnterToTab, значение которой можно устанавливать в отдельной форме настроек. В листинге приведен типовой код такого обработчика нажатия клавиш.

procedure TfrmConstrObject.FormKeyPress(Sender: TObject; var Key: Char);
begin  
  if (Key=#13) and (gEnterToTab)  then
   begin
      //Enter->Эмуляция нажатия клавиши Tab
      if (ActiveControl.Tag in [1,2]) then
        begin
          Key := #0;                     // «съедаем» код клавиши
          PostMessage( Self.Handle, WM_NEXTDLGCTL, 0, 0);
        end
      else if (ActiveControl.Tag = 3) and (Not TDBLookupComboBox(ActiveControl).ListVisible) then
        begin
          Key := #0;                     // «съедаем» код клавиши
          PostMessage( Self.Handle, WM_NEXTDLGCTL, 0, 0)
        end
  end
 else if (Key=#38) and (gEnterToTab)  then
  //Up->Эмуляшия нажатия Shift+Tab 
  //для движения на предыдущий элемент управления
  if ActiveControl.Tag <> 2 then //На «первом» элементе останавливаемся
          PostMessage( Handle, WM_NEXTDLGCTL, 1, 0);
  Application.ProcessMessages;
end;

Особенностью данного примера является использование свойства Tag для идентификации элементов управления. Дело в том, что некоторые элементы управления требуют дополнительного анализа текущего состояния. Например, для элемента TDBLookupComboBox нужно предварительно проверить, не развернут ли список выбора элементов. И в случае если список развернут, то оставляем стандартный обработчик. В данном примере реализован так же перехват нажатия клавиши «Up», и эмуляция нажатия клавиш Shift+Tab. Но на практике, пользователи для возврата на предыдущий элемент управления чаще всего пользуются мышкой.

Rambler's Top100 Рейтинг@Mail.ru