确保在表单关闭时捕获数据感知控件中的更改

时间:2013-09-20 19:43:49

标签: delphi delphi-2010

我注意到,如果带有数据感知控件的表单从标题栏中关闭,并且活动控件的数据已更改,则更改永远不会进入基础数据源。我已将此跟踪到CM_EXIT消息,永远不会被控件触发。

如何确保无论哪个控件最后关注,这些更改都会被推送到数据源?

4 个答案:

答案 0 :(得分:4)

您可以在表单的OnCloseQuery事件中发送所需的CM_Exit。

procedure TMyForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Assigned(ActiveControl) then
    SendMessage(ActiveControl.Handle, CM_EXIT,0,0);
end;

答案 1 :(得分:3)

我通常通过测试所有数据集组件来处理这个问题。如果他们处于Modified状态,那么我只需在其上调用Post

您可以在表单的OnCloseQuery中执行此操作。

答案 2 :(得分:0)

OnClose事件处理程序上,只需添加以下行:

Perform(WM_NEXTDLGCTL, 0, 0);

它将使焦点转到TabOrder中的下一个组件,并且通过从当前组件中移除焦点,将值发送到该字段。

答案 3 :(得分:0)

仅供参考。强制控件退出的跨平台方式是:

SelectNext(ActiveControl, True, True);

这适用于在同一父容器中至少有一个其他兄弟的任何控件。