Как отключить beep при нажатии Enter в поле Edit

Федор_Федор
Дата: 23.11.2007 16:51:44
Есть окно Settings. В нем несколько переключателей, чекбоксов и два Edit`а. Для удобства (ускорения работы) хотелось бы, чтобы можно было ввести данные в Edit и сразу нажать Enter, не переключаясь при этом (TABом) с Edit на кнопку "Оk". То есть чтобы нажатие на Enter было равносильно нажатию мышом кнопки OK. Можно ли это сделать - я не знаю, потому сделал так:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   If Key=27 then Form2.Button2.Click; //Esc
   If Key=13 then Form2.Button1.Click; //Ок
end;
Но есть одна проблема. Находясь в Эдите нельзя жать Энтер - иначе появляется beep. У меня получается, что при нажатии энтер слышно beep, а дальше все работает. Как сделать, чтобы этот beep не появлялся?

Спасибо.
Dimitry Sibiryakov
Дата: 23.11.2007 16:55:23

Обнули клавишу. Не зря же она переменной объявлена...

Posted via ActualForum NNTP Server 1.4

DimaBr
Дата: 23.11.2007 16:55:28
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
begin
   If Ord(Key) = Vk_Return  then Key := #0
end;
NextMan
Дата: 23.11.2007 16:57:33
А нельзя ли не просто задать кнопке OK свойство ModalResult = mrOk?
Федор_Федор
Дата: 23.11.2007 17:12:50
Все получилось. Всем спасибо.
Про ModalResult я и не знал...
NextMan
Дата: 24.11.2007 00:10:22
Федор_Федор
Все получилось. Всем спасибо.
Про ModalResult я и не знал...

Только учти, что изменения, введенные в последнем редактируемом TEdit'е не будут зафиксированы. Нужно (например в OnCloseQuery) перевести фокус с него на что-нибудь. Например, на ту же кнопку ОК (недавно писали об этом):
  if ModalResult = mrOk then begin
    if btnOk.CanFocus then              // Фиксация изменений
      btnOk.SetFocus;
Федор_Федор
Дата: 24.11.2007 12:31:12
To NextMan:
Понял. Благодарю.

Я сделал вот так:
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
begin
   If Ord(Key) = Vk_Return  then begin Form2.Button1.Click; Key := #0; end;//Button_Ok
   If Ord(Key)=27 then Form2.Button2.Click;//Button_Esc
end;
Пока вроде бы работает...
grexhide
Дата: 24.11.2007 12:52:56
Федор_Федор
Спасибо.


Короче, не слушай никого, меня слушай.

Методика тут проста:

procedure TXDialog.FormShortKey(Sender: TObject; var Key: Word;
     Shift: TShiftState; var Handled: Boolean);
begin
  inherited;

  if (Key = VK_RETURN) and (Shift = []) and
    not ButtonOk.Default and 
    Assigned(Screen.ActiveControl) and
    IsParent(Self, Screen.ActiveControl) 
  then
    SafeFocus(FindNextControl(Screen.ActiveControl, True, True, False));


  if (Key = VK_RETURN) and (Shift = [ssCtrl]) then
  begin
    ButtonOk.Click;
    Handled := True;
  end;
end;

SafeFocus, IsParent - это просто (в первом специфичная обработка возможных exception плюс проверка параметра на nil,
второй проверяет активный контрол на принадлежность текущему диалогу, я уже не помню, нафига это было надо, но просто так оно бы не появилось).

Ключевой обработчик события - TForm.OnShortKey
grexhide
Дата: 24.11.2007 12:54:52
Федор_Федор
To NextMan:Пока вроде бы работает...

Фигня метод. Не универсальный.

Кроме того, ото так нагло мочить обработку VK_RETURN или #13 - это пипец как нехорошо. У контрола могут быть свои соображения на сей счёт.
Альт
Дата: 24.11.2007 12:57:07
а старый добрый Perform( WM_NEXTDLGCTL, 0, 0 ); уже не в моде?