Browse Source

* Changed the ordening of calls while opening a dataset to be more Delphi-compatible, bug #8226

git-svn-id: trunk@6261 -
joost 18 years ago
parent
commit
3780717c72
2 changed files with 53 additions and 30 deletions
  1. 49 28
      fcl/db/dataset.inc
  2. 4 2
      fcl/db/db.pp

+ 49 - 28
fcl/db/dataset.inc

@@ -189,7 +189,7 @@ end;
 Procedure TDataset.CloseCursor;
 Procedure TDataset.CloseCursor;
 
 
 begin
 begin
-  //!! To be implemented
+  FInternalOpenComplete := False;
 end;
 end;
 
 
 Procedure TDataset.CreateFields;
 Procedure TDataset.CreateFields;
@@ -379,29 +379,18 @@ Procedure TDataset.DoInternalOpen;
 
 
 begin
 begin
   FDefaultFields:=FieldCount=0;
   FDefaultFields:=FieldCount=0;
-  DoBeforeOpen;
   InternalOpen;
   InternalOpen;
-  Try
-{$ifdef dsdebug}
-    Writeln ('Calling internal open');
-{$endif}
-    FBOF:=True;
+  FInternalOpenComplete := True;
 {$ifdef dsdebug}
 {$ifdef dsdebug}
-    Writeln ('Calling RecalcBufListSize');
+  Writeln ('Calling internal open');
 {$endif}
 {$endif}
-    FRecordcount := 0;
-    RecalcBufListSize;
-    FEOF := (FRecordcount = 0);
+  FBOF:=True;
 {$ifdef dsdebug}
 {$ifdef dsdebug}
-    Writeln ('Setting state to browse');
+  Writeln ('Calling RecalcBufListSize');
 {$endif}
 {$endif}
-    SetState(dsBrowse);
-    DoAfterOpen;
-    DoAfterScroll;
-  except
-    DoInternalClose;
-    raise;
-  end;
+  FRecordcount := 0;
+  RecalcBufListSize;
+  FEOF := (FRecordcount = 0);
 end;
 end;
 
 
 Procedure TDataset.DoInternalClose;
 Procedure TDataset.DoInternalClose;
@@ -733,13 +722,16 @@ end;
 Procedure TDataset.InitFieldDefs;
 Procedure TDataset.InitFieldDefs;
 
 
 begin
 begin
-  if IsCursorOpen then InternalInitFieldDefs
+  if IsCursorOpen then
+    InternalInitFieldDefs
   else
   else
-  try
-    OpenCursor(True);
-  finally
-    CloseCursor;
-  end;
+    begin
+    try
+      OpenCursor(True);
+    finally
+      CloseCursor;
+      end;
+    end;
 end;
 end;
 
 
 Procedure TDataset.InitRecord(Buffer: PChar);
 Procedure TDataset.InitRecord(Buffer: PChar);
@@ -770,7 +762,29 @@ end;
 Procedure TDataset.OpenCursor(InfoQuery: Boolean);
 Procedure TDataset.OpenCursor(InfoQuery: Boolean);
 
 
 begin
 begin
-  //!! To be implemented
+  if InfoQuery then
+    InternalInitfieldDefs
+  else if state <> dsOpening then
+    DoInternalOpen;
+end;
+
+procedure TDataSet.OpenCursorcomplete;
+begin
+  try
+    if FState = dsOpening then DoInternalOpen
+  finally
+    if FInternalOpenComplete then
+      begin
+      SetState(dsBrowse);
+      DoAfterOpen;
+      DoAfterScroll;
+      end
+    else
+      begin
+      SetState(dsInactive);
+      CloseCursor;
+      end;
+  end;
 end;
 end;
 
 
 Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
 Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
@@ -797,7 +811,7 @@ end;
 function TDataset.GetActive : boolean;
 function TDataset.GetActive : boolean;
 
 
 begin
 begin
-  result := FState <> dsInactive;
+  result := (FState <> dsInactive) and (FState <> dsOpening);
 end;
 end;
 
 
 Procedure TDataset.InternalHandleException;
 Procedure TDataset.InternalHandleException;
@@ -820,7 +834,14 @@ begin
       exit;
       exit;
       end
       end
     else
     else
-      DoInternalOpen;
+      begin
+      DoBeforeOpen;
+      try
+        OpenCursor(False);
+      finally
+        if FState <> dsOpening then OpenCursorComplete;
+        end;
+      end;
     end
     end
   else if not value and (Fstate <> dsinactive) then
   else if not value and (Fstate <> dsinactive) then
     DoInternalClose;
     DoInternalClose;

+ 4 - 2
fcl/db/db.pp

@@ -997,6 +997,7 @@ type
     FRecordCount: Longint;
     FRecordCount: Longint;
     FIsUniDirectional: Boolean;
     FIsUniDirectional: Boolean;
     FState : TDataSetState;
     FState : TDataSetState;
+    FInternalOpenComplete: Boolean;
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInsertAppend(DoAppend : Boolean);
     Procedure DoInternalOpen;
     Procedure DoInternalOpen;
     Procedure DoInternalClose;
     Procedure DoInternalClose;
@@ -1072,11 +1073,12 @@ type
     procedure InternalInsert; virtual;
     procedure InternalInsert; virtual;
     procedure InternalRefresh; virtual;
     procedure InternalRefresh; virtual;
     procedure OpenCursor(InfoQuery: Boolean); virtual;
     procedure OpenCursor(InfoQuery: Boolean); virtual;
+    procedure OpenCursorcomplete;
     procedure RefreshInternalCalcFields(Buffer: PChar); virtual;
     procedure RefreshInternalCalcFields(Buffer: PChar); virtual;
     procedure RestoreState(const Value: TDataSetState);
     procedure RestoreState(const Value: TDataSetState);
     Procedure SetActive (Value : Boolean); virtual;
     Procedure SetActive (Value : Boolean); virtual;
     procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;
     procedure SetBookmarkStr(const Value: TBookmarkStr); virtual;
-    procedure SetBufListSize(Value: Longint);
+    procedure SetBufListSize(Value: Longint); virtual;
     procedure SetChildOrder(Component: TComponent; Order: Longint); override;
     procedure SetChildOrder(Component: TComponent; Order: Longint); override;
     procedure SetCurrentRecord(Index: Longint); virtual;
     procedure SetCurrentRecord(Index: Longint); virtual;
     procedure SetFiltered(Value: Boolean); virtual;
     procedure SetFiltered(Value: Boolean); virtual;
@@ -1232,7 +1234,7 @@ type
 
 
   TDataLink = class(TPersistent)
   TDataLink = class(TPersistent)
   private
   private
-    FFIrstRecord,
+    FFirstRecord,
     FBufferCount : Integer;
     FBufferCount : Integer;
     FActive,
     FActive,
     FDataSourceFixed,
     FDataSourceFixed,