You've already forked lazarus-ccr
LazMapViewer: Attempting to fix occasional crash at destruction. Patch by Ekkehard Domning
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8794 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -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;
|
||||
|
Reference in New Issue
Block a user