如何从当前关注的组件中删除焦点?

时间:2010-02-15 06:36:10

标签: delphi focus delphi-7

我有一个数据库组件,当接收到CM_EXIT消息时会调用DataLink.UpdateRecord。失去焦点时会发送此消息。当我单击发布按钮时,它不会失去焦点,并且值不会写入数据源。如何在不将焦点转移到其他组件的情况下达到组件失去焦点的效果?

4 个答案:

答案 0 :(得分:9)

您可以使用:

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

答案 1 :(得分:8)

我们通过设置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;

答案 2 :(得分:3)

看看TCustomForm.FocusControl。如果不将焦点转移到别的东西上,你就无法让它失去焦点,但你可以切换然后立即切换回来,这可能会有效。

答案 3 :(得分:2)

Windows单元中有一个SetFocus功能。试试这个:

Windows.SetFocus(0);