mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 20:39:34 +02:00
+ if TBufDataset.PacketRecords is set to -1, all records are fetched
+ TBufDataset.RecNo now always returns 0 for new records + TBufDataset.Recordcount does not count a new record anymore + EOF and BOF must be true when a dataset is created + Close does not call CheckBrowseMode anymore + Add a check in MoveBy for distance=0 + MoveBy calls DoBeforeScroll before it does anything else + Send the right dataevent in MoveBy (bug 5048) + Check for an edit state in Post + Fixed NotInEditState error message + added the deConnectChange,deReconcileError,deDisabledStateChange TDataEvents + Do not send a deFieldListChange event when opening the dataset git-svn-id: trunk@3463 -
This commit is contained in:
parent
73e6645235
commit
8b189839aa
@ -27,7 +27,7 @@ end;
|
||||
|
||||
procedure TBufDataset.SetPacketRecords(aValue : integer);
|
||||
begin
|
||||
if aValue > 0 then FPacketRecords := aValue
|
||||
if (aValue = -1) or (aValue > 0) then FPacketRecords := aValue
|
||||
else DatabaseError(SInvPacketRecordsValue);
|
||||
end;
|
||||
|
||||
@ -68,6 +68,7 @@ begin
|
||||
FLastRecBuf := FFirstRecBuf;
|
||||
FCurrentRecBuf := FLastRecBuf;
|
||||
|
||||
FAllPacketsFetched := False;
|
||||
FOpen:=True;
|
||||
end;
|
||||
|
||||
@ -96,7 +97,7 @@ end;
|
||||
procedure TBufDataset.InternalLast;
|
||||
begin
|
||||
repeat
|
||||
until getnextpacket < FPacketRecords;
|
||||
until (getnextpacket < FPacketRecords) or (FPacketRecords = -1);
|
||||
if FLastRecBuf <> FFirstRecBuf then
|
||||
FCurrentRecBuf := FLastRecBuf;
|
||||
end;
|
||||
@ -225,9 +226,14 @@ var i : integer;
|
||||
pb : pchar;
|
||||
|
||||
begin
|
||||
if FAllPacketsFetched then
|
||||
begin
|
||||
result := 0;
|
||||
exit;
|
||||
end;
|
||||
i := 0;
|
||||
pb := pchar(pointer(FLastRecBuf)+sizeof(TBufRecLinkItem));
|
||||
while (i < FPacketRecords) and (loadbuffer(pb) = grOk) do
|
||||
while ((i < FPacketRecords) or (FPacketRecords = -1)) and (loadbuffer(pb) = grOk) do
|
||||
begin
|
||||
FLastRecBuf^.next := pointer(IntAllocRecordBuffer);
|
||||
FLastRecBuf^.next^.prior := FLastRecBuf;
|
||||
@ -268,6 +274,7 @@ begin
|
||||
if not Fetch then
|
||||
begin
|
||||
Result := grEOF;
|
||||
FAllPacketsFetched := True;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
@ -611,7 +618,7 @@ var recnr : integer;
|
||||
begin
|
||||
if value > RecordCount then
|
||||
begin
|
||||
repeat until (getnextpacket < FPacketRecords) or (value <= RecordCount);
|
||||
repeat until (getnextpacket < FPacketRecords) or (value <= RecordCount) or (FPacketRecords = -1);
|
||||
if value > RecordCount then
|
||||
begin
|
||||
DatabaseError(SNoSuchRecord,self);
|
||||
@ -634,7 +641,7 @@ Var SearchRecBuffer : PBufRecLinkItem;
|
||||
begin
|
||||
abuf := ActiveBuffer;
|
||||
// If abuf isn't assigned, the recordset probably isn't opened.
|
||||
if assigned(abuf) and (FRecordCount>0) then
|
||||
if assigned(abuf) and (FBRecordCount>0) and (state <> dsInsert) then
|
||||
begin
|
||||
GetBookmarkData(abuf,@SearchRecBuffer);
|
||||
TmpRecBuffer := FFirstRecBuf;
|
||||
@ -646,7 +653,7 @@ begin
|
||||
end;
|
||||
result := recnr;
|
||||
end
|
||||
else result := -1;
|
||||
else result := 0;
|
||||
end;
|
||||
|
||||
function TBufDataset.IsCursorOpen: Boolean;
|
||||
@ -658,8 +665,7 @@ end;
|
||||
Function TBufDataset.GetRecordCount: Longint;
|
||||
|
||||
begin
|
||||
if state <> dsInsert then Result := FBRecordCount
|
||||
else Result := FBRecordCount+1;
|
||||
Result := FBRecordCount;
|
||||
end;
|
||||
|
||||
Function TBufDataset.Locate(const KeyFields: string; const KeyValues: Variant; options: TLocateOptions) : boolean;
|
||||
|
@ -34,6 +34,8 @@ begin
|
||||
FBuffers[0] := nil;
|
||||
FActiveRecord := 0;
|
||||
FBufferCount := 0;
|
||||
FEOF := True;
|
||||
FBOF := True;
|
||||
end;
|
||||
|
||||
|
||||
@ -396,16 +398,14 @@ begin
|
||||
DoAfterOpen;
|
||||
DoAfterScroll;
|
||||
except
|
||||
DoInternalClose(false);
|
||||
DoInternalClose;
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure TDataset.DoInternalClose(DoCheck : Boolean);
|
||||
Procedure TDataset.DoInternalClose;
|
||||
|
||||
begin
|
||||
if DoCheck then
|
||||
CheckBrowsemode;
|
||||
DoBeforeScroll;
|
||||
DoBeforeClose;
|
||||
FreeFieldBuffers;
|
||||
@ -822,7 +822,7 @@ begin
|
||||
DoInternalOpen;
|
||||
end
|
||||
else if not value and (Fstate <> dsinactive) then
|
||||
DoInternalClose(True);
|
||||
DoInternalClose;
|
||||
end;
|
||||
|
||||
procedure TDataset.Loaded;
|
||||
@ -1697,10 +1697,11 @@ Var
|
||||
begin
|
||||
CheckBrowseMode;
|
||||
Result:=0; TheResult:=0;
|
||||
If ((Distance>0) and FEOF) or
|
||||
DoBeforeScroll;
|
||||
If (Distance = 0) or
|
||||
((Distance>0) and FEOF) or
|
||||
((Distance<0) and FBOF) then
|
||||
exit;
|
||||
DoBeforeScroll;
|
||||
Try
|
||||
Scrolled := 0;
|
||||
If Distance>0 then
|
||||
@ -1711,11 +1712,7 @@ begin
|
||||
{$ifdef dsdebug}
|
||||
WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);
|
||||
{$Endif}
|
||||
// If FRecordCount<>PrevRecordCount then
|
||||
if Scrolled = 0 then
|
||||
DataEvent(deDatasetChange,0)
|
||||
else
|
||||
DataEvent(deDatasetScroll,Scrolled);
|
||||
DataEvent(deDatasetScroll,Scrolled);
|
||||
DoAfterScroll;
|
||||
Result:=TheResult;
|
||||
end;
|
||||
@ -1772,7 +1769,9 @@ begin
|
||||
writeln ('Post: Browse mode set');
|
||||
{$endif}
|
||||
DoAfterPost;
|
||||
end;
|
||||
end
|
||||
else
|
||||
DatabaseErrorFmt(SNotInEditState, [Name], Self);
|
||||
end;
|
||||
|
||||
Procedure TDataset.Prior;
|
||||
@ -1926,7 +1925,7 @@ Procedure TDataset.UpdateRecord;
|
||||
|
||||
begin
|
||||
if not (State in dsEditModes) then
|
||||
DatabaseError(SNotInEditState, Self);
|
||||
DatabaseErrorFmt(SNotInEditState, [Name], Self);
|
||||
DataEvent(deUpdateRecord, 0);
|
||||
end;
|
||||
|
||||
|
@ -51,7 +51,7 @@ type
|
||||
TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,
|
||||
deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,
|
||||
deCheckBrowseMode, dePropertyChange, deFieldListChange, deFocusControl,
|
||||
deParentScroll);
|
||||
deParentScroll,deConnectChange,deReconcileError,deDisabledStateChange);
|
||||
|
||||
TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted);
|
||||
TUpdateStatusSet = SET OF TUpdateStatus;
|
||||
@ -965,7 +965,7 @@ type
|
||||
FState : TDataSetState;
|
||||
Procedure DoInsertAppend(DoAppend : Boolean);
|
||||
Procedure DoInternalOpen;
|
||||
Procedure DoInternalClose(DoCheck : Boolean);
|
||||
Procedure DoInternalClose;
|
||||
Function GetBuffer (Index : longint) : Pchar;
|
||||
Function GetField (Index : Longint) : TField;
|
||||
Procedure RegisterDataSource(ADatasource : TDataSource);
|
||||
@ -1509,6 +1509,8 @@ type
|
||||
FCurrentUpdateBuffer : integer;
|
||||
|
||||
FFieldBufPositions : array of longint;
|
||||
|
||||
FAllPacketsFetched : boolean;
|
||||
procedure CalcRecordSize;
|
||||
function LoadBuffer(Buffer : PChar): TGetResult;
|
||||
function GetFieldSize(FieldDef : TFieldDef) : longint;
|
||||
|
@ -2399,7 +2399,7 @@ end;
|
||||
Procedure Tfields.Changed;
|
||||
|
||||
begin
|
||||
if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) then
|
||||
if (FDataSet <> nil) and not (csDestroying in FDataSet.ComponentState) and FDataset.Active then
|
||||
FDataSet.DataEvent(deFieldListChange, 0);
|
||||
If Assigned(FOnChange) then
|
||||
FOnChange(Self);
|
||||
|
Loading…
Reference in New Issue
Block a user