[rt.cpan.org #99607] Issue using wxTextEntryBox

"Mark Dootson via RT" <[email protected]>
Newsgroups gmane.comp.lang.perl.wxperl
Message-ID <[email protected]>
Mon Oct 27 15:05:08 2014: Request 99607 was acted upon.
Transaction: Correspondence added by MDOOTSON
       Queue: Wx
     Subject: Issue using wxTextEntryBox
   Broken in: (no value)
    Severity: (no value)
       Owner: Nobody
  Requestors: [email protected]
      Status: open
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=99607 >


Hi,

Your issue with Wx::TextEntryBox arises from the basic way wxWidgets handles applications and windows.

The basic rule is that the main application loop will exit when no more instances of Wx::TopLevelWindow ( e.g. Wx::Frame and Wx::Dialog ) exist in the application.

Top level windows (Frames and Dialogs) must be explicitly destroyed.

$dialog_>Destroy;

unless your code causes them to be destroyed by some other method (such as being a child of another TopLevelWindow when it is destroyed or the automatic behaviour when you close the window using system menus / buttons).

In your example, none of these things happens so the application loop never exits. Your Wx::TextEntryDialog has no parent so continues to exist after you close your Frame.

Dialogs designed for modal usage, such as Wx::TextEntryDialog, need to have a valid parent to work properly, or be created as  a special case without a parent.

When you create the dialog and pass in the Wx::Panel as the parent the following things happen.

Dialogs need top level parents so the wxWidgets code determines the parent of Wx::Panel - your frame - and checks if that is a valid parent. It isn't - a parent top level window needs to be visible on the display to be a valid parent for a dialog. So the dialog is created without a parent. When you close the $frame, the TextEntryDialog is left hanging around so the main application loop never exits.

In this situation, wxWidgets will use anything you have set as the top window (wxTheApp->SetTopWindow) but your example does not do this.

In standard usage you would always do:

my $dialog = Wx::textEntryDialog->new(....);
my $result = $dialog->ShowModal;
# .. get stuff from dialog
$dialog->Destroy;

so your particular issue would not arise.

With regard to the different in implementation between Wx:TextEntryDialog and Wx::SingleChoiceDialog, it is indeed because of the use of client data. The wxPerl implementation allows you to pass a reference to an array of anything (so maybe references to objects) so a C++ class is required to maintain the correct reference counts on the Perl SVs for the array ref.

Hope it helps

Mark
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.