我的应用程序中有许多“主/明细”表格。一个 TDBGrid,其中每一行显示项目的一些核心值。网格下方通常是一个“详细信息区域”,显示当前在网格中选择的项目的完整信息。
目前我正在听网格后面的 TADOQuery 的“AfterScroll”事件,但它似乎给了我太多事件。
AfterScroll 是正确的事件吗?你是怎么做到的?
“标准”方式(在数据感知环境中)将不使用 GUI 控件进行控制,而是使用数据组件。
大多数表数据集提供MasterSource
(链接到适当的TDataSource
组件)和MasterFields
属性。您可以使用这些以主从关系链接您的数据集。然后你的细节网格(或其他数据感知控件)只需要关注链接到正确的数据集。
编辑
其他类型的数据集(例如TQuery
,TADOQuery
)有时提供DataSource
用于类似目的。来自 Delphi 5 帮助:“ Set DataSource to automatically fill parameters in a query with fields values from another dataset.
”
然而,还有很多复杂的情况(阅读帮助会观察到)。因此,建议使用TTable
或TADOTable
代替详细数据集。
我不知道是否有任何“标准”方式,但 IMOAfterScroll
很好。使用计时器来防止快速连续更新控件,例如在滚动网格时。一个例子:
procedure TSomeForm.DataSetAfterScroll(DataSet: TDataSet);
begin
if not DataSet.ControlsDisabled then begin
if ScrollTimer.Enabled then
ScrollTimer.Enabled := False;
ScrollTimer.Enabled := True;
end;
end;
procedure TSomeForm.ScrollTimerTimer(Sender: TObject);
begin
ScrollTimer.Enabled := False;
UpdateGUI;
end;
我认为您会发现 250-300 毫秒的间隔令人愉快。