diff --git a/components/lazmapviewer/source/mvmapprovider.pas b/components/lazmapviewer/source/mvmapprovider.pas index 8cb032f4b..78699cfef 100644 --- a/components/lazmapviewer/source/mvmapprovider.pas +++ b/components/lazmapviewer/source/mvmapprovider.pas @@ -201,14 +201,22 @@ begin Finalize(FMinZoom); Finalize(FMaxZoom); EnterCriticalSection(FTileHandling); - for i := high(FTiles) downto 1 do - try - freeandnil(FTiles[i]); - except - FTiles[i]:=nil; - end; - LeaveCriticalsection(FTileHandling); - DoneCriticalsection(FTileHandling); + try + for i := high(FTiles) downto 0 do + try + if Assigned(FTiles[i]) then + begin + FTiles[i].FMapProvider := nil; // Avoid removing from the FTiles array since this might change the IDs + FTiles[i].Free; + FTiles[i] := nil; + end; + except + FTiles[i] := nil; + end; + finally + LeaveCriticalSection(FTileHandling); + end; + DoneCriticalSection(FTileHandling); inherited; end; @@ -217,28 +225,62 @@ var lNewID: Integer; begin EnterCriticalSection(FTileHandling); - lNewID :=high(FTiles)+1; - setlength(FTiles,lNewID+1); - FTiles[lNewID]:=aTile; - LeaveCriticalsection(FTileHandling); - result := lNewID; + try + lNewID :=high(FTiles)+1; + setlength(FTiles,lNewID+1); + FTiles[lNewID]:=aTile; + result := lNewID; + finally + LeaveCriticalsection(FTileHandling); + end; end; procedure TMapProvider.RemoveTile(aTile: TBaseTile); var - lID, lMaxTile: Integer; + lID, lMaxTile, lTileIdx, i: Integer; begin - if (atile.ID <= high(FTiles)) and (atile.ID>0) and (FTiles[aTile.ID]=aTile) then + EnterCriticalSection(FTileHandling); + { + try + if (aTile.ID <= high(FTiles)) and (aTile.ID>0) and (FTiles[aTile.ID]=aTile) then begin - EnterCriticalSection(FTileHandling); lID := aTile.ID; lMaxTile :=High(FTiles); aTile.FID := -1; FTiles[lID] := FTiles[lMaxTile]; FTiles[lID].FID := lID; - setlength(FTiles,lMaxTile); - LeaveCriticalsection(FTileHandling); + SetLength(FTiles,lMaxTile); end; + finally + LeaveCriticalsection(FTileHandling); + end; + } + try + lTileIdx := -1; + for i := 0 to High(FTiles) do + begin + if FTiles[i] = aTile then + begin + lTileIdx := i; + Break; + end; + end; + if lTileIdx >= 0 then + begin + lMaxTile := High(FTiles); + aTile.FID := -1; + FTiles[lTileIdx] := FTiles[lMaxTile]; + FTiles[lTileIdx].FID := lTileIdx; + SetLength(FTiles, lMaxTile); + end; + for i := 0 to High(FTiles) do + begin + if FTiles[i].FID <> i then + FTiles[i].FID := i; + end; + finally + LeaveCriticalSection(FTileHandling); + end; end; procedure TMapProvider.AddURL(Url: String; ProjectionType: TProjectionType;