Почему мой пользовательский элемент управления не получает фокус сам по себе?
Я работаю над пользовательским элементом управления, унаследованным от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;