mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 05:39:26 +02:00
* 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:
parent
270cf0ed06
commit
0e6b9951ee
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user