Arh. Simple.
 
Apologies. Thanks for improvements to the parts methods - will be handy:)
 
Cheers,
 
jez.
----- Original Message -----
From: Stephen Pick
To: Jez White ; Win32-GUI
Sent: Monday, February 16, 2004 10:51 AM
Subject: RE: [perl-win32-gui-users] Status bar Parts method bug.

Hi Jez.
 
I found the problem (duh...) You should remember that Parts also returns the widths of all parts as a list. Since you have a part of width -1 on the last part, when you call Parts a list with -1 as the last element is being returned.
 
In the instances you showed where Parts does not work, $_ is being set to -1 by your code. For example,
$status->Parts(10,20,-1);
 
would set $_ to -1. Then when the function just runs off the end, the contents of $_ is returned, and if you return -1 from a function in win32::gui, the event loop ends.
 
So to solve your problem, get into the habit of explicitly returning from your functions. It's a very good habit to be in and can stop a lot of bugs appearing, especially in Win32::GUI. Also, I've committed an update for the statusbar Parts method that will check if it's in Scalar context and if so returns the number of parts instead of a list of parts. This will also fix your problem.
 
Steve
-----Original Message-----
From: perl-win32-gui-users-admin@lists.sourceforge.net [mailto:perl-win32-gui-users-admin@lists.sourceforge.net]On Behalf Of Jez White
Sent: 15 February 2004 10:08
To: Win32-GUI
Subject: [perl-win32-gui-users] Status bar Parts method bug.

Hi,
 
I've found a bug when using the parts method in the status bar control. All the following statements fail (no error, application just exits):
 
  $status->Parts($width-200,$width-100,-1);
  my $temp=$status->Parts($width-200,$width-100,-1);
  my @temp=$status->Parts($width-200,$width-100,-1);
 
While the following works:
 
 print $status->Parts($width-200,$width-100,-1);
 foreach ($status->Parts($width-200,$width-100,-1)) {print "$_ \n";}
See example below. I've created a task in the tracker.
 
Cheers,
 
jez.
 
=====================================
use Win32::GUI;
use strict;
 
 my $W = new GUI::Window(
    -title    => "Win32::GUI::status test",
    -left     => 100,
    -top      => 100,
    -width    => 300,
    -height   => 200,
    -name     => "main",
    -onResize => \&main_resize
);
 
my $status=$W->AddStatusBar(-name   => "Status");
 
$status->Parts(50,100,-1);
$status->PartText(0,'Lots of text');
$status->PartText(1,'Part 1');
$status->PartText(2,'Part 2');
 
$W->Show;
 
Win32::GUI::Dialog;
 
sub main_resize {
 $status->Width($W->ScaleWidth);
 $status->Top($W->ScaleHeight - $status->Height);
 my $width=$status->Width;
 #The following work:
 print $status->Parts($width-200,$width-100,-1);
 #foreach ($status->Parts($width-200,$width-100,-1)) {print "$_ \n";}
 #The following fail:
 #$status->Parts($width-200,$width-100,-1);
 #my $temp=$status->Parts($width-200,$width-100,-1);
 #my @temp=$status->Parts($width-200,$width-100,-1);
 
}