From: Oberholtzer,Stephen <ste...@fr...> - 2004-02-18 17:02:04
|
It took me over half an hour to figure out why my code wasn't working: $sizer->Add(new Wx::Button($this, wxID_HIGHEST+2, 'Login'), 0, wxALL, = 2); It gave me the strangest error: Usage: Wx::Button::newFull(CLASS, parent, id, label, pos =3D = wxDefaultPosition, size =3D wxDefaultSize, style =3D 0, validator =3D = (wxValidator*)&wxDefaultValidator, name =3D wxButtonNameStr) at = C:\wxPerl\second.pl line 62. This was strange because THIS code (plucked straight out of the wxPerl = demo) worked perfectly fine: $fr->Add( Wx::Button->new( $this, wxID_OK, 'Close window' ), 0, wxALL, = 10 ); I even tried debugging, and got nowhere. Everything seemed fine. It = wasn't until quite a bit later that I realized what was going on. The constants (in this instance, wxID_HIGHEST) rely on autoload to = operate, yet they are also exported (I'm not yet fully aware of how this = manages to work...). However, since there is no prototype on these = constant functions, perl groks *my* line like this: $sizer->Add(new Wx::Button($this, wxID_HIGHEST( +2, 'Login')), 0, = wxALL, 2); Since wxID_HIGHEST ignores its arguments and returns just the value = 5999, the effect is like this: $sizer->Add(new Wx::Button($this, wxID_HIGHEST), 0, wxALL, 2); The missing 'label' parameter causes the error to show up. There is a relatively easy fix for this problem, and it involves two = steps. 1. In the eval that creates the sub, add an empty prototype to inform = Perl that this is a constant function. eval "sub $AUTOLOAD () { $val }"; This also has the convenient effect of letting Perl inline the = constant directly into the optree instead of making a function call = every time the constant is used. 2. Near the end of the 'import' subroutine, immediately prior to the = 'export_to_level' call, execute this: do { no strict 'refs'; &$_ } for @_; This forces the constants to be exist at the time they are use-d, so = that Perl can actually see the prototypes. --=20 Stevie-O Real programmers use COPY CON PROGRAM.EXE This E-Mail is intended only for the use of the individual or entity to = which it is addressed, and may contain information that is privileged, = confidential and exempt from disclosure under applicable law. If you = have received this communication in error, please do not distribute it = and notify us immediately by telephone: 610-902-9000 and delete the = original message. |
From: herbert b. <dei...@we...> - 2004-02-18 20:50:40
|
i wrote to the webmaster and he added wxperl to perl.org. see under http://www.perl.org/app.html TIMTOWTDI horray herbert |
From: Simon F. <sf...@fl...> - 2004-02-19 11:24:06
|
On Wed, 18 Feb 2004 21:44:57 +0100, herbert breunung wrote > i wrote to the webmaster and he added wxperl > to perl.org. see under > http://www.perl.org/app.html That's great. Only it's "wxWindows" and "wxPerl". Until wxWindows changes its name: http://shrunk.net/?c=843afad3 --simonf |
From: Mattia B. <mat...@li...> - 2004-02-28 14:13:00
|
Il Wed, 18 Feb 2004 11:56:54 -0500 "Oberholtzer,Stephen" <ste...@fr...> ha scritto: Hello, > It took me over half an hour to figure out why my code wasn't > working: > > $sizer->Add(new Wx::Button($this, wxID_HIGHEST+2, 'Login'), 0, > wxALL, = > 2); > > It gave me the strangest error: > > Usage: Wx::Button::newFull(CLASS, parent, id, label, pos =3D = > wxDefaultPosition, size =3D wxDefaultSize, style =3D 0, validator > =3D = > (wxValidator*)&wxDefaultValidator, name =3D wxButtonNameStr) at = > C:\wxPerl\second.pl line 62. > > > This was strange because THIS code (plucked straight out of the > wxPerl = > demo) worked perfectly fine: > > $fr->Add( Wx::Button->new( $this, wxID_OK, 'Close window' ), 0, > wxALL, = > 10 ); > > > I even tried debugging, and got nowhere. Everything seemed fine. > It = > wasn't until quite a bit later that I realized what was going on. > > > The constants (in this instance, wxID_HIGHEST) rely on autoload to = > operate, yet they are also exported (I'm not yet fully aware of how > this = > manages to work...). However, since there is no prototype on these = > constant functions, perl groks *my* line like this: > > $sizer->Add(new Wx::Button($this, wxID_HIGHEST( +2, 'Login')), 0, = > wxALL, 2); > > Since wxID_HIGHEST ignores its arguments and returns just the value > = > 5999, the effect is like this: > > $sizer->Add(new Wx::Button($this, wxID_HIGHEST), 0, wxALL, 2); > > The missing 'label' parameter causes the error to show up. > > There is a relatively easy fix for this problem, and it involves > two = > steps. > > 1. In the eval that creates the sub, add an empty prototype to > inform = > Perl that this is a constant function. > > eval "sub $AUTOLOAD () { $val }"; > > This also has the convenient effect of letting Perl inline the = > constant directly into the optree instead of making a function call > = > every time the constant is used. > > > 2. Near the end of the 'import' subroutine, immediately prior to > the = > 'export_to_level' call, execute this: > > do { no strict 'refs'; &$_ } for @_; > > This forces the constants to be exist at the time they are use-d, > so = > that Perl can actually see the prototypes. This is a nontrivial problem: some constants might be not available for a specific wxWindows version/OS, but are nonetheless exported by wxPerl (and fixing this is another nontrivial problem). In addition, doing what you propose would make "use Wx qw(:everything)" quite slow. Regards Mattia P.S.: it is not that I like the current state of things, but I spent a lot of time trying figure a safe and *efficient* way of handling this, but I have not found a satisfactory solution. |