【问题标题】:Delphi - what event is triggered inside TDBGrid on dataset.enablecontrolsDelphi - 在 dataset.enablecontrols 上的 TDBGrid 内触发了什么事件
【发布时间】:2013-03-30 10:52:26
【问题描述】:

我需要知道当数据集调用enablecontrols 时 TDBGrid 中会发生什么。我知道 dataset 正在通知数据源,但我不知道在 OnDrawCell 事件之前在 dbgrid 组件上调用了什么。

从 db.pas 调用数据集

  if (FDisableState <> dsInactive) and (FState <> dsInactive) then
    DataEvent(FEnableEvent, 0);

数据源如何通知 dbgrid 它需要显示多少列?

【问题讨论】:

  • TDataLink > TGridDataLink

标签: delphi delphi-xe


【解决方案1】:

数据源通过数据链接 (TDataLink) 链接到数据感知控件。每个数据控件都会创建一个DataLink,以响应和发送附加的DataSource

DBGrid 的 DataLink 是在 TCustomDBGrid.CreateDataLink 中创建的 TGridDataLink 类型。

这是TDataSet.EnableControls之后的调用栈:

  • TDataSet.EnableControls 致电TDataSet.DataEvent
  • TDataSet.DataEvent 调用 FDataSources[I]).DataEvent 获取所有附加的数据源,
  • TDataSource.DataEvent调用TDataSource.NotifyDataLinks,后者调用TDataSource.NotifyLinkTypes
  • TDataSource.NotifyLinkTypes 调用 FDataLinks[I]).DataEvent 获取所有附加的数据链接,
  • TDataLink.DataEvent 调用 TGridDataLink.DataSetChangedTGridDataLink.LayoutChanged,这取决于调用 EnableControls 之前发生的情况。对记录的编辑是数据集的更改;添加字段(网格中的列)是布局更改(等等),
  • TGridDataLink 致电FGrid.DataChangedFGrid.LayoutChanged
  • TCustomDBGrid.LayoutChanged 最终调用TCustomDBGrid.BeginLayout
  • TCustomDBGrid.BeginLayout 将列(计数、标题等)的更新委托给 Columns 属性并调用 Columns.BeginUpdate

OnDrawCell 发生在未来的某个时间,当所有布局更改完成时。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多