Клавиша ENTER вместо клавиши TAB. Вариант 2


Приведенный здесь пример кода демонстрирует алгоритм перехвата клавиш "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 then
begin
MYForm := GetParentForm( Self );
if not (MYForm = nil ) then
SendMessage(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) then
begin
MYForm := GetParentForm( Self );
if Key = VK_UP then CtlDir := 1
else CtlDir :=0;
if not (MYForm = nil ) then
SendMessage(MYForm.Handle, WM_NEXTDLGCTL, CtlDir, 0);
end
else inherited KeyDown(Key, Shift);

end;

end.

 
« Предыдущая статья   Следующая статья »