From 09885fc447ca1e947f7f43cec8c1dcc3c903ef0d Mon Sep 17 00:00:00 2001 From: Juha Date: Sun, 12 Mar 2023 01:30:29 +0200 Subject: [PATCH] IDE: Prevent a crash in unit dependencies window when no project is open. React to changed project. Issue #39828. --- ide/unitdependencies.pas | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/ide/unitdependencies.pas b/ide/unitdependencies.pas index 00e82bf262..bda5e70a14 100644 --- a/ide/unitdependencies.pas +++ b/ide/unitdependencies.pas @@ -265,8 +265,8 @@ type ParentTVNode: TTreeNode; ParentUDNode: TUDNode; Expand: boolean); procedure FreeUsesGraph; function GetPopupTV_UDNode(out UDNode: TUDNode): boolean; - procedure GraphOptsApplyClicked(AnOpts: TLvlGraphOptions; AGraph: TLvlGraph - ); + procedure GraphOptsApplyClicked(AnOpts: TLvlGraphOptions; AGraph: TLvlGraph); + function HandleProjectOpened(Sender: TObject; {%H-}AProject: TLazProject): TModalResult; procedure SelectNextSearchTV(TV: TTreeView; StartTVNode: TTreeNode; SearchNext, SkipStart: boolean); function FindNextTVNode(StartNode: TTreeNode; @@ -595,6 +595,8 @@ begin EnvironmentOptions.RegisterSubConfig(FPackageGraphOpts, 'UnitDependencies/PackageGraph'); EnvironmentOptions.RegisterSubConfig(FUnitGraphOpts, 'UnitDependencies/UnitGraph'); + LazarusIDE.AddHandlerOnProjectOpened(@HandleProjectOpened); + LazarusIDE.AddHandlerOnProjectClose(@HandleProjectOpened); StartParsing; end; @@ -792,8 +794,7 @@ begin if UsedByIntf>0 then s+=LineEnding+Format(lisUDUsedByInterfaces, [IntToStr(UsedByIntf)]); if UsedByImpl>0 then - s+=LineEnding+Format(lisUDUsedByImplementations, [IntToStr(UsedByImpl)] - ); + s+=LineEnding+Format(lisUDUsedByImplementations, [IntToStr(UsedByImpl)]); end; end; HintInfo^.HintStr:=s; @@ -844,11 +845,11 @@ begin IdleConnected:=true; end; - procedure TUnitDependenciesWindow.FormDestroy(Sender: TObject); begin IdleConnected:=false; - + LazarusIDE.RemoveHandlerOnProjectClose(@HandleProjectOpened); + LazarusIDE.RemoveHandlerOnProjectOpened(@HandleProjectOpened); FreeUsesGraph; FreeAndNil(FNewGroups); FreeAndNil(FNewUsesGraph); @@ -862,8 +863,7 @@ begin FreeAndNil(FUnitGraphOpts); end; -procedure TUnitDependenciesWindow.GroupsLvlGraphSelectionChanged(Sender: TObject - ); +procedure TUnitDependenciesWindow.GroupsLvlGraphSelectionChanged(Sender: TObject); begin UpdateUnitsLvlGraph; end; @@ -893,8 +893,7 @@ begin ProgressBar1.Style:=pbstNormal; RefreshButton.Enabled:=true; Timer1.Enabled:=false; - StatsLabel.Caption:=Format(lisUDUnits2, [IntToStr( - FUsesGraph.FilesTree.Count)]); + StatsLabel.Caption:=Format(lisUDUnits2, [IntToStr(FUsesGraph.FilesTree.Count)]); // update controls UpdateAll; end; @@ -2266,6 +2265,14 @@ begin MainIDEInterface.SaveEnvironment; end; +function TUnitDependenciesWindow.HandleProjectOpened(Sender: TObject; + AProject: TLazProject): TModalResult; +begin + Result:=mrOk; + if FFlags=[] then + StartParsing; +end; + procedure TUnitDependenciesWindow.UpdateAllUnitsTreeView; var TV: TTreeView; @@ -2450,7 +2457,8 @@ var UnitSet: TFPCUnitSetCache; begin UnitSet:=CodeToolBoss.GetUnitSetForDirectory(''); - Result:=UnitSet.FPCSourceDirectory; + if Assigned(UnitSet) then + Result:=UnitSet.FPCSourceDirectory; end; function TUnitDependenciesWindow.IsFPCSrcGroup(Group: TUGGroup): boolean;