From: Jeremy W. <jez...@ho...> - 2005-08-10 09:12:25
|
>Have you tried this? It's sort of equivalent to > >} > my $mw; > $mw = Win32::GUI::Window->new( > ... > -onTerminate => sub { undef $mw }, > ); >} > >Which uses a closure to stop $mw's ref count going to zero at the end of >the enclosing block, but forces it to zero in the onTerminate handler. Humm - I've just had a bit of a play, and I am not convinced the window destruction logic is correct. Under the hood a window is both an object and a tied hash ref right? Could it be the case that we're destroying one and not the other? Anyways, have a play with the example below. Cheers, jez. ----------------- use strict; use warnings; use Win32::GUI; # Create the main window my $mainwindow = new Win32::GUI::Window( -name => "Window", -title => "Objects and Windows", -pos => [100,100], -size => [400,400], ); #We now create several employee windows EmployeeSelector->new($mainwindow,20,20); EmployeeSelector->new($mainwindow,20,50); EmployeeSelector->new($mainwindow,20,80); EmployeeSelector->new($mainwindow,20,110); EmployeeSelector->new($mainwindow,20,140); $mainwindow->Show(); #Enter the message processing loop Win32::GUI::Dialog(); exit(0); package EmployeeSelector; use strict; use warnings; use Win32::GUI; use base qw(Win32::GUI::Window); #The constructor sub new { my ($class, $parent, $xcor, $ycor)=@_; #Create window my $self = $class->SUPER::new( #my $self = new Win32::GUI::Window( #-parent => $parent, -pos => [$xcor,$ycor], -size => [150, 60], #-onTerminate => sub {return 1}, #When we terminate, the ref counter of the UserData is dropped, which should kick off the destruction -onTerminate => sub {my $self=shift;print "in terminate self is $self\n"}, ); $self->AddButton ( -text => 'Click Me!', -pos => [60,2], -size => [60,20], -onClick => sub {print 'Button Clicked';}, ); print "Created $self\n"; $self->Show(); #Save the window in the window user data, once the sub finishes, there is no reference to the #window other than itself. The destiny of the window is in it's own hands. $self->UserData($self); } sub DESTROY { my $self=shift; print "In destroy $self \n"; $self->SUPER::DESTROY(); } |