<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.6000.16788" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2>Hi
All,</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2> I'm working on
a TK app, and I'm struggling with a few things.</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2>I have a function
which looks a bit like this:</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2>sub
new_object</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial
size=2>{</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2> my
$object=My::Class->new(); #
Create a new object to monitor<BR> my
$tl=$mw->Toplevel;
# Create a top-level
window.<BR> $tl->title($object->{'name'});
# Set the title of the new
window.<BR> $tl->Label(-text=>"Name:")->grid(-row=>0,
-column=>0); # Add Labels to
window.<BR> $tl->Label(-textvariable=>\$object->{'name'})->grid(-row=>0,
-column=>1);<BR> $tl->Label(-text=>"IP
Address")->grid(-row=>1,
-column=>0);<BR> $tl->Label(-textvariable=>\$object->{'ip'})->grid(-row=>1,
-column=>1);<BR> $tl->Label(-text=>"Uptime:")->grid(-row=>2,
-column=>0);<BR> $tl->Label(-textvariable=>\$object->{'uptime'})->grid(-row=>2,
-column=>1);<BR> $tl->Button(-text=>"Exit",
-command=>sub{$tl->destroy()})->grid(-row=>20,
-column=>0); # Create an exit button.<BR> $tl->repeat(5000,
sub{$object->update_status()}); # Update the status every 5
seconds.<BR>}</DIV></FONT></SPAN>
<DIV><SPAN class=791150423-08122008><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2>Now this works as it
is, but I just know it won't scale well. I would rather have a single class
method I could call which would run update_status() on all objects of it's
class, and call it from the main window ($mw in this case). So my first question
is, how can a class access all instances of itself? I considered creating an
array in which I could store a reference to all objects, but that just seems
wrong, 'cause it will prevent objects from going out of scope when all other
references to them are deleted.</DIV></FONT></SPAN>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2>The second question
is in relation to keeping $object in scope. If I remove the last line of the
above function, $object goes out of scope as soon as the function completes.
Having a label with -textvariable=>\$object{'anything'} isn't sufficient to
keep $object in scope.</FONT></SPAN></DIV>
<DIV><SPAN class=791150423-08122008><FONT face=Arial size=2><SPAN
class=791150423-08122008>So, if I was to create a class method as required,
there would be no objects to call update_status() on.</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2>However, with the function as it is above, even
destroying $tl (when the user clicks on the 'Exit' button) doesn't call DESTROY
on $object. There must be some reference to the object somewhere<SPAN
class=791150423-08122008>, created by $tl->repeat(), which isn't going
out of scope when $tl is destroy()ed.</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT></SPAN> </DIV>
<DIV><FONT face=Arial size=2><SPAN class=791150423-08122008>Anybody care to shed
some light on this?</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN
class=791150423-08122008></SPAN></FONT> </DIV>
<DIV align=left>
<DIV align=left><FONT face=Arial
size=2>Regards,<BR>
Leigh</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Leigh Sharpe<BR>Network Systems Engineer<BR>Pacific
Wireless<BR>Ph +61 3 9584 8966<BR>Mob 0408 009 502</FONT></DIV>
<DIV><FONT face=Arial size=2>Helpdesk 1300 300 616<BR>email <A
title=mailto:lsharpe@pacificwireless.com.au
href="blocked::mailto:lsharpe@pacificwireless.com.au">lsharpe@pacificwireless.com.au</A><BR>web
<A title=http://www.pacificwireless.com.au/
href="blocked::http://www.pacificwireless.com.au/">www.pacificwireless.com.au</A></FONT></DIV></DIV>
<DIV> </DIV></BODY></HTML>