作者:嘿嘿可爱无罪 | 来源:互联网 | 2022-11-02 12:55
考虑我们有两个标准的主从关系TADOQuery
。在主数据集上进行导航时,AfterOpen
明细数据集不会发生事件。
在其他数据访问包(例如BDE)中引发此事件。为什么dbGo的这种行为不同?
.dfm的一部分:
object DataSource1: TDataSource
DataSet = SDQuery1
Left = 504
Top = 72
end
object DataSource2: TDataSource
DataSet = SDQuery2
Left = 520
Top = 360
end
object ADOConnection1: TADOConnection
LoginPrompt = False
Left = 336
Top = 464
end
object ADOQuery1: TADOQuery
COnnection= ADOConnection1
Parameters = <>
Left = 504
Top = 160
end
object ADOQuery2: TADOQuery
COnnection= ADOConnection1
AfterOpen = ADOQuery2AfterOpen // <- rised when dataset was opened at first time only
DataSource = DataSource1
Parameters = <>
Left = 520
Top = 296
end
MartynA..
6
Delphi ADO组件的行为的原因是,当Master数据集滚动时,ADODB.Pas中的此代码将执行
procedure TCustomADODataSet.MasterChanged(Sender: TObject);
begin
if not Active then Exit;
if Parameters.Count = 0 then
begin
CheckBrowseMode;
if SetDetailFilter then First;
end else
RefreshParams;
end;
既不SetDetailFilter
也不RefreshParams
包括关闭和重新打开的详细数据集。 Requery
最终致电
procedure TCustomADODataSet.InternalRequery(Options: TExecuteOptiOns= []);
begin
if FConnectionChanged then
DatabaseError(SCantRequery);
try
Recordset.Requery(ExecuteOptionsToOrd(Options));
except
if Recordset.State = adStateClosed then Close;
raise;
end;
DestroyLookupCursor;
end;
它使用Requery
ADO的Record Recorder对象的特定功能(也称为)TCustomADODataSet
来检索匹配的详细记录,这比关闭并重新打开Detail数据集要有效得多,这就是为什么AfterOpen
不调用其事件的原因。
另请参见,TDetailDatalink
并TMasterDatalink
在DB.Pas中定义。
1> MartynA..:
Delphi ADO组件的行为的原因是,当Master数据集滚动时,ADODB.Pas中的此代码将执行
procedure TCustomADODataSet.MasterChanged(Sender: TObject);
begin
if not Active then Exit;
if Parameters.Count = 0 then
begin
CheckBrowseMode;
if SetDetailFilter then First;
end else
RefreshParams;
end;
既不SetDetailFilter
也不RefreshParams
包括关闭和重新打开的详细数据集。 Requery
最终致电
procedure TCustomADODataSet.InternalRequery(Options: TExecuteOptiOns= []);
begin
if FConnectionChanged then
DatabaseError(SCantRequery);
try
Recordset.Requery(ExecuteOptionsToOrd(Options));
except
if Recordset.State = adStateClosed then Close;
raise;
end;
DestroyLookupCursor;
end;
它使用Requery
ADO的Record Recorder对象的特定功能(也称为)TCustomADODataSet
来检索匹配的详细记录,这比关闭并重新打开Detail数据集要有效得多,这就是为什么AfterOpen
不调用其事件的原因。
另请参见,TDetailDatalink
并TMasterDatalink
在DB.Pas中定义。