Como um tcustomControl recebe foco de entrada?
-
22-09-2019 - |
Pergunta
Estou escrevendo um controle de grade que baseei no TcustomControl para que eu possa lidar com toda a estrutura, pintura e navegação. A parte que não consigo descobrir é a seguinte:
No meu construtor, defino o estilo de controle para isso:
ControlStyle := ControlStyle + [csCaptureMouse, csClickEvents,
csDoubleClicks, csNeedsBorderPaint, csPannable];
A idéia é que, se o controle lida com eventos do mouse, posso fazer coisas como seleção de conjuntos, etc. Notei, embora o controle nunca receba o foco. Por acaso, tenho um TCombobox no formulário e ele está claramente focado quando o formulário é criado. Não importa quantas vezes eu clique na minha grade, o foco permanece no ComboBox.
É claro que isso também tem implicações para o meu manuseio de eventos de teclado.
Portanto, a questão é: como é determinado que o foco deve mudar para um controle quando você clica nele?
Solução
O CustomControl deve chamar o SetFocus quando for clicado.
procedure TMyCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited;
if not (csDesigning in ComponentState) and CanFocus then
SetFocus;