From: Mattia B. <mb...@ds...> - 2002-07-29 20:14:57
|
> I'm having a few difficulties with menus. I'm trying to implement a > file history. How do you change a menu? > I thought you would delete it and then append it, or use SetLabel. > > Anyway, neither $mfile->Delete(id), Destroy, Remove or SetLabel have > any effect. Does anybody have a sample? > wxPerl does not complain, but nothing happens. I tried UpdateUI(), but > that changes nothing. The C++ menu sample uses Destroy(). This works for me (added to minimal sample). $mfile->Append( 123, "Append" ); $mfile->Append( 124, "Remove" ); EVT_MENU( $this, 123, sub { $mhelp->Append( 1, "Dummy" ); } ); EVT_MENU( $this, 124, sub { #$mhelp->Destroy(($mhelp->GetMenuItems)[-1]); # this one works too $mhelp->Destroy( 1 ); } ); > 2) Is Menu Range implemented? > I tried: > EVT_MENU_RANGE($this,$main::ID_FILEHISTORY1, $main::ID_FILEHISTORY5, > \&OnFileHistory); > > and get: > Error while autoloading 'Wx::wxEVT_COMMAND_MENU_RANGE' at > J:/Perl/site/lib/Wx/Event.pm line 54 Oops, in Wx/Event.pm, replace wxEVT_COMMAND_MENU_RANGE with wxEVT_COMMAND_MENU_SELECTED. Regards Mattia |
From: Marcus <ma...@wo...> - 2002-07-30 15:41:54
|
>This works for me (added to minimal sample). >... EVT_MENU( $this, 124, sub { #$mhelp->Destroy(($mhelp->GetMenuItems)[-1]); # this one works too $mhelp->Destroy( 1 ); } ); Ah, using it inside the create menubar sub works, otherwise it doesn't because you lose the handle on the menu. So, the answer was to copy the handle and make it accessable from other subs. (Mattia) Can you explain why the handle (scalar) for the menu changes, but not the handle for the menu bar? using this code: my ($mbar) = &main::MyMenuBarFunc(); print "mbar:$mbar\n"; my ($mfile) = $mbar->GetMenu(0); print "mfile:$mfile\n"; The latter changes later on, although mbar is the same. 2) >Oops, in Wx/Event.pm, replace wxEVT_COMMAND_MENU_RANGE >with wxEVT_COMMAND_MENU_SELECTED Thanks, that works now :-) Marcus |
From: Mattia B. <mb...@ds...> - 2002-07-30 20:30:18
|
> >This works for me (added to minimal sample). > > >... EVT_MENU( $this, 124, sub { > #$mhelp->Destroy(($mhelp->GetMenuItems)[-1]); # this one works too > $mhelp->Destroy( 1 ); > } ); > > > Ah, using it inside the create menubar sub works, otherwise it doesn't because > you lose the handle on the menu. So, the answer was to copy the handle and make > it accessable from other subs. By "handle to the menu" do you mean $mhelp? You should be able to get it using $frame->GetMenuBar()->GetMenu(1); # or 0 or 2, etc It is just that I am lazy and didn't want to write that; it should work, though. > (Mattia) Can you explain why the handle (scalar) for the menu changes, but not > the handle for the menu bar? > using this code: > > my ($mbar) = &main::MyMenuBarFunc(); > print "mbar:$mbar\n"; > my ($mfile) = $mbar->GetMenu(0); > print "mfile:$mfile\n"; > > The latter changes later on, although mbar is the same. I think that the fact that $mbar stays the same is just the fact that the internally the same memory got reused. Basically: 1) &main::MyMenuBarFunc() allocates a scalar and returns it 2) the sacalar is freed 3) &main::MyMenuBarFunc() allocates a scalar and returns it, "casually" the scalar has the same address as the first one ("casually" means that with some changes to the code this might not be true anymore) I am not sure of that; just guessing. Regards Mattia |