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