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

git-svn-id: trunk@39471 -
This commit is contained in:
michael 2018-07-18 12:57:00 +00:00
parent 270cf0ed06
commit 0e6b9951ee
3 changed files with 41 additions and 13 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;