Использование клавиши "Enter" подобно клавише "Tab" в элементах управления Delphi
Приведенный здесь пример кода демонстрирует алгоритм перехвата клавиш "Enter" и курсорных клавиш для обеспечения комфортного ввода данных.
Хитрость заключается в переписывании событий Keypress и KeyDown для обработки нажатий любых клавиш. В предоставленном примере я использовал клавишу "Enter" для перемещения к следующему элементу управления (подобно клавише "Tab") и клавиши Up и Down для перемещения к предшествующему и следующему элементу соответственно.
Edit и EBEdit используют клавиши как было сказано выше, но Combobox и Listbox используют Shift-Up и Shift-Down для того, чтобы не создавать помехи существующему функциональному назначению.
Компонент Grid использует клавишу "Enter" для перемещения между полями, тем не менее использование "Enter" не позволяет переместиться из последнего поля последней строки. Это легко позволяет сделать так, чтобы выход из сетки происходил из необходимой точки.
Метод использует для перемещения на следующий/предыдущий элемент управления вызов Windows API функции SendMessage, которая посылает сообщение WM_NEXTDLGCTL форме, для которой данный элемент является дочерним. Для получения дескриптора родительской формы Delphi осуществляет вызов функции GetParentForm.
Данный код открыт для расширения функциональности, например, на реакцию события при нажатии почти любой клавиши, и я думаю, что использование данного метода является лучшим решением, чем организация перехвата клавиш в событиях формы OnKey (используя keypreview:=true).
Код абсолютно свободен для распространения и использования, но если вы нашли ошибку или хотите предложить что-то новое, пожалуйста сообщите мне об этом!
{ Код, дающий функциональность клавиши "Tab" клавише "Enter", позволяющийпри нажатии на последнюю переместиться к следующему элементу управления.Так как событие KeyPress переделано незначительно, данный код стабильноработает и с компонентом TDBedit, полезным для ввода данных в приложении.Я думаю, что использование данного кода является лучшим решением, чеморганизация перехвата клавиш в событиях формы OnKey (keypreview:=true). Код абсолютно свободен для использования и распространения. Simon Callcott CIS: 100574, 1034} unit Entedit; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls; type TEnterEdit = class(TEdit)private protected procedure KeyPress(var Key: Char); override;procedure KeyDown(var Key: Word; Shift: TShiftState); override; public published end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TEnterEdit]);end; procedure TEnterEdit.KeyPress(var Key: Char); var MYForm: TForm;begin if Key = #13 thenbeginMYForm := GetParentForm( Self );if not (MYForm = nil ) thenSendMessage(MYForm.Handle, WM_NEXTDLGCTL, 0, 0);Key := #0;end; if Key <> #0 then inherited KeyPress(Key); end; procedure TEnterEdit.KeyDown(var Key: Word; Shift: TShiftState); var MYForm: TForm;CtlDir: Word;begin if (Key = VK_UP) or (Key = VK_DOWN) thenbeginMYForm := GetParentForm( Self );if Key = VK_UP then CtlDir := 1else CtlDir :=0;if not (MYForm = nil ) thenSendMessage(MYForm.Handle, WM_NEXTDLGCTL, CtlDir, 0);endelse inherited KeyDown(Key, Shift); end; end. |
|
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);beginIf Key = #13 ThenBeginSelectNext(Sender as tWinControl, True, True );Key := #0;end;end; |
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);beginIf Key = #13 ThenbeginSelectNext(ActiveControl as tWinControl, True, True );Key := #0;end;end; |
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char); beginif Key = #13 then beginKey := #0;PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);end;end; |