diff --git a/components/lazreport/source/lr_class.pas b/components/lazreport/source/lr_class.pas index 7d645c24b1..10e199932a 100644 --- a/components/lazreport/source/lr_class.pas +++ b/components/lazreport/source/lr_class.pas @@ -5888,11 +5888,18 @@ begin end; procedure TfrPage.FormPage; +type + TBookRecord = record + Dataset: TfrDataset; + Bookmark: Pointer; + end; var BndStack: Array[1..MAXBNDS * 3] of TfrBand; MaxLevel, BndStackTop: Integer; i, sfPage : Integer; HasGroups : Boolean; + DetailCount : Integer; + BooksBkUp : array of TBookRecord; procedure AddToStack(b: TfrBand); begin @@ -5903,6 +5910,41 @@ var end; end; + procedure BackupBookmark(b: TfrBand); + var + n: Integer; + begin + n := Length(BooksBkUp); + SetLength(BooksBkUp, n+1); + BooksBkUp[n].Dataset := b.Dataset; + BooksBkUp[n].Bookmark := b.Dataset.GetBookmark; + if b.Typ in [btDetailData,btSubDetailData] then + inc(DetailCount); + end; + + procedure RestoreBookmarks; + var + n: Integer; + begin + for n:=0 to Length(BooksBkUp)-1 do + with BooksBkUp[n] do begin + Dataset.GotoBookMark(Bookmark); + Dataset.FreeBookMark(Bookmark); + if DetailCount=0 then + Dataset.EnableControls; + end; + SetLength(BooksBkUp, 0); + end; + + procedure DisableControls; + var + n: Integer; + begin + if DetailCount=0 then + for n:=0 to Length(BooksBkUp)-1 do + BooksBkUp[n].Dataset.DisableControls; + end; + procedure ShowStack; var i: Integer; @@ -5944,11 +5986,13 @@ var b := Bands[Bnds[Level, bpData]]; while (b <> nil) and (b.Dataset <> nil) do begin - BM:=b.DataSet.GetBookMark; - b.DataSet.DisableControls; try b.DataSet.First; + //if Level<>1 then begin + // b.Dataset.Refresh; + //end; + if Mode = pmBuildList then AddRecord(b, rtFirst) else @@ -6043,9 +6087,6 @@ var Dec(BndStackTop); end; finally - b.DataSet.GotoBookMark(BM); - b.DataSet.FreeBookMark(BM); - b.DataSet.EnableControls; end; b := b.Next; end; @@ -6107,16 +6148,23 @@ begin end; BndStackTop := 0; + SetLength(BooksBkUp, 0); + DetailCount := 0; for i := 1 to MAXBNDS do begin if BandExists(Bands[Bnds[i, bpData]]) then + begin MaxLevel := i; + BackupBookmark(Bands[Bnds[i, bpData]]); + end; end; HasGroups := Bands[btGroupHeader].Objects.Count > 0; {$IFDEF DebugLR} DebugLn('%sMaxLevel=%d doing DoLoop(1)',[sspc,MaxLevel]); {$ENDIF} + DisableControls; DoLoop(1); + RestoreBookmarks; // this also enablecontrols if Mode = pmNormal then begin if not RowsLayout then diff --git a/components/lazreport/source/lr_dbset.pas b/components/lazreport/source/lr_dbset.pas index 76048d08a5..b02c65428f 100644 --- a/components/lazreport/source/lr_dbset.pas +++ b/components/lazreport/source/lr_dbset.pas @@ -42,6 +42,7 @@ type procedure Exit; override; procedure First; override; procedure Next; override; + procedure Refresh; override; procedure Open; procedure Close; function Eof: Boolean; override; @@ -197,6 +198,12 @@ begin inherited Next; end; +procedure TfrDBDataSet.Refresh; +begin + if GetDataset<>nil then + GetDataset.Refresh; +end; + function TfrDBDataSet.Eof: Boolean; begin Result := inherited Eof or GetDataSet.Eof or FEof; diff --git a/components/lazreport/source/lr_dset.pas b/components/lazreport/source/lr_dset.pas index 7c3c2cd173..8fff991dec 100644 --- a/components/lazreport/source/lr_dset.pas +++ b/components/lazreport/source/lr_dset.pas @@ -38,6 +38,7 @@ type procedure Exit; virtual; procedure First; virtual; procedure Next; virtual; + procedure Refresh; virtual; function GetBookMark : Pointer; virtual; procedure GotoBookMark(BM : Pointer); virtual; @@ -94,6 +95,10 @@ begin if Assigned(FOnNext) then FOnNext(Self); end; +procedure TfrDataset.Refresh; +begin +end; + function TfrDataset.GetBookMark: Pointer; begin Result:=nil;