我注意到,如果带有数据感知控件的表单从标题栏中关闭,并且活动控件的数据已更改,则更改永远不会进入基础数据源。我已将此跟踪到CM_EXIT消息,永远不会被控件触发。
如何确保无论哪个控件最后关注,这些更改都会被推送到数据源?
答案 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);
这适用于在同一父容器中至少有一个其他兄弟的任何控件。