Sfoglia il codice sorgente

* Fix bug ID #21594, wrong firstrecord when a data link is destroyed and buffercount changed.

git-svn-id: trunk@39471 -
michael 7 anni fa
parent
commit
0e6b9951ee

+ 21 - 11
packages/fcl-db/src/base/dataset.inc

@@ -52,12 +52,9 @@ begin
   Active:=False;
   FFieldDefs.Free;
   FFieldList.Free;
-  With FDataSources do
-    begin
-    While Count>0 do
-      TDataSource(Items[Count - 1]).DataSet:=Nil;
-    Free;
-    end;
+  While MyDatasourceCount>0 do
+    MyDataSources[MyDatasourceCount - 1].DataSet:=Nil;
+  FDatasources.Free;
   for i := 0 to FBufferCount do
     FreeRecordBuffer(FBuffers[i]);
   FConstraints.Free;
@@ -270,8 +267,8 @@ begin
   end;
 
   if not ControlsDisabled and (FState <> dsBlockRead) then begin
-    for i := 0 to FDataSources.Count - 1 do
-      TDataSource(FDataSources[i]).ProcessEvent(Event, Info);
+    for i := 0 to MyDataSourceCount - 1 do
+      MyDataSources[i].ProcessEvent(Event, Info);
   end;
 end;
 
@@ -476,6 +473,16 @@ begin
   Result:=FBuffers[Index];
 end;
 
+function TDataSet.GetDatasourceCount: Integer;
+begin
+  Result:=FDataSources.Count;
+end;
+
+function TDataSet.GetDatasources(aIndex : integer): TDatasource;
+begin
+  Result:=TDatasource(FDataSources[aIndex]);
+end;
+
 procedure TDataSet.GetCalcFields(Buffer: TRecordBuffer);
 
 begin
@@ -1135,10 +1142,10 @@ begin
   else
     ABufferCount := DefaultBufferCount;
 
-  for i := 0 to FDataSources.Count - 1 do
-    for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do
+  for i := 0 to MyDataSourceCount - 1 do
+    for j := 0 to MyDataSources[i].DataLinkCount - 1 do
       begin
-      DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);
+      DataLink:=MyDataSources[i].DataLink[j];
       if ABufferCount<DataLink.BufferCount then
         ABufferCount:=DataLink.BufferCount;
       end;
@@ -1167,6 +1174,9 @@ begin
     ' FBufferCount= ',FBufferCount,
     ' FRecordCount=',FRecordCount);
 {$Endif}
+  for i := 0 to MyDataSourceCount - 1 do
+    for j := 0 to MyDataSources[i].DataLinkCount - 1 do
+       MyDataSources[i].DataLink[j].CalcRange;
 end;
 
 procedure TDataSet.SetBookmarkStr(const Value: TBookmarkStr);

+ 12 - 2
packages/fcl-db/src/base/datasource.inc

@@ -63,8 +63,8 @@ begin
     Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index + FBufferCount - 1)
   else if DataSource.DataSet.FActiveRecord < FFirstRecord + Index then
     Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index)
-  else Result := 0;
-  
+  else
+    Result := 0;
   Inc(FFirstRecord, Index + Result);
 end;
 
@@ -580,6 +580,16 @@ begin
     end;
 end;
 
+function TDataSource.GetLink(AIndex : Integer): TDataLink;
+begin
+  Result:=TDataLink(FDataLinks[aindex]);
+end;
+
+function TDataSource.GetLinkCount: Integer;
+begin
+  Result:=FDataLinks.Count;
+end;
+
 procedure TDatasource.RegisterDataLink(DataLink: TDataLink);
 
 begin

+ 8 - 0
packages/fcl-db/src/base/db.pas

@@ -1490,6 +1490,8 @@ type
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInternalOpen;
     Function  GetBuffer (Index : longint) : TRecordBuffer;
+    function GetDatasourceCount: Integer;
+    function GetDatasources(aIndex : integer): TDatasource;
     Function  GetField (Index : Longint) : TField;
     Procedure RegisterDataSource(ADataSource : TDataSource);
     Procedure RemoveField (Field : TField);
@@ -1620,6 +1622,8 @@ type
     procedure SetUniDirectional(const Value: Boolean);
     class function FieldDefsClass : TFieldDefsClass; virtual;
     class function FieldsClass : TFieldsClass; virtual;
+    Property MyDataSources[aIndex : integer] : TDatasource Read GetDatasources;
+    Property MyDataSourceCount : Integer Read GetDatasourceCount;
   protected { abstract methods }
     function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
     procedure InternalClose; virtual; abstract;
@@ -1898,6 +1902,8 @@ type
     FOnDataChange: TDataChangeEvent;
     FOnUpdateData: TNotifyEvent;
     procedure DistributeEvent(Event: TDataEvent; Info: Ptrint);
+    function GetLink(AIndex : Integer): TDataLink;
+    function GetLinkCount: Integer;
     procedure RegisterDataLink(DataLink: TDataLink);
     Procedure ProcessEvent(Event : TDataEvent; Info : Ptrint);
     procedure SetDataSet(ADataSet: TDataSet);
@@ -1908,6 +1914,8 @@ type
     Procedure DoStateChange; virtual;
     Procedure DoUpdateData;
     property DataLinks: TList read FDataLinks;
+    Property DataLink[AIndex : Integer] : TDataLink Read GetLink;
+    Property DataLinkCount : Integer Read GetLinkCount;
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;