소스 검색

+ TDataset.ActiveBuffer now returns nil if the dataset is closed
+ TBufDataset.RecNo now returns -1 if the dataset is closed (bug 5061)

git-svn-id: trunk@3362 -

joost 19 년 전
부모
커밋
401c32d145
2개의 변경된 파일33개의 추가작업 그리고 18개의 파일을 삭제
  1. 14 8
      fcl/db/bufdataset.inc
  2. 19 10
      fcl/db/dataset.inc

+ 14 - 8
fcl/db/bufdataset.inc

@@ -628,17 +628,23 @@ function TBufDataset.GetRecNo: Longint;
 Var SearchRecBuffer : PBufRecLinkItem;
     TmpRecBuffer    : PBufRecLinkItem;
     recnr           : integer;
+    abuf            : PChar;
 
 begin
-  GetBookmarkData(ActiveBuffer,@SearchRecBuffer);
-  TmpRecBuffer := FFirstRecBuf;
-  recnr := 1;
-  while TmpRecBuffer <> SearchRecBuffer do
+  abuf := ActiveBuffer;
+  if assigned(abuf) then
     begin
-    inc(recnr);
-    TmpRecBuffer := TmpRecBuffer^.next;
-    end;
-  result := recnr;
+    GetBookmarkData(ActiveBuffer,@SearchRecBuffer);
+    TmpRecBuffer := FFirstRecBuf;
+    recnr := 1;
+    while TmpRecBuffer <> SearchRecBuffer do
+      begin
+      inc(recnr);
+      TmpRecBuffer := TmpRecBuffer^.next;
+      end;
+    result := recnr;
+    end
+  else result := -1;
 end;
 
 function TBufDataset.IsCursorOpen: Boolean;

+ 19 - 10
fcl/db/dataset.inc

@@ -27,6 +27,13 @@ begin
   FFieldDefs:=TFieldDefs.Create(Self);
   FFieldList:=TFields.Create(Self);
   FDataSources:=TList.Create;
+  
+// FBuffer must be allocated on create, to make Activebuffer return nil
+  ReAllocMem(FBuffers,SizeOf(PChar));
+//  pointer(FBuffers^) := nil;
+  FBuffers[0] := nil;
+  FActiveRecord := 0;
+  FBufferCount := 0;
 end;
 
 
@@ -46,12 +53,9 @@ begin
       TDatasource(Items[Count - 1]).DataSet:=Nil;
     Free;
     end;
-  if Assigned(FBuffers) then
-    begin
-    for i := 0 to FBufferCount do
-      FreeRecordBuffer(FBuffers[i]);
-    FreeMem(FBuffers);
-    end;
+  for i := 0 to FBufferCount do
+    FreeRecordBuffer(FBuffers[i]);
+  FreeMem(FBuffers);
   Inherited Destroy;
 end;
 
@@ -922,7 +926,7 @@ begin
 {$endif}
     except
       I:=FBufferCount;
-      While (I<(Value+1)) and (FBuffers[i]<>Nil) do
+      While (I<(Value+1)) do
         begin
         FreeRecordBuffer(FBuffers[i]);
         Inc(i);
@@ -946,7 +950,14 @@ begin
       begin
       For I:=Value+1 to FBufferCount do
         FreeRecordBuffer(FBuffers[i]);
-      ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
+      // FBuffer must stay allocated, to make sure that Activebuffer returns nil
+      if Value = -1 then
+        begin
+        ReAllocMem(FBuffers,SizeOf(Pchar));
+        FBuffers[0] := nil;
+        end
+      else
+        ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
       end;
     if FRecordcount > Value then FRecordcount := Value;
     end;
@@ -1095,14 +1106,12 @@ end;
 
 Function TDataset.ControlsDisabled: Boolean;
 
-
 begin
   Result := (FDisableControlsCount > 0);
 end;
 
 Function TDataset.ActiveBuffer: PChar;
 
-
 begin
 {$ifdef dsdebug}
   Writeln ('Active buffer requested. Returning:',ActiveRecord);