Partly because you get a new handle - being more specific, it's because perl does not destroy the menu (the object is stuffed in a global hash, so is never destroyed). If the object were to be destroy in perl, it would call the windows destructor which would release the memory - at least this is my understanding:)
jez. ----- Original Message ----- From: Frazier, Joe Jr To: Jez White ; Win32-GUI Sent: Saturday, February 28, 2004 4:52 PM Subject: RE: [perl-win32-gui-users] A dynamic popup menu example Is that because every time you create menu, you get a new handle? I have an app that does this very thing and I have noticed that it grows in memory also. Try doing a Data::Dumper of the object after each recreation to see if the handle is different. Also, what about the subs? I would "expect" that the sub with the same name would overwrite itself, but perhaps explicitly undefining the typeglob beforehand may help (reaching for straws here). ---------------------------------------------------------------------------- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Jez White Sent: Saturday, February 28, 2004 8:34 AM To: Win32-GUI Subject: [perl-win32-gui-users] A dynamic popup menu example Thanks to Peter Eisengrein and Leonard Jacobsen for giving me the pointers to build this example. The code below creates a window with a richtext control. The richtext can be populated with strings separated by commas. When the menu button is clicked, a popup menu is shown, with a sub menu containing all the strings in the richtext control. When the sub menu items are selected a message is displayed in the status bar. Problems. As been discussed on this list before: * Memory leaks when using menus in this way (about 4K everytime the menu is recreated, or more depending on the number of items in the menu). This can be minimised by only recreating the menu when you actually need to. * Using Menus and the NEM in the same window. Comments, thoughts? Cheers, jez. ========== use Win32::GUI; use strict; my $menu; #The menu my @colors; #A list of the colors in the popup #create the main window my $mainwindow = new Win32::GUI::Window( -title => "Win32::GUI::Rebar test", -left => 100, -top => 100, -width => 600, -height => 200, -name => "Window", ); $mainwindow->AddStatusBar( -name => "Status", ); $mainwindow->AddRichEdit ( -name => 'ColorRE', -pos => [2, 2], -size => [320, 40], -multiline => 1, -addstyle => 2097152, -addstyle => 4096, ); $mainwindow->ColorRE->Text('Red,Green,Blue,Yellow,Orange,Brown'); $mainwindow->AddButton ( -name => 'Menu', -pos => [70, 50], -size => [60, 20], -text => 'Menu', -tip => 'Show Menu', ); $mainwindow->Show; Win32::GUI::Dialog; sub Window_Resize { $mainwindow->Status->Resize(0,0); } sub Menu_Click { CreateMenu(); $mainwindow->TrackPopupMenu($menu->{PopUpMenu}, Win32::GUI::GetCursorPos()); } sub GenericColorClick { my $item=shift; $mainwindow->Status->Text('Item clicked '.$item.' '.$colors[$item]); } sub CreateMenu { #Get the colors from the richedit control @colors=split(',',$mainwindow->ColorRE->Text); my @items; my $subname; my $count; #loop round all colors, create a new sub to handle the event foreach my $col (@colors) { $subname = "Colour$count".'_Click'; eval ("sub $subname { GenericColorClick ($count);}"); die "error in eval $@ " if $@; push @items,">> $col"; push @items,"Colour$count"; $count++; } $menu = new Win32::GUI::Menu( "" => 'PopUpMenu', "> &Hide" => "Edit", "> &Minimize" => "Edit", "> -" => 0, "> Colors" => "Edit", @items, "> Cars" => "Edit1", ">> Aston Martin" => "Edit", "> -" => 0, "> &Quit" => "Exit", ); };