我注意到,如果从标题栏关闭带有数据感知控件的表单并且活动控件的数据已更改,则该更改永远不会使其进入基础数据源。我已经将此追溯到 CM_EXIT 消息,该消息从未因控件而被解雇。
我如何确保无论哪个控件最后关注这些更改都被推送到数据源?
我注意到,如果从标题栏关闭带有数据感知控件的表单并且活动控件的数据已更改,则该更改永远不会使其进入基础数据源。我已经将此追溯到 CM_EXIT 消息,该消息从未因控件而被解雇。
我如何确保无论哪个控件最后关注这些更改都被推送到数据源?
我通常通过测试所有数据集组件来处理这个问题。如果他们在该Modified
州,那么我只是打电话Post
给他们。
您可以在OnCloseQuery
表单中执行此操作。
您可以在表单的 OnCloseQuery 事件中发送所需的 CM_Exit。
procedure TMyForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(ActiveControl) then
SendMessage(ActiveControl.Handle, CM_EXIT,0,0);
end;
在您的OnClose
事件处理程序上,只需添加以下行:
Perform(WM_NEXTDLGCTL, 0, 0);
它将使焦点转到 中的下一个组件,TabOrder
并且通过从当前组件中移除焦点,将值发送到该字段。
仅供参考。强制控件退出的跨平台方式是:
SelectNext(ActiveControl, True, True);
这将适用于在同一父容器中至少有一个其他兄弟的任何控件。
我认为正确的方法是调用UpdateRecord
底层数据集组件(例如 in OnCloseQuery
)。这将更新来自控件的数据。
如果您Post
改为调用,这也将在内部调用UpdateRecord
。这就是为什么马库斯的回答也会起作用的原因。