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", 
             );
    };

Reply via email to