旧问新发现:cxgrid控件修改记录时AfterScroll事件触发N次的问题
重新问一下大富翁BBS当年的一个问题:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3618196,原帖是说cxgrid控件的重大BUG,我今天写了程序测试了下cxgrid、dbgrid和dbgrideh,对一个表的一个字段的记录进行修改,然后鼠标点击到别的记录,只跟踪Edit、Post和Scroll这几个相关事件,最终得出触发顺序的结果如下:
1、下面是dbgrid和dbgrideh的结果
鼠标点击记录并修改的时候
BeforeScroll
AfterScroll
BeforeEdit
AfterEdit
鼠标点击到别的记录
BeforePost
****下面这两条有N条记录就触发N次****
BeforeScroll
AfterScroll
************************************
AfterPost
BeforeScroll//定位到鼠标当前点击的记录
AfterScroll
2、下面是cxgrid结果
鼠标点击记录并修改的时候
BeforeScroll
AfterScroll
BeforeEdit
AfterEdit
鼠标点击到别的记录
BeforePost
AfterPost
****下面这两条有N条记录就触发N次****
BeforeScroll
AfterScroll
************************************
BeforeScroll//又定位回刚才修改的那条记录
AfterScroll
BeforeScroll//定位到鼠标当前点击的记录
AfterScroll
测试之后问题来了:在这三个控件里面直接修改记录,再跳转都会触发N次AfterScroll事件,我在AfterScroll里面写代码,只想让它执行一次应该怎么办?不知道各位大侠有没解决方法?
自己有想了一下解决方法,如果是用dbgrid和dbgrideh的话,可以设个bool变量放在BeforePost,AfterPost里面,然后调用AfterScroll时检验这个变量才真正执行代码,这样我就能保证让代码只执行一次。但是这个方法对于cxgrid就不管用了,好纳闷啊!
IsPost: Boolean;
procedure TForm2.ADOQuery1AfterPost(DataSet: TDataSet);
begin
IsPost := False;
end;
procedure TForm2.ADOQuery1BeforePost(DataSet: TDataSet);
begin
IsPost := True;
end;
procedure TForm2.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
if IsPost then
Exit;
//下面写我想要执行的代码
end;