Thank you Brian,

I've also tried to do something like that, but unfortunately I need to use threads and pass shared vars from a thread to another, and threads::shared is not very friendly with hashes of hashes which I need to use.

So finally I use shared scalars, array and hash refs which are local for each module and I access the objects from those modules using the whole path of classes like

$self->main_form->dialog1->method1(...);

Until now is OK, although I think it wouldn't be pretty nice if I would need to create a very complex program in perl...

Octavian

----- Original Message ----- From: "Brian Donorfio" <[EMAIL PROTECTED]>
To: "Octavian Rasnita" <[EMAIL PROTECTED]>
Cc: <wxperl-users@perl.org>
Sent: Thursday, August 21, 2008 4:16 PM
Subject: Re: getting the values from Wx::Dialog


On Sun, Aug 17, 2008 at 10:03 AM, Octavian Rasnita <[EMAIL PROTECTED]> wrote:
Hi,

I need to create a modal dialog window with a few fields and after closing
it, I need to return the values of those fields to the parent window.

Please tell me which is the recommended way to do that. I've tried a few
ways, but none of them looks clean.

If I need to do what I said, do I need to use global variables like

$main::var
or
$myapp->{var}


If it is possible, I would like to be able to not use them, because the
program would need too many and it will be hard to understand it after a
time.

I've tried something like:

package MyApp::Main;

use MyApp::Main::Dialog;
use base 'Wx::Frame';

sub new {
my ($class, $parent) = @_
my $self = $class->SUPER::new($parent, ...);

$self->{dialog} = MyApp::Main::Dialog->new($self);
$self->{dialog}->ShowModal();

# Here I want to access the values from the fields from the closed dialog
}

I have also tried to store the code that creates the dialog in MyApp::Main, but the event handler which is executed when pressing the "Ok" button of the dialog gets the $self which is the instance of the dialog, and not the Main
form, so I can't use it to store the variables I need.

I'm pretty confused.
Please tell me which do you think it is the cleanest way to do that.

Thank you.

Octavian



Hi Octavian,

I've always just used a hash reference to pass values back and forth.
There may be a more Wx-approved way of doing this, but references are
straightforward enough. I usually clean it up by moving a lot of the
code that deals with this out to other methods (usually a
fill_defaults() called from the constructor, and a validate_entries()
and save_entries() at the end), but you can organize it however you
want.

package MyApp::Main;
...
my %dialog_options = ( foo => 'bar' );
my $dialog = MyApp::Main::Dialog->new($self, \%dialog_options);
$dialog->ShowModal;
# $dialog_options{foo} now has inputted value

package MyApp::Main::Dialog;
sub new {
my ($class, $parent, $options_ref) = @_;
my $self = $class->SUPER::new(...);
$self->_create_widgets;
$self->{_options} = $options_ref;
$self->{FooWidget}->SetValue($self->{_options}->{foo});
}

sub ok_button_clicked {
my ($self) = @_;
$self->{_options}->{foo} = $self->{FooWidget}->GetValue;
$self->EndModal(wxID_OK);
}

-Brian

Reply via email to