Почему мой пользовательский элемент управления не получает фокус сам по себе?

Я работаю над пользовательским элементом управления, унаследованным отTCustomControl. Я переопределяю несколько событий, таких какKeyDownчтобы я мог захватывать ввод с клавиатуры и мыши. Однако по какой-то причине он не получает автоматически фокус, когда пользователь щелкает по нему. Я должен добавить вMouseDownсобытие, и только тогда оно действительно получает фокус. Но я почти уверен, что мне не следует этого делать. Почему это происходит и как это исправить, чтобы он сам получал фокус без ручного вызоваSetFocus?

  • Пользовательский контрольTabStopустановлено наTrue.
  • Родительская форма элемента управления (и все формы) имеетKeyPreviewустановлен вFalse.

Я определяю эти методы следующим образом:

      type
  TMyControl = class(TCustomControl)
  ...
  protected
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    ...
  end;

И затем реализация:

      procedure TMyControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited;
  ...
  Invalidate;
end;

procedure TMyControl.KeyPress(var Key: Char);
begin
  inherited;
  ...
  Invalidate;
end;

procedure TMyControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
  inherited;
  ...
  Invalidate;
end;

procedure TMyControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  SetFocus; //<-- This shouldn't be necessary...?
  ...
  Invalidate;
end;

procedure TMyControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  ...
  Invalidate;
end;

procedure TMyControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  ...
  Invalidate;
end;

0 ответов

Другие вопросы по тегам