How to remove focus from currently focused component?

后端 未结 4 915
自闭症患者
自闭症患者 2021-01-02 15:09

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

相关标签:
4条回答
  • 2021-01-02 15:45

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

    Windows.SetFocus(0);

    0 讨论(0)
  • 2021-01-02 15:52

    You could use:

    procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);
    
    0 讨论(0)
  • 2021-01-02 15:59

    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;
    
    0 讨论(0)
  • 2021-01-02 16:04

    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.

    0 讨论(0)
提交回复
热议问题