I am working on a custom control, inherited from a TCustomControl. I am overriding a few events such as KeyDown so that I can capture keyboard and mouse input. However, for whatever reason it is not automatically getting focus on its own when user clicks it. I have to add SetFocus in the MouseDown event, and only then does it actually receive focus. But I'm pretty sure I shouldn't have to do that. Why is this happening, and how do I fix it so that it will get focus on its own without manually calling SetFocus?
- Custom control's
TabStopis set toTrue. - Control's parent form (and all forms) have
KeyPreviewset toFalse.
I am defining these methods like so:
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;
And then the implementation:
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;
It seems that manually calling
SetFocuson your control'sMouseDownhandler is exactly what's required. After all, some controls get a "click" event outside of actual click scenarios, and thus shouldn't automatically get focus. And so, if you want to grab focus from the mouse, you must do so exclusively upon a mouse click.Furthermore, regarding the
TabStopproperty, it only defines whether it gets focus upon the usertabbingbetween controls.TabOrderis directly related, defining in what order it gets focus upon tabs.Perhaps the custom controls you've made in the past were inherited from a specific control which already had this functionality built-in?