From 1d7ba22be7aaf388a1b83efee7c4300212e3b077 Mon Sep 17 00:00:00 2001 From: dmitry Date: Sat, 19 Sep 2009 08:43:20 +0000 Subject: [PATCH] menueditor: fix for memory leaks git-svn-id: trunk@21763 - --- designer/designermenu.pp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/designer/designermenu.pp b/designer/designermenu.pp index f91cc6b1f2..2e2ff35be9 100644 --- a/designer/designermenu.pp +++ b/designer/designermenu.pp @@ -114,6 +114,7 @@ type protected procedure PersistentDeleting(APersistent: TPersistent); function SearchItemByPanel(DesignerMenuItem: PDesignerMenuItem; APanel: TPanel): PDesignerMenuItem; + procedure ClearAllMenus; public // Constructor and destructor constructor CreateWithMenu(AOwner: TComponent; AMenu: TMenu); @@ -213,7 +214,9 @@ end; procedure TDesignerMainMenu.SetRoot(const AValue: PDesignerMenuItem); begin if FRoot <> nil then + begin Dispose(FRoot); + end; FRoot := AValue; end; @@ -315,7 +318,7 @@ destructor TDesignerMainMenu.Destroy; begin if GlobalDesignHook<>nil then GlobalDesignHook.RemoveAllHandlersForObject(Self); - Root := nil; + ClearAllMenus; FreeAndNil(XMLConfig); inherited Destroy; end; @@ -968,6 +971,21 @@ begin Result := nil; end; +procedure TDesignerMainMenu.ClearAllMenus; + + procedure DeleteRecursive(var AMenu: PDesignerMenuItem); + begin + if not Assigned(AMenu) then Exit; + if Assigned(AMenu^.NextItem) then DeleteRecursive(AMenu^.NextItem); + if Assigned(AMenu^.SubMenu) then DeleteRecursive(AMenu^.SubMenu); + Dispose(AMenu); + AMenu:=nil; + end; + +begin + DeleteRecursive(fRoot); +end; + // -----------------------------------------------------------------// // Insert From Template has been selected from context menu --------// // -----------------------------------------------------------------//