Как убрать фокус с текущего сфокусированного компонента? - PullRequest
6 голосов
/ 15 февраля 2010

У меня есть компонент БД, который вызывается DataLink.UpdateRecord при получении сообщения CM_EXIT. Это сообщение отправляется, когда оно теряет фокус. Когда я нажимаю кнопку публикации, она не теряет фокус и значение не записывается в источник данных. Как можно добиться эффекта потери компонента, не переключая его на другой?

Ответы [ 4 ]

10 голосов
/ 15 февраля 2010

Вы можете использовать:

procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);
8 голосов
/ 15 февраля 2010

Мы осуществляем это, устанавливая Self.ActiveControl: = nil. Это вызывает срабатывание всех событий выхода. В нашем случае мы хотели также переориентироваться на элемент управления после сохранения. Это потребовало нескольких дополнительных проверок, чтобы обеспечить хороший контроль, который мог бы принять фокус.

procedure TSaleEditor.SaveCurrentState();
var
  SavedActiveControl: TWinControl;
  AlternateSavedControl: TWinControl;
begin

  // Force the current control to exit and save any state.
  if Self.ActiveControl <> nil then
  begin
    SavedActiveControl := Self.ActiveControl;

    // We may have an inplace grid editor as the current control.  In that case we
    // will not be able to reset it as the active control.  This will cause the
    // Scroll box to scroll to the active control, which will be the lowest tab order
    // control.  Our "real" controls have names, where the dynamic inplace editor do not
    // find an Alternate control to set the focus by walking up the parent list until we
    // find a named control.
    AlternateSavedControl := SavedActiveControl;
    while (AlternateSavedControl.Name = '') and (AlternateSavedControl.Parent <> nil) do
    begin
      AlternateSavedControl := AlternateSavedControl.Parent;
    end;

    Self.ActiveControl := nil;

    // If the control is a radio button then do not re-set focus
    // because if you are un-selecting the radio button this will automatically
    // re-select it again
    if (SavedActiveControl.CanFocus = true) and
      ((SavedActiveControl is TcxRadioButton) = false) then
    begin
      Self.ActiveControl := SavedActiveControl;
    end
    else if (AlternateSavedControl.CanFocus = true) and
      ((AlternateSavedControl is TcxRadioButton) = false) then
    begin
      Self.ActiveControl := AlternateSavedControl;
    end;

  end;

end;
3 голосов
/ 15 февраля 2010

Посмотрите на TCustomForm.FocusControl. Вы не можете заставить его потерять фокус, не переключая фокус на что-то другое, но вы можете переключиться, а затем немедленно переключиться обратно, что, вероятно, сработает.

2 голосов
/ 24 января 2014

В модуле Windows есть функция SetFocus. Попробуйте это:

Windows.SetFocus(0);

...