Переход по контролам

  • Автор темы Maniacosaur
  • Дата начала
M

Maniacosaur

#1
Как лучше сделать, чтобы при нажатии Enter фокус перемещался к следующему контролу (как при TaB).
В настоящий момент я делаю так:
Код:
  if Key=#13 then
     FindNextControl(ActiveControl,true,true,true).SetFocus;
Все бы в этом подходе хорошо, но только при каждом нажатии на Enter система издает звук, аналогичный "Стандартный звук".
 
B

Barmutik

#2
Если без звука то могу посоветовать так:

Код:
 private
 procedure CMDialogKey(var Msg:TWMKey); message CM_DIALOGKEY;

procedure TForm1.CMDialogKey(var Msg: TWMKey);
begin
if Msg.Charcode = 13 then
 Msg.Charcode := 9;
inherited;
end;
Единственное что стоит заметить ... кнопки по вводу нажиматься не будут!!! Это следует учесть! Удачи!
 
Z

zubr

#3
А вот еще способ:
Код:
protected
procedure WndProc(var Message: TMessage);override;

procedure TForm1.WndProc(var Message: TMessage);
begin
If Message.Msg=WM_KEYDOWN then
begin
If Message.WParam=VK_RETURN then
begin 
 FindNextControl(ActiveControl,true,true,true).SetFocus;
 //или любой другой код, который должен выполняться при нажатии enter
 exit;
end;
end;
inherited; 
end;
 
Z

zubr

#4
Извините, это неправильный код. Вот правильно:
Код:
protected
procedure AppMessageHandler(var Msg:TMsg; var Handled:boolean);

var
b:boolean;

procedure TForm1.AppMessageHandler(var Msg:TMsg; var Handled:boolean);
begin
If Msg.message=WM_KEYDOWN then
begin
If Msg.wParam=VK_RETURN then
begin
b:=True;
FindNextControl(Form1.ActiveControl,true,true,true).SetFocus;
//или любой другой код, который должен выполняться при нажатии enter
exit;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
b:=False;
KeyPreview:=True;
Application.OnMessage:=AppMessageHandler;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If b then
begin
b:=False;
Key:=Chr(0);
end;
end;

Кнопки по вводу нажиматься будут!
 
Z

zubr

#5
Извините это неправильный код, вот правильно:
Код:
protected
 procedure AppMessageHandler(var Msg:TMsg; var Handled:boolean);

var
b:boolean;

procedure TForm1.AppMessageHandler(var Msg:TMsg; var Handled:boolean);
begin
If Msg.message=WM_KEYDOWN then
begin
 If Msg.wParam=VK_RETURN then
 begin
  b:=True;
  FindNextControl(Form1.ActiveControl,true,true,true).SetFocus;
  //или любой другой код, который должен выполняться при нажатии enter
  exit;
 end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
b:=False;
KeyPreview:=True;
Application.OnMessage:=AppMessageHandler;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If b then
begin
b:=False;
Key:=Chr(0);
end;
end;
Кнопки по вводу нажиматься будут!