From: Peter T. <pe...@Pe...> - 2006-08-14 19:09:25
|
<html> <body> <font size=3>(sorry about the bad subject on the previous post attempt...)<br><br> I need to find which word in a multi-line TextCtrl has been right-clicked on.<br> I cannot find any way of doing this.<br><br> I hacked together something nasty to find which word is left-click using the insertion point:<br> <x-tab> </x-tab>my $ip=$self->GetInsertionPoint();<br> <x-tab> </x-tab>my ($px,$py)=$self->PositionToXY($ip);<br> <x-tab> </x-tab>my $clickedline=$self->GetLineText($py);<br> <x-tab> </x-tab>my ($prefix) = substr($clickedline,0,$px) =~ /([\w'`]+)$/;<br> <x-tab> </x-tab>my ($suffix)= substr($clickedline,$px,1000) =~ /^([\w+'`]+)/;<br> <x-tab> </x-tab>my $clickedword=$prefix.$suffix;<br><br> But right-clicking doesn't set the insertion point. I cannot simply use the Y coordinate because I don't know the line-height of the text in the TextCtrl.<br><br> HELP!<br><br> Thanks in advance,<br> -Peter<br> </font></body> </html> |
From: Peter T. <pe...@Pe...> - 2006-08-14 21:59:50
|
<html> <body> <font size=3>I have a TextCtrl with keywords in it. When the user clicks on a keyword I pop up a modal dialog to edit the keyword. For some reason mouse-clicks in the modal dialog box are being sent to the TextCtrl and causing new dialog boxes to pop up on top of the first dialog box. In other words, the dialog is NOT acting MODAL. I am at my *wit's end* trying to figure this out. I have tried both GetTextFromUser() and TextEntryDialog->new() with ShowModal.<br><br> I made a small sample program just to demonstrate this problem:<br> P.S. This TextCtrl cannot be a List because in my real application it does a lot more than in this simple example.<br><br> HELP!<br> -Peter<br><br> #!/usr/bin/perl -w -- <br> use strict;<br> use Wx qw[:everything];<br><br> package main;<br><br> unless(caller){<br> <x-tab> </x-tab>local *Wx::App::OnInit = sub{1};<br> <x-tab> </x-tab>my $app = Wx::App->new();<br> <x-tab> </x-tab>Wx::InitAllImageHandlers();<br><br> <x-tab> </x-tab>my $ui = Test_ui->new();<br><br> <x-tab> </x-tab>$app->SetTopWindow($ui);<br> <x-tab> </x-tab>$ui->Show(1);<br> <x-tab> </x-tab>$app->MainLoop();<br> }<br><br> package Test_ui;<br><br> use Wx qw[:everything :allclasses];<br> use Wx::Event qw(EVT_LEFT_UP);<br><br> our $mainframe;<br> our @keywords=();<br><br> use base qw(Wx::Frame);<br> sub new {<br> <x-tab> </x-tab>my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;<br> <x-tab> </x-tab>$parent = undef unless defined $parent;<br> <x-tab> </x-tab>$id = -1 unless defined $id;<br> <x-tab> </x-tab>$title = "" unless defined $title;<br> <x-tab> </x-tab>$pos = wxDefaultPosition unless defined $pos;<br> <x-tab> </x-tab>$size = wxDefaultSize unless defined $size;<br> <x-tab> </x-tab>$name = "" unless defined $name;<br> <x-tab> </x-tab>$style = wxDEFAULT_FRAME_STYLE unless defined $style;<br><br> <x-tab> </x-tab>$self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name );<br> <x-tab> </x-tab>$mainframe=$self;<br> <x-tab> </x-tab><br> <x-tab> </x-tab>my $main_sizer=Wx::BoxSizer->new(wxVERTICAL);<br><br> <x-tab> </x-tab>$self->{keywords_text} = Wx::TextCtrl->new($self, -1,<br> <x-tab> </x-tab><x-tab> </x-tab>"1. Apples\n2. Bananas\n3. Cherries\n4. Durian",<br> <x-tab> </x-tab><x-tab> </x-tab>wxDefaultPosition, wxDefaultSize,<br> <x-tab> </x-tab><x-tab> </x-tab>wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP);<br> <x-tab> </x-tab>$main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2);<br> <x-tab> </x-tab><br> <x-tab> </x-tab>$self->SetAutoLayout(1);<br> <x-tab> </x-tab>$self->SetSizer($main_sizer);<br> <x-tab> </x-tab>$self->Layout();<br><br> <x-tab> </x-tab>EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up);<br><br> <x-tab> </x-tab>$keywords[0]="Apples";<br> <x-tab> </x-tab>$keywords[1]="Bananas";<br> <x-tab> </x-tab>$keywords[2]="Cherries";<br> <x-tab> </x-tab>$keywords[3]="Durian";<br><br> <x-tab> </x-tab>return $self;<br> }<br><br> sub handle_keywords_left_up {<br> <x-tab> </x-tab>my ($self, $event) =@_;<br> <x-tab> </x-tab>my $ip=$self->GetInsertionPoint();<br> <x-tab> </x-tab>my ($col,$row)=$self->PositionToXY($ip);<br> <x-tab> </x-tab>print("editing keyword #$row\n");<br> <x-tab> </x-tab>return unless $keywords[$row];<br> <x-tab> </x-tab>my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]",<br> <x-tab> </x-tab><x-tab> </x-tab>"Edit keyword $keywords[$row]", $keywords[$row], $mainframe, 0, 0);<br> <x-tab> </x-tab>if ($newtext) {<br> <x-tab> </x-tab><x-tab> </x-tab>$keywords[$row]=$newtext;<br> <x-tab> </x-tab><x-tab> </x-tab>my $keyword_text='';<br> <x-tab> </x-tab><x-tab> </x-tab>my $i=1;<br> <x-tab> </x-tab><x-tab> </x-tab>foreach my $k ( @keywords) {<br> <x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>$keyword_text .= "$i.\t$k\n";<br> <x-tab> </x-tab><x-tab> </x-tab><x-tab> </x-tab>$i++;<br> <x-tab> </x-tab><x-tab> </x-tab>}<br> <x-tab> </x-tab><x-tab> </x-tab>$mainframe->{keywords_text}->SetValue( $keyword_text);<br> <x-tab> </x-tab>}<br> <x-tab> </x-tab><br> <x-tab> </x-tab>#$event->Skip(1);<br> }<br><br> 1;<br> </font></body> </html> |
From: Mark D. <mar...@zn...> - 2006-08-15 00:45:24
|
Hi Peter, Code below works. I'm afraid I don't know enough about Perl and Wx internals to explain why your original doesn't work which is probably unsatisfactory - but at least it means you have some working code! Its all in the way Wx::App is instantiated, I think. I also removed the variables declared as 'our' from the Test_ui package as I'm sure they are not what you want. (but this was not cause of problem) Regards Mark #!/usr/bin/perl -w -- my $app = DemoApp->new(); $app->MainLoop(); package DemoApp;; use strict; use Wx qw[:everything]; use base qw (Wx::App); sub OnInit { Wx::InitAllImageHandlers(); my $ui = Test_ui->new(); $app->SetTopWindow($ui); $ui->Show(1); } package Test_ui; use Wx qw[:everything :allclasses]; use Wx::Event qw(EVT_LEFT_UP); use base qw(Wx::Frame); sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; $style = wxDEFAULT_FRAME_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); my $main_sizer=Wx::BoxSizer->new(wxVERTICAL); $self->{keywords_text} = Wx::TextCtrl->new($self, -1, "1. Apples\n2. Bananas\n3. Cherries\n4. Durian", wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP); $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2); $self->SetAutoLayout(1); $self->SetSizer($main_sizer); $self->Layout(); EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up); $self->{__wordlist} = ['Apples','Bananas','Cherries','Durian']; $self->{ISFRAME} = 1; return $self; } sub handle_keywords_left_up { my ($control, $event) =@_; my $self = $control->GetParent(); my $ip = $self->{keywords_text}->GetInsertionPoint(); my ($col,$row)=$self->{keywords_text}->PositionToXY($ip); my @keywords = @{ $self->{__wordlist} }; print("editing keyword #$row\n"); return unless $keywords[$row]; my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]", "Edit keyword $keywords[$row]", $keywords[$row], $self, 0, 0); if ($newtext) { $keywords[$row]=$newtext; my $keyword_text=''; my $i=1; foreach my $k ( @keywords) { $keyword_text .= "$i.\t$k\n"; $i++; } $self->{keywords_text}->SetValue( $keyword_text); } $event->Skip(1); } 1; Peter Theobald wrote: > I have a TextCtrl with keywords in it. When the user clicks on a keyword I pop > up a modal dialog to edit the keyword........ |
From: Mark D. <mar...@zn...> - 2006-08-15 08:28:01
|
Hi, > I'm afraid I don't know enough about Perl and Wx internals or much else it would seem. I'm sure I ran this successfully !!! Anyhow, $self->ReleaseMouse(); in your original code at the appropriate place does the trick. (as below_ #!/usr/bin/perl -w -- use strict; use Wx qw[:everything]; package main; unless(caller){ local *Wx::App::OnInit = sub{1}; my $app = Wx::App->new(); Wx::InitAllImageHandlers(); my $ui = Test_ui->new(); $app->SetTopWindow($ui); $ui->Show(1); $app->MainLoop(); } package Test_ui; use Wx qw[:everything :allclasses]; use Wx::Event qw(EVT_LEFT_UP); our $mainframe; our @keywords=(); use base qw(Wx::Frame); sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; $style = wxDEFAULT_FRAME_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $mainframe=$self; my $main_sizer=Wx::BoxSizer->new(wxVERTICAL); $self->{keywords_text} = Wx::TextCtrl->new($self, -1, "1. Apples\n2. Bananas\n3. Cherries\n4. Durian", wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP); $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2); $self->SetAutoLayout(1); $self->SetSizer($main_sizer); $self->Layout(); EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up); $keywords[0]="Apples"; $keywords[1]="Bananas"; $keywords[2]="Cherries"; $keywords[3]="Durian"; return $self; } sub handle_keywords_left_up { my ($self, $event) =@_; my $ip=$self->GetInsertionPoint(); my ($col,$row)=$self->PositionToXY($ip); $self->ReleaseMouse(); print("editing keyword #$row\n"); return unless $keywords[$row]; my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]", "Edit keyword $keywords[$row]", $keywords[$row], $mainframe, 0, 0); if ($newtext) { $keywords[$row]=$newtext; my $keyword_text=''; my $i=1; foreach my $k ( @keywords) { $keyword_text .= "$i.\t$k\n"; $i++; } $mainframe->{keywords_text}->SetValue( $keyword_text); } #$event->Skip(1); } 1; Peter Theobald wrote: > Mark, your code doesn't work. Error: 'Can't call method 'SetTopWindow' on an > undefined value line 15' > I would very much like to see what you did to get my code working. Please post a > fixed version. > -Peter > > At 08:45 PM 8/14/2006, Mark Dootson wrote: > >> Hi Peter, >> >> Code below works. >> I'm afraid I don't know enough about Perl and Wx internals to explain >> why your original doesn't work which is probably unsatisfactory - but at >> least it means you have some working code! Its all in the way Wx::App is >> instantiated, I think. >> >> I also removed the variables declared as 'our' from the Test_ui package >> as I'm sure they are not what you want. (but this was not cause of problem) >> >> Regards >> >> Mark >> >> #!/usr/bin/perl -w -- >> my $app = DemoApp->new(); >> $app->MainLoop(); >> >> package DemoApp;; >> use strict; >> use Wx qw[:everything]; >> use base qw (Wx::App); >> >> sub OnInit { >> Wx::InitAllImageHandlers(); >> my $ui = Test_ui->new(); >> $app->SetTopWindow($ui); >> $ui->Show(1); >> } >> >> >> package Test_ui; >> use Wx qw[:everything :allclasses]; >> use Wx::Event qw(EVT_LEFT_UP); >> use base qw(Wx::Frame); >> >> sub new { >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; >> $parent = undef unless defined $parent; >> $id = -1 unless defined $id; >> $title = "" unless defined $title; >> $pos = wxDefaultPosition unless defined $pos; >> $size = wxDefaultSize unless defined $size; >> $name = "" unless defined $name; >> $style = wxDEFAULT_FRAME_STYLE unless defined $style; >> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, >> $style, $name ); >> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL); >> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1, >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian", >> wxDefaultPosition, wxDefaultSize, >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP); >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2); >> >> $self->SetAutoLayout(1); >> $self->SetSizer($main_sizer); >> $self->Layout(); >> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up); >> >> $self->{__wordlist} = ['Apples','Bananas','Cherries','Durian']; >> >> $self->{ISFRAME} = 1; >> >> return $self; >> } >> >> sub handle_keywords_left_up { >> my ($control, $event) =@_; >> my $self = $control->GetParent(); >> my $ip = $self->{keywords_text}->GetInsertionPoint(); >> my ($col,$row)=$self->{keywords_text}->PositionToXY($ip); >> my @keywords = @{ $self->{__wordlist} }; >> >> print("editing keyword #$row\n"); >> return unless $keywords[$row]; >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]", >> "Edit keyword $keywords[$row]", $keywords[$row], $self, >> 0, 0); >> if ($newtext) { >> $keywords[$row]=$newtext; >> my $keyword_text=''; >> my $i=1; >> foreach my $k ( @keywords) { >> $keyword_text .= "$i.\t$k\n"; >> $i++; >> } >> $self->{keywords_text}->SetValue( $keyword_text); >> } >> >> $event->Skip(1); >> } >> >> 1; >> >> >> >> Peter Theobald wrote: >> > I have a TextCtrl with keywords in it. When the user clicks on a keyword I pop >> > up a modal dialog to edit the keyword........ > > > -------------------- > Peter Theobald > Turtle Cove Technology, Inc. > PO Box 28, Greenlawn NY 11740-0028 > (631) 261-4507 > |
From: Peter T. <pe...@Pe...> - 2006-08-15 15:10:48
|
<html> <body> <font size=3>At 04:27 AM 8/15/2006, Mark Dootson wrote:<br> <blockquote type=cite class=cite cite="">> I'm afraid I don't know enough about Perl and Wx internals</font></blockquote><br> I don't know where you copied this piece of text, but I never wrote it.<br><br> <blockquote type=cite class=cite cite=""><font size=3>or much else it would seem. I'm sure I ran this successfully !!!</font></blockquote><br> No need to be insulting. Your code doesn't work. You defined a variable $app in the main scope. You try to use it in the DemoApp scope, where it can't be seen.<br><br> <blockquote type=cite class=cite cite=""><font size=3>Anyhow, $self->ReleaseMouse(); in your original code at the appropriate<br> place does the trick. (as below_</font></blockquote><br> This certainly DOES fix the problem! Thank you very much.<br> It's an odd fix, because the docs state that:<br> '<font size=3>you must release the mouse [with ReleaseMouse()] as many times as you capture it [with CaptureMouse()]</font>'<br> Since I never explicitly called CaptureMouse I shouldn't have to explicitly call ReleaseMouse. But regardless, it WORKS and that's all that matters!<br> -Peter<br><br> <br> <blockquote type=cite class=cite cite=""><font size=3>#!/usr/bin/perl -w --<br> use strict;<br> use Wx qw[:everything];<br><br> package main;<br><br> unless(caller){<br> local *Wx::App::OnInit = sub{1};<br> my $app = Wx::App->new();<br> Wx::InitAllImageHandlers();<br><br> my $ui = Test_ui->new();<br><br> $app->SetTopWindow($ui);<br> $ui->Show(1);<br> $app->MainLoop();<br> }<br><br> package Test_ui;<br><br> use Wx qw[:everything :allclasses];<br> use Wx::Event qw(EVT_LEFT_UP);<br><br> our $mainframe;<br> our @keywords=();<br><br> use base qw(Wx::Frame);<br> sub new {<br> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;<br> $parent = undef unless defined $parent;<br> $id = -1 unless defined $id;<br> $title = "" unless defined $title;<br> $pos = wxDefaultPosition unless defined $pos;<br> $size = wxDefaultSize unless defined $size;<br> $name = "" unless defined $name;<br> $style = wxDEFAULT_FRAME_STYLE unless defined $style;<br><br> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size,<br> $style,<br> $name );<br> $mainframe=$self;<br><br> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL);<br><br> $self->{keywords_text} = Wx::TextCtrl->new($self, -1,<br> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian",<br> wxDefaultPosition, wxDefaultSize,<br> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP);<br> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2);<br><br> $self->SetAutoLayout(1);<br> $self->SetSizer($main_sizer);<br> $self->Layout();<br><br> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up);<br><br> $keywords[0]="Apples";<br> $keywords[1]="Bananas";<br> $keywords[2]="Cherries";<br> $keywords[3]="Durian";<br><br> return $self;<br> }<br><br> sub handle_keywords_left_up {<br> my ($self, $event) =@_;<br> my $ip=$self->GetInsertionPoint();<br> my ($col,$row)=$self->PositionToXY($ip);<br> $self->ReleaseMouse();<br> print("editing keyword #$row\n");<br> return unless $keywords[$row];<br> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]",<br> "Edit keyword $keywords[$row]", $keywords[$row],<br> $mainframe, 0, 0);<br> if ($newtext) {<br> $keywords[$row]=$newtext;<br> my $keyword_text='';<br> my $i=1;<br> foreach my $k ( @keywords) {<br> $keyword_text .= "$i.\t$k\n";<br> $i++;<br> }<br> $mainframe->{keywords_text}->SetValue( $keyword_text);<br> }<br><br> #$event->Skip(1);<br> }<br><br> 1;<br><br> <br> Peter Theobald wrote:<br> > Mark, your code doesn't work. Error: 'Can't call method 'SetTopWindow' on an <br> > undefined value line 15'<br> > I would very much like to see what you did to get my code working. Please post a <br> > fixed version.<br> > -Peter<br> > <br> > At 08:45 PM 8/14/2006, Mark Dootson wrote:<br> > <br> >> Hi Peter,<br> >><br> >> Code below works.<br> >> I'm afraid I don't know enough about Perl and Wx internals to explain<br> >> why your original doesn't work which is probably unsatisfactory - but at<br> >> least it means you have some working code! Its all in the way Wx::App is<br> >> instantiated, I think.<br> >><br> >> I also removed the variables declared as 'our' from the Test_ui package<br> >> as I'm sure they are not what you want. (but this was not cause of problem)<br> >><br> >> Regards<br> >><br> >> Mark<br> >><br> >> #!/usr/bin/perl -w --<br> >> my $app = DemoApp->new();<br> >> $app->MainLoop();<br> >><br> >> package DemoApp;;<br> >> use strict;<br> >> use Wx qw[:everything];<br> >> use base qw (Wx::App);<br> >><br> >> sub OnInit {<br> >> Wx::InitAllImageHandlers();<br> >> my $ui = Test_ui->new();<br> >> $app->SetTopWindow($ui);<br> >> $ui->Show(1);<br> >> }<br> >><br> >><br> >> package Test_ui;<br> >> use Wx qw[:everything :allclasses];<br> >> use Wx::Event qw(EVT_LEFT_UP);<br> >> use base qw(Wx::Frame);<br> >><br> >> sub new {<br> >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;<br> >> $parent = undef unless defined $parent;<br> >> $id = -1 unless defined $id;<br> >> $title = "" unless defined $title;<br> >> $pos = wxDefaultPosition unless defined $pos;<br> >> $size = wxDefaultSize unless defined $size;<br> >> $name = "" unless defined $name;<br> >> $style = wxDEFAULT_FRAME_STYLE unless defined $style;<br> >><br> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size,<br> >> $style, $name );<br> >><br> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL);<br> >><br> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1,<br> >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian",<br> >> wxDefaultPosition, wxDefaultSize,<br> >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP);<br> >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2);<br> >><br> >> $self->SetAutoLayout(1);<br> >> $self->SetSizer($main_sizer);<br> >> $self->Layout();<br> >><br> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up);<br> >><br> >> $self->{__wordlist} = ['Apples','Bananas','Cherries','Durian'];<br> >><br> >> $self->{ISFRAME} = 1;<br> >><br> >> return $self;<br> >> }<br> >><br> >> sub handle_keywords_left_up {<br> >> my ($control, $event) =@_;<br> >> my $self = $control->GetParent();<br> >> my $ip = $self->{keywords_text}->GetInsertionPoint();<br> >> my ($col,$row)=$self->{keywords_text}->PositionToXY($ip);<br> >> my @keywords = @{ $self->{__wordlist} };<br> >><br> >> print("editing keyword #$row\n");<br> >> return unless $keywords[$row];<br> >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]",<br> >> "Edit keyword $keywords[$row]", $keywords[$row], $self,<br> >> 0, 0);<br> >> if ($newtext) {<br> >> $keywords[$row]=$newtext;<br> >> my $keyword_text='';<br> >> my $i=1;<br> >> foreach my $k ( @keywords) {<br> >> $keyword_text .= "$i.\t$k\n";<br> >> $i++;<br> >> }<br> >> $self->{keywords_text}->SetValue( $keyword_text);<br> >> }<br> >><br> >> $event->Skip(1);<br> >> }<br> >><br> >> 1;<br> >><br> >><br> >><br> >> Peter Theobald wrote:<br> >> > I have a TextCtrl with keywords in it. When the user clicks on a keyword I pop<br> >> > up a modal dialog to edit the keyword........<br> > <br> > <br> > --------------------<br> > Peter Theobald<br> > Turtle Cove Technology, Inc.<br> > PO Box 28, Greenlawn NY 11740-0028<br> > (631) 261-4507<br> > </blockquote> <x-sigsep><p></x-sigsep> __--=Peter Theobald=--__<br> <a href="http://www.petertheobald.com/" eudora="autourl">www.PeterTheobald.com<br> </a></font></body> </html> |
From: Mark D. <mar...@zn...> - 2006-08-15 18:13:28
|
It was a quote from my own mail. It was an apology for posting none working code of my own. Peter Theobald wrote: > At 04:27 AM 8/15/2006, Mark Dootson wrote: >> > I'm afraid I don't know enough about Perl and Wx internals > > I don't know where you copied this piece of text, but I never wrote it. > >> or much else it would seem. I'm sure I ran this successfully !!! > > No need to be insulting. Your code doesn't work. You defined a variable $app in > the main scope. You try to use it in the DemoApp scope, where it can't be seen. > >> Anyhow, $self->ReleaseMouse(); in your original code at the appropriate >> place does the trick. (as below_ > > This certainly DOES fix the problem! Thank you very much. > It's an odd fix, because the docs state that: > 'you must release the mouse [with ReleaseMouse()] as many times as you capture > it [with CaptureMouse()]' > Since I never explicitly called CaptureMouse I shouldn't have to explicitly call > ReleaseMouse. But regardless, it WORKS and that's all that matters! > -Peter > > >> #!/usr/bin/perl -w -- >> use strict; >> use Wx qw[:everything]; >> >> package main; >> >> unless(caller){ >> local *Wx::App::OnInit = sub{1}; >> my $app = Wx::App->new(); >> Wx::InitAllImageHandlers(); >> >> my $ui = Test_ui->new(); >> >> $app->SetTopWindow($ui); >> $ui->Show(1); >> $app->MainLoop(); >> } >> >> package Test_ui; >> >> use Wx qw[:everything :allclasses]; >> use Wx::Event qw(EVT_LEFT_UP); >> >> our $mainframe; >> our @keywords=(); >> >> use base qw(Wx::Frame); >> sub new { >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; >> $parent = undef unless defined $parent; >> $id = -1 unless defined $id; >> $title = "" unless defined $title; >> $pos = wxDefaultPosition unless defined $pos; >> $size = wxDefaultSize unless defined $size; >> $name = "" unless defined $name; >> $style = wxDEFAULT_FRAME_STYLE unless defined $style; >> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, >> $style, >> $name ); >> $mainframe=$self; >> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL); >> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1, >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian", >> wxDefaultPosition, wxDefaultSize, >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP); >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2); >> >> $self->SetAutoLayout(1); >> $self->SetSizer($main_sizer); >> $self->Layout(); >> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up); >> >> $keywords[0]="Apples"; >> $keywords[1]="Bananas"; >> $keywords[2]="Cherries"; >> $keywords[3]="Durian"; >> >> return $self; >> } >> >> sub handle_keywords_left_up { >> my ($self, $event) =@_; >> my $ip=$self->GetInsertionPoint(); >> my ($col,$row)=$self->PositionToXY($ip); >> $self->ReleaseMouse(); >> print("editing keyword #$row\n"); >> return unless $keywords[$row]; >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]", >> "Edit keyword $keywords[$row]", $keywords[$row], >> $mainframe, 0, 0); >> if ($newtext) { >> $keywords[$row]=$newtext; >> my $keyword_text=''; >> my $i=1; >> foreach my $k ( @keywords) { >> $keyword_text .= "$i.\t$k\n"; >> $i++; >> } >> $mainframe->{keywords_text}->SetValue( $keyword_text); >> } >> >> #$event->Skip(1); >> } >> >> 1; >> >> >> Peter Theobald wrote: >> > Mark, your code doesn't work. Error: 'Can't call method 'SetTopWindow' on an >> > undefined value line 15' >> > I would very much like to see what you did to get my code working. Please >> post a >> > fixed version. >> > -Peter >> > >> > At 08:45 PM 8/14/2006, Mark Dootson wrote: >> > >> >> Hi Peter, >> >> >> >> Code below works. >> >> I'm afraid I don't know enough about Perl and Wx internals to explain >> >> why your original doesn't work which is probably unsatisfactory - but at >> >> least it means you have some working code! Its all in the way Wx::App is >> >> instantiated, I think. >> >> >> >> I also removed the variables declared as 'our' from the Test_ui package >> >> as I'm sure they are not what you want. (but this was not cause of problem) >> >> >> >> Regards >> >> >> >> Mark >> >> >> >> #!/usr/bin/perl -w -- >> >> my $app = DemoApp->new(); >> >> $app->MainLoop(); >> >> >> >> package DemoApp;; >> >> use strict; >> >> use Wx qw[:everything]; >> >> use base qw (Wx::App); >> >> >> >> sub OnInit { >> >> Wx::InitAllImageHandlers(); >> >> my $ui = Test_ui->new(); >> >> $app->SetTopWindow($ui); >> >> $ui->Show(1); >> >> } >> >> >> >> >> >> package Test_ui; >> >> use Wx qw[:everything :allclasses]; >> >> use Wx::Event qw(EVT_LEFT_UP); >> >> use base qw(Wx::Frame); >> >> >> >> sub new { >> >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; >> >> $parent = undef unless defined $parent; >> >> $id = -1 unless defined $id; >> >> $title = "" unless defined $title; >> >> $pos = wxDefaultPosition unless defined $pos; >> >> $size = wxDefaultSize unless defined $size; >> >> $name = "" unless defined $name; >> >> $style = wxDEFAULT_FRAME_STYLE unless defined $style; >> >> >> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, >> >> $style, $name ); >> >> >> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL); >> >> >> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1, >> >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian", >> >> wxDefaultPosition, wxDefaultSize, >> >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP); >> >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2); >> >> >> >> $self->SetAutoLayout(1); >> >> $self->SetSizer($main_sizer); >> >> $self->Layout(); >> >> >> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up); >> >> >> >> $self->{__wordlist} = ['Apples','Bananas','Cherries','Durian']; >> >> >> >> $self->{ISFRAME} = 1; >> >> >> >> return $self; >> >> } >> >> >> >> sub handle_keywords_left_up { >> >> my ($control, $event) =@_; >> >> my $self = $control->GetParent(); >> >> my $ip = $self->{keywords_text}->GetInsertionPoint(); >> >> my ($col,$row)=$self->{keywords_text}->PositionToXY($ip); >> >> my @keywords = @{ $self->{__wordlist} }; >> >> >> >> print("editing keyword #$row\n"); >> >> return unless $keywords[$row]; >> >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]", >> >> "Edit keyword $keywords[$row]", $keywords[$row], $self, >> >> 0, 0); >> >> if ($newtext) { >> >> $keywords[$row]=$newtext; >> >> my $keyword_text=''; >> >> my $i=1; >> >> foreach my $k ( @keywords) { >> >> $keyword_text .= "$i.\t$k\n"; >> >> $i++; >> >> } >> >> $self->{keywords_text}->SetValue( $keyword_text); >> >> } >> >> >> >> $event->Skip(1); >> >> } >> >> >> >> 1; >> >> >> >> >> >> >> >> Peter Theobald wrote: >> >> > I have a TextCtrl with keywords in it. When the user clicks on a keyword >> I pop >> >> > up a modal dialog to edit the keyword........ >> > >> > >> > -------------------- >> > Peter Theobald >> > Turtle Cove Technology, Inc. >> > PO Box 28, Greenlawn NY 11740-0028 >> > (631) 261-4507 >> > > > __--=Peter Theobald=--__ > www.PeterTheobald.com > <http://www.petertheobald.com/> > |
From: Peter T. <pe...@Pe...> - 2006-08-15 19:06:39
|
<html> <body> <font size=3>At 02:13 PM 8/15/2006, Mark Dootson wrote:<br> <blockquote type=cite class=cite cite="">It was a quote from my own mail. It was an apology for posting none<br> working code of my own.</font></blockquote><br> Geez! Here I thought you were being kind of rude when, in fact, you were being extremely humble! Well, thank you again for ReleaseMouse() which has fixed my problem.<br> -Peter<br><br> <br> <blockquote type=cite class=cite cite=""><font size=3>Peter Theobald wrote:<br> > At 04:27 AM 8/15/2006, Mark Dootson wrote:<br> >> > I'm afraid I don't know enough about Perl and Wx internals<br> > <br> > I don't know where you copied this piece of text, but I never wrote it.<br> > <br> >> or much else it would seem. I'm sure I ran this successfully !!!<br> > <br> > No need to be insulting. Your code doesn't work. You defined a variable $app in <br> > the main scope. You try to use it in the DemoApp scope, where it can't be seen.<br> > <br> >> Anyhow, $self->ReleaseMouse(); in your original code at the appropriate<br> >> place does the trick. (as below_<br> > <br> > This certainly DOES fix the problem! Thank you very much.<br> > It's an odd fix, because the docs state that:<br> > 'you must release the mouse [with ReleaseMouse()] as many times as you capture <br> > it [with CaptureMouse()]'<br> > Since I never explicitly called CaptureMouse I shouldn't have to explicitly call <br> > ReleaseMouse. But regardless, it WORKS and that's all that matters!<br> > -Peter<br> > <br> > <br> >> #!/usr/bin/perl -w --<br> >> use strict;<br> >> use Wx qw[:everything];<br> >><br> >> package main;<br> >><br> >> unless(caller){<br> >> local *Wx::App::OnInit = sub{1};<br> >> my $app = Wx::App->new();<br> >> Wx::InitAllImageHandlers();<br> >><br> >> my $ui = Test_ui->new();<br> >><br> >> $app->SetTopWindow($ui);<br> >> $ui->Show(1);<br> >> $app->MainLoop();<br> >> }<br> >><br> >> package Test_ui;<br> >><br> >> use Wx qw[:everything :allclasses];<br> >> use Wx::Event qw(EVT_LEFT_UP);<br> >><br> >> our $mainframe;<br> >> our @keywords=();<br> >><br> >> use base qw(Wx::Frame);<br> >> sub new {<br> >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;<br> >> $parent = undef unless defined $parent;<br> >> $id = -1 unless defined $id;<br> >> $title = "" unless defined $title;<br> >> $pos = wxDefaultPosition unless defined $pos;<br> >> $size = wxDefaultSize unless defined $size;<br> >> $name = "" unless defined $name;<br> >> $style = wxDEFAULT_FRAME_STYLE unless defined $style;<br> >><br> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size,<br> >> $style,<br> >> $name );<br> >> $mainframe=$self;<br> >><br> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL);<br> >><br> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1,<br> >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian",<br> >> wxDefaultPosition, wxDefaultSize,<br> >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP);<br> >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2);<br> >><br> >> $self->SetAutoLayout(1);<br> >> $self->SetSizer($main_sizer);<br> >> $self->Layout();<br> >><br> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up);<br> >><br> >> $keywords[0]="Apples";<br> >> $keywords[1]="Bananas";<br> >> $keywords[2]="Cherries";<br> >> $keywords[3]="Durian";<br> >><br> >> return $self;<br> >> }<br> >><br> >> sub handle_keywords_left_up {<br> >> my ($self, $event) =@_;<br> >> my $ip=$self->GetInsertionPoint();<br> >> my ($col,$row)=$self->PositionToXY($ip);<br> >> $self->ReleaseMouse();<br> >> print("editing keyword #$row\n");<br> >> return unless $keywords[$row];<br> >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]",<br> >> "Edit keyword $keywords[$row]", $keywords[$row],<br> >> $mainframe, 0, 0);<br> >> if ($newtext) {<br> >> $keywords[$row]=$newtext;<br> >> my $keyword_text='';<br> >> my $i=1;<br> >> foreach my $k ( @keywords) {<br> >> $keyword_text .= "$i.\t$k\n";<br> >> $i++;<br> >> }<br> >> $mainframe->{keywords_text}->SetValue( $keyword_text);<br> >> }<br> >><br> >> #$event->Skip(1);<br> >> }<br> >><br> >> 1;<br> >><br> >><br> >> Peter Theobald wrote:<br> >> > Mark, your code doesn't work. Error: 'Can't call method 'SetTopWindow' on an<br> >> > undefined value line 15'<br> >> > I would very much like to see what you did to get my code working. Please <br> >> post a<br> >> > fixed version.<br> >> > -Peter<br> >> ><br> >> > At 08:45 PM 8/14/2006, Mark Dootson wrote:<br> >> ><br> >> >> Hi Peter,<br> >> >><br> >> >> Code below works.<br> >> >> I'm afraid I don't know enough about Perl and Wx internals to explain<br> >> >> why your original doesn't work which is probably unsatisfactory - but at<br> >> >> least it means you have some working code! Its all in the way Wx::App is<br> >> >> instantiated, I think.<br> >> >><br> >> >> I also removed the variables declared as 'our' from the Test_ui package<br> >> >> as I'm sure they are not what you want. (but this was not cause of problem)<br> >> >><br> >> >> Regards<br> >> >><br> >> >> Mark<br> >> >><br> >> >> #!/usr/bin/perl -w --<br> >> >> my $app = DemoApp->new();<br> >> >> $app->MainLoop();<br> >> >><br> >> >> package DemoApp;;<br> >> >> use strict;<br> >> >> use Wx qw[:everything];<br> >> >> use base qw (Wx::App);<br> >> >><br> >> >> sub OnInit {<br> >> >> Wx::InitAllImageHandlers();<br> >> >> my $ui = Test_ui->new();<br> >> >> $app->SetTopWindow($ui);<br> >> >> $ui->Show(1);<br> >> >> }<br> >> >><br> >> >><br> >> >> package Test_ui;<br> >> >> use Wx qw[:everything :allclasses];<br> >> >> use Wx::Event qw(EVT_LEFT_UP);<br> >> >> use base qw(Wx::Frame);<br> >> >><br> >> >> sub new {<br> >> >> my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;<br> >> >> $parent = undef unless defined $parent;<br> >> >> $id = -1 unless defined $id;<br> >> >> $title = "" unless defined $title;<br> >> >> $pos = wxDefaultPosition unless defined $pos;<br> >> >> $size = wxDefaultSize unless defined $size;<br> >> >> $name = "" unless defined $name;<br> >> >> $style = wxDEFAULT_FRAME_STYLE unless defined $style;<br> >> >><br> >> >> $self = $self->SUPER::new( $parent, $id, $title, $pos, $size,<br> >> >> $style, $name );<br> >> >><br> >> >> my $main_sizer=Wx::BoxSizer->new(wxVERTICAL);<br> >> >><br> >> >> $self->{keywords_text} = Wx::TextCtrl->new($self, -1,<br> >> >> "1. Apples\n2. Bananas\n3. Cherries\n4. Durian",<br> >> >> wxDefaultPosition, wxDefaultSize,<br> >> >> wxTE_READONLY|wxTE_MULTILINE|wxTE_DONTWRAP);<br> >> >> $main_sizer->Add( $self->{keywords_text}, 1, wxEXPAND|wxALL, 2);<br> >> >><br> >> >> $self->SetAutoLayout(1);<br> >> >> $self->SetSizer($main_sizer);<br> >> >> $self->Layout();<br> >> >><br> >> >> EVT_LEFT_UP( $self->{keywords_text}, \&handle_keywords_left_up);<br> >> >><br> >> >> $self->{__wordlist} = ['Apples','Bananas','Cherries','Durian'];<br> >> >><br> >> >> $self->{ISFRAME} = 1;<br> >> >><br> >> >> return $self;<br> >> >> }<br> >> >><br> >> >> sub handle_keywords_left_up {<br> >> >> my ($control, $event) =@_;<br> >> >> my $self = $control->GetParent();<br> >> >> my $ip = $self->{keywords_text}->GetInsertionPoint();<br> >> >> my ($col,$row)=$self->{keywords_text}->PositionToXY($ip);<br> >> >> my @keywords = @{ $self->{__wordlist} };<br> >> >><br> >> >> print("editing keyword #$row\n");<br> >> >> return unless $keywords[$row];<br> >> >> my $newtext=Wx::GetTextFromUser( "Edit keyword $keywords[$row]",<br> >> >> "Edit keyword $keywords[$row]", $keywords[$row], $self,<br> >> >> 0, 0);<br> >> >> if ($newtext) {<br> >> >> $keywords[$row]=$newtext;<br> >> >> my $keyword_text='';<br> >> >> my $i=1;<br> >> >> foreach my $k ( @keywords) {<br> >> >> $keyword_text .= "$i.\t$k\n";<br> >> >> $i++;<br> >> >> }<br> >> >> $self->{keywords_text}->SetValue( $keyword_text);<br> >> >> }<br> >> >><br> >> >> $event->Skip(1);<br> >> >> }<br> >> >><br> >> >> 1;<br> >> >><br> >> >><br> >> >><br> >> >> Peter Theobald wrote:<br> >> >> > I have a TextCtrl with keywords in it. When the user clicks on a keyword <br> >> I pop<br> >> >> > up a modal dialog to edit the keyword........<br> >> ><br> >> ><br> >> > --------------------<br> >> > Peter Theobald<br> >> > Turtle Cove Technology, Inc.<br> >> > PO Box 28, Greenlawn NY 11740-0028<br> >> > (631) 261-4507<br> >> > <br> > <br> > __--=Peter Theobald=--__<br> > <a href="http://www.petertheobald.com/" eudora="autourl">www.PeterTheobald.com</a><br> > <<a href="http://www.petertheobald.com/" eudora="autourl">http://www.petertheobald.com/</a>><br> > </blockquote> <x-sigsep><p></x-sigsep> __--=Peter Theobald=--__<br> <a href="http://www.petertheobald.com/" eudora="autourl">www.PeterTheobald.com<br> </a></font></body> </html> |