Секреты Delphi. Эмуляция нажатия клавиши Enter

Секреты Delphi. Эмуляция нажатия клавиши Enter

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

Сергей Бердачук, Berdachuk@tochka.by


Компьютерная газета. Статья была опубликована в номере 42 за 2003 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета