求教:TDataSet.AfterScroll事件和TDataSource.OnDataChange事件的区别?

rick29 2005-12-23 09:32:56
我是个DELPHI新手。在公司现在需要用到dxDbGrid,当然有相应的DataSet、DataSource与之关联。现在的情况是这样的,用Grid查询显示到一批数据,Grid之外还有一些非数据感知的EditBox,我们需要在鼠标单击或键盘操作(方向箭、PgUp、PgDn等)选择不同的记录时,在那些非数据感知的控件中显示相关的一些内容。因一些原因暂时不考虑Grid的OnNodeChange事件。

  我将其放入相应DataSource之OnDataChange事件后,问题可以解决。
但我们的主管要求我放入DataSet之AfterScroll事件进行处理。于是问题出现,在查询Refresh(相应的DataSet先Close再Open实现Refresh)时这个AfterScroll会触发很多次。因为外部非数据感知控件的查询是根据当前Grid的内容来继续Query数据库的,因此多次触发导致效率严重下降,界面停顿。

  我查阅了Delphi的相关控件的Help。可以读懂两者对应的解释。以我对Help的理解,感觉放到OnDataChange中更好一些。但是我还是比较迷茫,这两个事件的区别在哪里?分别用到什么地方最为休合适?——如果我用OnDataChange,我想我得有足够的理由去和主管解释。

  诚心求教,分不够可以再加。在线等待,谢谢!
...全文
896 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangl_cn 2005-12-23
  • 打赏
  • 举报
回复
那这样,刷新之前先令OnAfterScroll:=nil;完了再把OnafterScroll:=OnAfterScroll

//大概就是这样子吧,你再试试
rick29 2005-12-23
  • 打赏
  • 举报
回复
报告,在刷新之前DisableControls,导致Grid里什么也显示不出来。在刷新之后再EnableControls,问题仍在,AfterScroll似乎读一条数据就会刷新一次。我做了个5条数据的试验,结果发现触发AfterScroll有9次之多。
rick29 2005-12-23
  • 打赏
  • 举报
回复
多谢楼上,我也去瞧瞧。另,我的GRID是整行选中的,而且不允许EDIT,这样应该不存在列间切换(?)。我也去试一把。谢谢!
zhangl_cn 2005-12-23
  • 打赏
  • 举报
回复
OnDataChange应该是不仅仅针对行的,同一行不同列之间切换也会触发该事件,

AfterScroll只是针对行变化的才触发的,

////以上是猜的,手头现在没有DELPHI,稍候去验证一下。


放在AfterScroll中的话,不知道你Refresh之前先DataSet.DisableControls一下不知有没有效果
呆会给一起验证一下

rick29 2005-12-23
  • 打赏
  • 举报
回复
江湖救急,UP一个。。
rick29 2005-12-23
  • 打赏
  • 举报
回复
up
rick29 2005-12-23
  • 打赏
  • 举报
回复
看了一下,这里好象只说明了deRecordChange, deDataSetChange, deDataSetScroll, deLayoutChange时触发FOnDataChange,我想知道AfterScroll和DataSet的OnDataChange有什么区别,或者,在我现在这个情况下,用哪个比较好,为什么?本来这种问题我可以不问的,可是我们那位仁兄是个非常坚持己见的人,通常不会去听别人的意见。否则我早用OnDataChange,一切搞定。
rick29 2005-12-23
  • 打赏
  • 举报
回复
多谢,俺研究一下。:)
Changefish 2005-12-23
  • 打赏
  • 举报
回复
procedure TDataSource.DataEvent(Event: TDataEvent; Info: Longint);
begin
if Event = deUpdateState then UpdateState else
if FState <> dsInactive then
begin
NotifyDataLinks(Event, Info);
case Event of
deFieldChange:
if Assigned(FOnDataChange) then FOnDataChange(Self, TField(Info));
deRecordChange, deDataSetChange, deDataSetScroll, deLayoutChange:
if Assigned(FOnDataChange) then FOnDataChange(Self, nil);
deUpdateRecord:
if Assigned(FOnUpdateData) then FOnUpdateData(Self);
end;
end;
end;
看看这段源码 应该就非常清楚OnDataChange了
Changefish 2005-12-23
  • 打赏
  • 举报
回复
(相应的DataSet先Close再Open实现Refresh)时这个AfterScroll会触发很多次

这种做法OnDataChange也会触发
Changefish 2005-12-23
  • 打赏
  • 举报
回复
OnDataChange比较好
rick29 2005-12-23
  • 打赏
  • 举报
回复
是个办法,不过这样做在我们头儿看来也是投机取巧。如果这样可以的话,那我用OnDataChange的写法早就通过了,唉。。。
还是谢谢!
ZeosDBO is a database middleware components for Borland development tools, including Delphi, C++ Builder and Kylix. The following compilers are supported: Delphi 5 - 7C++ Builder 5 - 6Kylix 2 - 3ZeosDBO supports direct connectivity to the following databases using the vendor provided, native interface: MySQL 3.20 - 4.1PostgreSQL 6.5 - 7.4Firebird 1.0 - 1.5Interbase 5.0 - 7.5Microsoft SQL Server 7, 2000Sybase ASE 12.0, 12.5Oracle 9iSQLite 2.8For other databases we propose to use implemented Active Data Objects (ADO) Bridge. Advantages of using ZeosDBO: Platform independance. The ZeosDBO is highly generic. Applications written in ZeosDBO can be migrated across databases without major changes. ZeosDBO is open source, written for usability and extensibility. ZeosDBO leverages the amazing power of the Delphi development environment without relying on a performance killing middleware. ZeosDBO is an extremely thin abstraction layer, unlike ‘thick‘ layered protocols like ADO and BDE. Package contents: ZCore - Core classes and interfaces. Contains Java style objects and collections as well as compatibility types and functions. ZParseSql - SQL specific for syntax and lexical analysis. ZPlain - Native plain API to supported SQL servers. ZDbc - Port of Java Database Connectivity API (JDBC 2.0). DBC API acts as intermediate layer between Plain API and highlevel TDataset or DBExpress components. ZComponent - visual components descended from TDataset. Installed components: TZConnection: This component encapsulates the database connection and transaction management. TZReadOnlyQuery: TDataset component to execute SQL queries and process data in read-only mode. TZQuery: TDataset component which allows data modifications in regular and cached mode. TZUpdateSQL: Analog of standard TUpdateSQL component to explicite definition of Insert/Update/Delete SQL statements for TDataset modifications. TZStoredProc: The component to execute SQL stored procedures. TZSQLProcessor: The component to execute SQL scripts for different SQL and various delimiter types. TZSQLMonitor: The component to monitor all outgoing SQL queries and other logging information. TZSQLMetadata: Specialized TDataset component which provides an access to database metadata such as tables, columns, indices, etc.

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧