我有一个数据库组件,当它收到 CM_EXIT 消息时,会调用 DataLink.UpdateRecord 。当失去焦点时发送此消息。当我单击发布按钮时,它不会失去焦点,并且值不会写入数据源。如何在不切换到其他组件的情况下达到组件失去焦点的效果?
您可以使用:
procedure TCustomForm.DefocusControl(Control: TWinControl; Removing: Boolean);
我们通过设置 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;
看看
TCustomForm.FocusControl
。 如果不将焦点切换到其他事物上,您无法使其失去焦点,但您可以切换然后立即切换回来,这可能会起作用。
windows 单元有 SetFocus 功能。试试这个:
Windows.SetFocus(0);
我解决这个问题的唯一方法是创建一个无用的小组件并创建一个名为“ClearFocus”的小程序,它执行以下操作:
uselessComponentName.SetFocus;
您在近 15 年前就已经问过这个问题,但如果像我这样的人遇到与您相同的问题,这里有一个替代解决方案。