Delphi 如何在执行查询后挂钩?

Delphi 如何在执行查询后挂钩?,delphi,dbgrid,tdbgrid,Delphi,Dbgrid,Tdbgrid,我正在使用AnyDac和TMS-TAdvDbGrid(而不是普通的TDbGrid),以防有任何区别,但我怀疑有一个通用的解决方案 我有一个数据感知网格,由于屏幕大小,它最多可以显示12行。如果关联查询返回的行数少于12行,那么我希望相应地更改DB网格的height属性(在网格中新放置的底部下方留下一些空白,而不是在其内部) 如果需要的话,我可以发布代码,但我的问题是我应该在哪个事件处理程序中执行它 我曾想过使用查询的AfterOpen()处理程序,但从未触发过 还有什么?我可以使用DB Grid

我正在使用AnyDac和TMS-TAdvDbGrid(而不是普通的TDbGrid),以防有任何区别,但我怀疑有一个通用的解决方案

我有一个数据感知网格,由于屏幕大小,它最多可以显示12行。如果关联查询返回的行数少于12行,那么我希望相应地更改DB网格的
height
属性(在网格中新放置的底部下方留下一些空白,而不是在其内部)

如果需要的话,我可以发布代码,但我的问题是我应该在哪个事件处理程序中执行它

我曾想过使用查询的AfterOpen()处理程序,但从未触发过

还有什么?我可以使用DB Grid的DrawCell()方法,但这会被频繁调用


[更新]我添加了一些跟踪。我只在主网格上点击了一次(它的OnClick()被调用了两次,但我试了几次,结果是一致的)

以下是跟踪:

2   00:00:25.225 [Detail grid scolled]  11:02:12 AM
2   00:00:25.228 [Detail grid scolled]  11:02:12 AM
2   00:00:25.229 [Detail grid scolled]  11:02:12 AM
2   00:00:25.231 [Detail grid scolled]  11:02:12 AM
2   00:00:25.233 [Detail grid scolled]  11:02:12 AM
2   00:00:25.234 [Clicked master grid]  11:02:12 AM
2   00:00:25.234 [Master grid scolled]  11:02:12 AM
2   00:00:25.325 [Clicked master grid]  11:02:12 AM
我注意到几件事:

  • 在主网格报告为单击之前,详细网格报告为滚动。我认为这只是Windows消息队列,但它确实看起来很奇怪

  • 主栅格报告为被单击两次

  • 这两次点击似乎会导致两组滚动。第一个报告滚动5次;巧合的是(?)详图网格上有5列。如果有更多的,或者scroll上的处理很繁重,这可能是一个开销(我无法理解设置和清除标志)。理想情况下,我想钩第二个“组”只有一次点击,但我不知道如何

  • 我可以确认Aftercoll是一个很好的挂钩事件。仅当我在不是当前行的主网格行上单击时(即,当详细网格的内容发生变化时),才会调用它

有什么评论吗


[更新+++]

由于我使用的是AnyDac TADQuery,我发现我可以分配
OrdersADQuery.Command.AfterOpen:=OrdersADQueryAfterOpen

这对我来说是可行的,但是如果你认为我的上一次更新会对其他人有帮助的话,你可以随意评论一下。

尽管还有其他几种可能性,但根据我的经验,数据集填充网格的余弦事件是捕捉行数等变化以及数据集光标移动的最可靠的好地方。顺便说一句,你没有说你是否想包含删除和插入操作。

我会从AfterGetRecords事件处理程序的
中进行操作,但你需要检查实际获取的行数,因为即使在滚动DB grid时(当获取下一批记录时),这也会触发IMHO。+1谢谢(感谢你之前的所有帮助). 我想这可能行得通,但可能有点过头了。我会尝试,但只在用户实际单击主数据库网格(触发细节查询)+1 aaah时使用单个调用,如?但是,如果我的细节没有滚动,这会一直触发吗?也就是说,如果我有足够多的行在DB网格中显示详细信息,然后单击它,是否会触发滚动事件?此外,TMS的TadvDbGrid没有OnScroll事件(TDbGrid吗?)。它应该是基础数据集的
前滚动
后滚动
事件。@TLama:谢谢。我的意思是余弦,但我的打字错误。Mawg:很抱歉我的打字错误。AfterScroll事件是数据集的事件,而不是网格的事件。数据集是一组数据的通用术语。如果我们在Delphi中谈论数据集,我们通常指的是一个数据集组件,它是每个返回数据的组件(如FireDac中的
TADTable
TADQuery
TADMemTable
等)