mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 02:26:20 +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;
|
Active:=False;
|
||||||
FFieldDefs.Free;
|
FFieldDefs.Free;
|
||||||
FFieldList.Free;
|
FFieldList.Free;
|
||||||
With FDataSources do
|
While MyDatasourceCount>0 do
|
||||||
begin
|
MyDataSources[MyDatasourceCount - 1].DataSet:=Nil;
|
||||||
While Count>0 do
|
FDatasources.Free;
|
||||||
TDataSource(Items[Count - 1]).DataSet:=Nil;
|
|
||||||
Free;
|
|
||||||
end;
|
|
||||||
for i := 0 to FBufferCount do
|
for i := 0 to FBufferCount do
|
||||||
FreeRecordBuffer(FBuffers[i]);
|
FreeRecordBuffer(FBuffers[i]);
|
||||||
FConstraints.Free;
|
FConstraints.Free;
|
||||||
@ -270,8 +267,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if not ControlsDisabled and (FState <> dsBlockRead) then begin
|
if not ControlsDisabled and (FState <> dsBlockRead) then begin
|
||||||
for i := 0 to FDataSources.Count - 1 do
|
for i := 0 to MyDataSourceCount - 1 do
|
||||||
TDataSource(FDataSources[i]).ProcessEvent(Event, Info);
|
MyDataSources[i].ProcessEvent(Event, Info);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -476,6 +473,16 @@ begin
|
|||||||
Result:=FBuffers[Index];
|
Result:=FBuffers[Index];
|
||||||
end;
|
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);
|
procedure TDataSet.GetCalcFields(Buffer: TRecordBuffer);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -1135,10 +1142,10 @@ begin
|
|||||||
else
|
else
|
||||||
ABufferCount := DefaultBufferCount;
|
ABufferCount := DefaultBufferCount;
|
||||||
|
|
||||||
for i := 0 to FDataSources.Count - 1 do
|
for i := 0 to MyDataSourceCount - 1 do
|
||||||
for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do
|
for j := 0 to MyDataSources[i].DataLinkCount - 1 do
|
||||||
begin
|
begin
|
||||||
DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);
|
DataLink:=MyDataSources[i].DataLink[j];
|
||||||
if ABufferCount<DataLink.BufferCount then
|
if ABufferCount<DataLink.BufferCount then
|
||||||
ABufferCount:=DataLink.BufferCount;
|
ABufferCount:=DataLink.BufferCount;
|
||||||
end;
|
end;
|
||||||
@ -1167,6 +1174,9 @@ begin
|
|||||||
' FBufferCount= ',FBufferCount,
|
' FBufferCount= ',FBufferCount,
|
||||||
' FRecordCount=',FRecordCount);
|
' FRecordCount=',FRecordCount);
|
||||||
{$Endif}
|
{$Endif}
|
||||||
|
for i := 0 to MyDataSourceCount - 1 do
|
||||||
|
for j := 0 to MyDataSources[i].DataLinkCount - 1 do
|
||||||
|
MyDataSources[i].DataLink[j].CalcRange;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TDataSet.SetBookmarkStr(const Value: TBookmarkStr);
|
procedure TDataSet.SetBookmarkStr(const Value: TBookmarkStr);
|
||||||
|
@ -63,8 +63,8 @@ begin
|
|||||||
Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index + FBufferCount - 1)
|
Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index + FBufferCount - 1)
|
||||||
else if DataSource.DataSet.FActiveRecord < FFirstRecord + Index then
|
else if DataSource.DataSet.FActiveRecord < FFirstRecord + Index then
|
||||||
Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index)
|
Result := DataSource.DataSet.FActiveRecord - (FFirstRecord + Index)
|
||||||
else Result := 0;
|
else
|
||||||
|
Result := 0;
|
||||||
Inc(FFirstRecord, Index + Result);
|
Inc(FFirstRecord, Index + Result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -580,6 +580,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
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);
|
procedure TDatasource.RegisterDataLink(DataLink: TDataLink);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1490,6 +1490,8 @@ type
|
|||||||
Procedure DoInsertAppend(DoAppend : Boolean);
|
Procedure DoInsertAppend(DoAppend : Boolean);
|
||||||
Procedure DoInternalOpen;
|
Procedure DoInternalOpen;
|
||||||
Function GetBuffer (Index : longint) : TRecordBuffer;
|
Function GetBuffer (Index : longint) : TRecordBuffer;
|
||||||
|
function GetDatasourceCount: Integer;
|
||||||
|
function GetDatasources(aIndex : integer): TDatasource;
|
||||||
Function GetField (Index : Longint) : TField;
|
Function GetField (Index : Longint) : TField;
|
||||||
Procedure RegisterDataSource(ADataSource : TDataSource);
|
Procedure RegisterDataSource(ADataSource : TDataSource);
|
||||||
Procedure RemoveField (Field : TField);
|
Procedure RemoveField (Field : TField);
|
||||||
@ -1620,6 +1622,8 @@ type
|
|||||||
procedure SetUniDirectional(const Value: Boolean);
|
procedure SetUniDirectional(const Value: Boolean);
|
||||||
class function FieldDefsClass : TFieldDefsClass; virtual;
|
class function FieldDefsClass : TFieldDefsClass; virtual;
|
||||||
class function FieldsClass : TFieldsClass; virtual;
|
class function FieldsClass : TFieldsClass; virtual;
|
||||||
|
Property MyDataSources[aIndex : integer] : TDatasource Read GetDatasources;
|
||||||
|
Property MyDataSourceCount : Integer Read GetDatasourceCount;
|
||||||
protected { abstract methods }
|
protected { abstract methods }
|
||||||
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
|
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
|
||||||
procedure InternalClose; virtual; abstract;
|
procedure InternalClose; virtual; abstract;
|
||||||
@ -1898,6 +1902,8 @@ type
|
|||||||
FOnDataChange: TDataChangeEvent;
|
FOnDataChange: TDataChangeEvent;
|
||||||
FOnUpdateData: TNotifyEvent;
|
FOnUpdateData: TNotifyEvent;
|
||||||
procedure DistributeEvent(Event: TDataEvent; Info: Ptrint);
|
procedure DistributeEvent(Event: TDataEvent; Info: Ptrint);
|
||||||
|
function GetLink(AIndex : Integer): TDataLink;
|
||||||
|
function GetLinkCount: Integer;
|
||||||
procedure RegisterDataLink(DataLink: TDataLink);
|
procedure RegisterDataLink(DataLink: TDataLink);
|
||||||
Procedure ProcessEvent(Event : TDataEvent; Info : Ptrint);
|
Procedure ProcessEvent(Event : TDataEvent; Info : Ptrint);
|
||||||
procedure SetDataSet(ADataSet: TDataSet);
|
procedure SetDataSet(ADataSet: TDataSet);
|
||||||
@ -1908,6 +1914,8 @@ type
|
|||||||
Procedure DoStateChange; virtual;
|
Procedure DoStateChange; virtual;
|
||||||
Procedure DoUpdateData;
|
Procedure DoUpdateData;
|
||||||
property DataLinks: TList read FDataLinks;
|
property DataLinks: TList read FDataLinks;
|
||||||
|
Property DataLink[AIndex : Integer] : TDataLink Read GetLink;
|
||||||
|
Property DataLinkCount : Integer Read GetLinkCount;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
Loading…
Reference in New Issue
Block a user