Почему мой элемент управления не принимает ввод с клавиатуры? - PullRequest
5 голосов
/ 12 мая 2010

Я создал пользовательский элемент управления, в который я пытаюсь отправить ввод. Он будет принимать ввод с помощью мыши и правильно сообщать MouseDown, MouseMove и MouseUp, но по любой причине он не будет принимать ввод с клавиатуры. Когда я нажимаю на него, он не получает фокус, и любые нажимаемые клавиши интерпретируются любым элементом управления, на котором уже был фокус.

Это, наверное, что-то действительно простое. Первое, что я хотел посмотреть, было в свойстве ControlStyle, но единственное, что я вижу в справочном файле о вводе с клавиатуры, это csNoStdEvents, который отключает его, и у моего элемента управления его нет. Так что мне нужно сделать, чтобы мой элемент управления мог получать фокус ввода?

Ответы [ 5 ]

7 голосов
/ 12 мая 2010

Несколько вещей, чтобы попробовать:

  • Вкл. MouseDown, звоните Windows.SetFocus(Handle).По моему опыту, функция WinAPI SetFocus часто работает лучше, чем метод SetFocus VCL.
  • В ответ на сообщение WM_GETDLGCODE ответьте Message.Result := Message.Result or DLGC_WANTCHARS or DLGC_WANTARROWS or DLGC_WANTTAB or DLGC_WANTALLKEYS;
4 голосов
/ 12 мая 2010

Может ли это быть так же просто, как вызвать SetFocus при нажатии мыши?

procedure TYourCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
begin
  inherited;

  if CanFocus then
    SetFocus;
end;
2 голосов
/ 12 мая 2010

У вас есть WS_TABSTOP набор? Я полагаю, у вас нет фокуса ввода без этого. Но это основано на воспоминаниях почти 10 лет назад, когда я писал свой собственный редактор кода с подсветкой синтаксиса, для которого я давно потерял источник.

{TWinControl.}TabStop := True; должен сделать. Приложение для быстрого тестирования с компонентом "ничего не делать", полученным из TWinControl, и отображением диалогового окна для ключевых событий, похоже, показывает, что оно имеет все значение.

1 голос
/ 12 мая 2010

Я проверил код для своего контроля и не вижу ничего, что могло бы остановить эту работу. Вы называете «унаследованным» в процедуре создания?

Я справляюсь со следующим, но ничего особенного:

procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;

procedure KeyDown(var Key: Word; Shift: TShiftState); override;
0 голосов
/ 12 мая 2010

Доступно ли нажатие клавиши на уровне формы?То есть включен ли KeyPreview и видите ли вы нажатие клавиши в событии OnKeypress формы?Вы можете следить за этим отладчиком.Подходит ли управление (как указано Даном) для ввода с клавиатуры?Например, TLabel, хотя и отображает текст, является графическим элементом управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...