История переиздания | ||
---|---|---|
Издание 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. Но на практике, пользователи для возврата на предыдущий элемент управления чаще всего пользуются мышкой.