主/明细结构:主表滚动后,是否存在触发所有明细表滚动完成的事件?
主从表滚动完成后执行计算的解决方案
利用明细查询的AfterScroll事件计数触发
给每个关联的明细查询绑定OnAfterScroll事件,同时在主表的OnAfterScroll里初始化一个表单级的计数器为0。每个明细的OnAfterScroll触发时,计数器加1,当计数器等于你维护的明细查询总数时,执行判断逻辑(检查当前主记录是否有对应明细),执行完成后重置计数器即可。通过PostMessage延迟执行逻辑
在主表的OnAfterScroll事件里,调用PostMessage发送自定义Windows消息给当前表单。系统会等主从表滚动的所有同步操作完成后,再处理这个消息。在表单的消息处理函数里,执行明细存在性判断。
示例Delphi代码:
const WM_MASTER_SCROLL_FINISH = WM_USER + 100; procedure TForm1.MasterQueryAfterScroll(DataSet: TDataSet); begin PostMessage(Handle, WM_MASTER_SCROLL_FINISH, 0, 0); end; procedure TForm1.WMMasterScrollFinish(var Msg: TMessage); begin // 检查所有明细查询是否有记录 if (DetailQuery1.RecordCount > 0) or (DetailQuery2.RecordCount > 0) then begin // 存在明细记录的处理逻辑 end else begin // 无明细记录的处理逻辑 end; end; // 表单类声明中添加消息映射 type TForm1 = class(TForm) // ... 组件声明 procedure MasterQueryAfterScroll(DataSet: TDataSet); private procedure WMMasterScrollFinish(var Msg: TMessage); message WM_MASTER_SCROLL_FINISH; public { Public declarations } end;
用定时器检查明细状态
在主表的OnAfterScroll里启动一个短间隔定时器(10-50ms即可),定时器触发时,检查所有明细查询的State是否为dsBrowse、Active是否为True。当所有明细都满足条件时,执行判断逻辑并关闭定时器。
注意:间隔不要过长避免延迟感,也不要过短导致明细未加载完成就触发检查。绑定明细DataSource的OnDataChange事件
给每个明细查询对应的DataSource绑定OnDataChange事件,维护一个计数器。主表滚动时重置计数器,每个明细的DataChange触发后计数器加1,达到明细总数时执行判断逻辑。这个方法的触发时机更贴合明细数据更新完成的节点。
内容的提问来源于stack exchange,提问作者JC Boggio
相关产品推荐
相关产品推荐

