Советы по Delphi

         

Как? Клавиша ENTER вместо клавиши TAB I


Вот что я нашел на Compuserve, это должно помочь.

Использование клавиши "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 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.

Решение 2

В. "Есть ли какое-нибудь решение, чтобы использовать клавишу Enter вместа Tab или мыши?"

О. Используйте этот код для обработчика события OnKeyPress компонента Edit:

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin If Key = #13 Then Begin SelectNext(Sender as tWinControl, True, True ); Key := #0; end; end;

Это заставляет клавишу Enter вести себя подобно клавише Tab. Теперь произведите выбор всех элементов управления на форме (кроме кнопок), для которых вы хотели бы применить данное поведение, и назначьте им в Инспекторе Объектов для события OnKeyPress уже созданный нами обработчик EditKeyPress. Теперь каждый компонент, выбранный вами, будет обрабатывать клавишу Enter подобно клавише Tab. Если вы хотите передать функциональность на другой родительский уровень (по сравнению с элементами управления), сбросьте у всех компонентов событие OnKeyPress (просто сотрите название обработчика) и назначьте _формам_ для события OnKeyPress обработчик EditKeyPress. Затем измените Sender на ActiveControl и присвойте свойству форм KeyPreview значение True:

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin If Key = #13 Then begin SelectNext(ActiveControl as tWinControl, True, True ); Key := #0; end; end;

Это заставит клавишу Enter вести себя подобно клавише Tab для всех (возможных) элементов управления. [000142]



Содержание раздела