Почему мое управление не примет ввод с клавиатуры?

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

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

5
задан Mason Wheeler 12 May 2010 в 12:40
поделиться

5 ответов

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

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

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

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

  if CanFocus then
    SetFocus;
end;
4
ответ дан 18 December 2019 в 13:11
поделиться

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

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

2
ответ дан 18 December 2019 в 13:11
поделиться

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

Я обрабатываю следующее, но ничего особенного:

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;
1
ответ дан 18 December 2019 в 13:11
поделиться

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

0
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: