LukLed
LukLed

Reputation: 31882

How to remove focus from currently focused component?

I have a DB component which DataLink.UpdateRecord is called when it receives CM_EXIT message. This message is sent when it loses focus. When I click post button, it doesn't lose focus and value is not written to datasource. How can I reach an effect of component losing focus without switching it to other one?

Upvotes: 8

Views: 32294

Answers (5)

Duan Enso
Duan Enso

Reputation: 11

The only way I got around such a problem is to create a useless small component and create a small procedure called "ClearFocus" which does the following:

uselessComponentName.SetFocus;

You've asked nearly 15 years ago but incase people like me run into the same question you had, here's an alternative solution.

Upvotes: 1

Balu
Balu

Reputation: 21

There is a SetFocus function in windows unit. Try this:

Windows.SetFocus(0);

Upvotes: 2

Mark Elder
Mark Elder

Reputation: 4127

We accomplish this by setting the Self.ActiveControl := nil. That causes all of the exit events to fire. In our case we wanted to also re-focus back to the control after the save took place. That required a few extra checks to ensure we had a good control that could accept focus.

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;

Upvotes: 12

Andr&#233;
Andr&#233;

Reputation: 9122

You could use:

procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);

Upvotes: 16

Mason Wheeler
Mason Wheeler

Reputation: 84650

Have a look at TCustomForm.FocusControl. You can't make it lose focus without switching focus to something else, but you can switch and then immediately switch back, which would probably work.

Upvotes: 4

Related Questions