From: Reuven M. L. <re...@le...> - 2004-05-20 19:57:45
|
Hi, everyone. I'm working on a program that uses Wx to read ISBNs in from a hand-held bar-code scanner, and am fairly new to the GUI world. The program should: * Accept a 13-digit UPC into a TextCtrl from the scanner, filtering out all characters but numbers and [xX], and * Fire off a SOAP request to a remote server to double-check the book's status in our warehouse. I started by attaching a subroutine to EVT_TEXT on the TextCtrl. But the scanner doesn't insert a newline after the UPC. So I have to count 13 characters, and send the SOAP request, using EVT_CHAR instead. But using EVT_CHAR means that: * I can't modify the characters as they come in, because every modification of the TextCtrl triggers another EVT_CHAR event, * Because I'm inside of an event handler, I can't update the StatusText on my frame, and * Because EVT_CHAR is triggered on the TextCtrl, rather than its parent frame, I'm having trouble accessing the StatusText and other variables associated with the frame. I'm sure that there is some way to wait for 13 valid characters to be entered into a TextCtrl, rejecting the "bad" ones and displaying the good ones, and then doing with it afterwards. Any ideas? I'm tempted to simply filter the characters with EVT_CHAR, and separately have a timer that checks for 13 characters in the TextCtrl every second or so. But that seems a bit nutty to me, and I'm wondering if there is a better way. Thanks in advance for any advice you might have, Reuven |
From: Joe Y. <jyo...@jo...> - 2004-05-20 21:11:36
|
a hackish approach would be to pop out of the EVT_TEXT subroutine unless the number of characters in the list is 13, set a flag that your about to filter the input, make your filtering of characters post the changes back to the text control (if you wish - and I think you do), ignoring the events that are fired until the last character is put back in, when it is (the last character) then flip your flag back to default (not about to filter) so your ready for the next batch and do your SOAP stuff. I'm sure you have already thought of all of that, but figure I'd put it out there just to solidify my ignorance :) A timer route would also be an option, as a timer is pretty light weight in the background in wxPerl, but might be a hassle keeping track of the text from the last check and toggling on and off the firing of the timer. For example, while you were processing the ISBN, you'd likely want to turn off the timer and flip if back on after your finished with the SOAP call. sub onEvtText { my ($this, $event) = @_; return if($this->{textControl}->GetValue() < 14 or ($myGlobalToggleUpdatingVar and $this->{textControl}->GetValue() < 14 )); # ## We've got 13 characters or we've already set our toggle, so now need to make soap call and rest toggle. # if ($myGlobalToggleUpdatingVar) { &mySOAP_Stuff(); $myGlobalToggleUpdatingVar = 0; } else { my $isbn = $this->{textControl}->GetValue(); $isbn =~ s/[^0-9|^x]//ig; $myGlobalToggleUpdatingVar = 1; $this->{textControl}->SetValue($isbn); # Fires text event again, but we're trapping that I think already. } } this isn't tested code, but hope it helps. JY ----- Original Message ----- From: "Reuven M. Lerner" <re...@le...> To: <wxp...@li...> Sent: Thursday, May 20, 2004 2:57 PM Subject: [wxperl-users] Paradigm question > Hi, everyone. I'm working on a program that uses Wx to read ISBNs in > from a hand-held bar-code scanner, and am fairly new to the GUI world. > The program should: > > * Accept a 13-digit UPC into a TextCtrl from the scanner, filtering > out all characters but numbers and [xX], and > * Fire off a SOAP request to a remote server to double-check the > book's status in our warehouse. > > I started by attaching a subroutine to EVT_TEXT on the TextCtrl. But > the scanner doesn't insert a newline after the UPC. So I have to count > 13 characters, and send the SOAP request, using EVT_CHAR instead. But > using EVT_CHAR means that: > > * I can't modify the characters as they come in, because every > modification of the TextCtrl triggers another EVT_CHAR event, > * Because I'm inside of an event handler, I can't update the > StatusText on my frame, and > * Because EVT_CHAR is triggered on the TextCtrl, rather than its > parent frame, I'm having trouble accessing the StatusText and > other variables associated with the frame. > > I'm sure that there is some way to wait for 13 valid characters to be > entered into a TextCtrl, rejecting the "bad" ones and displaying the > good ones, and then doing with it afterwards. Any ideas? I'm tempted > to simply filter the characters with EVT_CHAR, and separately have a > timer that checks for 13 characters in the TextCtrl every second or so. > But that seems a bit nutty to me, and I'm wondering if there is a better > way. > > Thanks in advance for any advice you might have, > > Reuven > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: Oracle 10g > Get certified on the hottest thing ever to hit the market... Oracle 10g. > Take an Oracle 10g class now, and we'll give you the exam FREE. > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > _______________________________________________ > wxperl-users mailing list > wxp...@li... > https://lists.sourceforge.net/lists/listinfo/wxperl-users |
From: Scott L. <lan...@wh...> - 2004-05-21 09:47:51
|
On Thu, 20 May 2004, Reuven M. Lerner wrote: > Hi, everyone. I'm working on a program that uses Wx to read ISBNs in > from a hand-held bar-code scanner, and am fairly new to the GUI world. > The program should: > > * Accept a 13-digit UPC into a TextCtrl from the scanner, filtering > out all characters but numbers and [xX], and > * Fire off a SOAP request to a remote server to double-check the > book's status in our warehouse. > > I started by attaching a subroutine to EVT_TEXT on the TextCtrl. But > the scanner doesn't insert a newline after the UPC. So I have to count > 13 characters, and send the SOAP request, using EVT_CHAR instead. I think normally you'd attach a wxValidator to the TextCtrl, but I don't think wxPerl implements that. (?) |
From: James L. <jl...@bi...> - 2004-05-21 20:45:44
|
Hmm... if you want a validator, I've got a generic validator already written in wxPerl, but have not got it submitted to CPAN yet. Thinking a bit more, I'm not sure if a validator is the right thing here, actually. The validator only fires when the containing dialog box closes - not while the keystrokes are taking place. James ----- Original Message ----- From: "Scott Lanning" <lan...@wh...> To: "Reuven M. Lerner" <re...@le...> Cc: <wxp...@li...> Sent: Friday, May 21, 2004 10:45 AM Subject: Re: [wxperl-users] Paradigm question > On Thu, 20 May 2004, Reuven M. Lerner wrote: > > Hi, everyone. I'm working on a program that uses Wx to read ISBNs in > > from a hand-held bar-code scanner, and am fairly new to the GUI world. > > The program should: > > > > * Accept a 13-digit UPC into a TextCtrl from the scanner, filtering > > out all characters but numbers and [xX], and > > * Fire off a SOAP request to a remote server to double-check the > > book's status in our warehouse. > > > > I started by attaching a subroutine to EVT_TEXT on the TextCtrl. But > > the scanner doesn't insert a newline after the UPC. So I have to count > > 13 characters, and send the SOAP request, using EVT_CHAR instead. > > I think normally you'd attach a wxValidator to the TextCtrl, > but I don't think wxPerl implements that. (?) > > > ------------------------------------------------------- > This SF.Net email is sponsored by: Oracle 10g > Get certified on the hottest thing ever to hit the market... Oracle 10g. > Take an Oracle 10g class now, and we'll give you the exam FREE. > http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click > _______________________________________________ > wxperl-users mailing list > wxp...@li... > https://lists.sourceforge.net/lists/listinfo/wxperl-users |
From: Mattia B. <mat...@li...> - 2004-05-22 17:26:02
|
On Fri, 21 May 2004 21:45:30 +0100 James Lavery <jl...@bi...> wrote: Hello, > Hmm... if you want a validator, I've got a generic validator already > written in wxPerl, but have not got it submitted to CPAN yet. Waiting... > Thinking a bit more, I'm not sure if a validator is the right thing here, > actually. The validator only fires when the containing dialog box closes - > not while the keystrokes are taking place. Yes and no. Actually validators are event handlers and get a chance to process all messages for their associate window. wxTextValidator (that can act as a filter for a wxTextCtrl) works this way. Regards Mattia |
From: Mattia B. <mat...@li...> - 2004-05-22 17:19:00
|
On Thu, 20 May 2004 14:57:53 -0500 "Reuven M. Lerner" <re...@le...> wrote: hello, > Hi, everyone. I'm working on a program that uses Wx to read ISBNs in > from a hand-held bar-code scanner, and am fairly new to the GUI world. > The program should: > > * Accept a 13-digit UPC into a TextCtrl from the scanner, filtering > out all characters but numbers and [xX], and > * Fire off a SOAP request to a remote server to double-check the > book's status in our warehouse. Not tested, but should work: my $frame = ...; my $textctrl = ...; EVT_IDLE( $textctrl, sub { if( length( $textctrl->GetValue ) == 13 ) { # do SOAP call } } ); EVT_CHAR( $textctrl, sub { if( is_good( $_[1]->GetKeyCode ) { $_[1]->Skip; } else { return; } } ); HTH Mattia |