+ 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:
joost 2006-05-09 20:01:59 +00:00
parent 73e6645235
commit 8b189839aa
4 changed files with 32 additions and 25 deletions

View File

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

View File

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

View File

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

View File

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