WX::Dialog won't close

I have an interesting problem. I have a dialog which refuses to go away
once it has finished it’s associated code.

Here is the code:

class DBPopulateDialog < Wx::Dialog
def initialize(parent, id, title, pos, size, style, name)
super(parent, id, title, pos, size, style, name)

  sizer = Wx::BoxSizer.new(Wx::VERTICAL)

  @server = Wx::TextCtrl.new(self, -1, "Server", 

Wx::DEFAULT_POSITION,
Wx::DEFAULT_SIZE)
@username = Wx::TextCtrl.new(self, -1, “Username”,
Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE)
@password = Wx::TextCtrl.new(self, -1, “Password”,
Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE, Wx::TE_PASSWORD)
@tree_base = Wx::TextCtrl.new(self, -1, “LDAP Tree Base”,
Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE)

  sizer.add(@server, 1, Wx::EXPAND|Wx::ALL, 5)
  sizer.add(@username, 1, Wx::EXPAND|Wx::ALL, 5)
  sizer.add(@password, 1, Wx::EXPAND|Wx::ALL, 5)
  sizer.add(@tree_base, 1, Wx::EXPAND|Wx::ALL, 5)

  button_sizer = create_button_sizer(Wx::OK|Wx::CANCEL)

  sizer.add(button_sizer, 0, Wx::EXPAND|Wx::ALL, 5)

  # Okay Button Event!!!!

  evt_button(self.get_affirmative_id()) { |event| on_okay() }

  set_sizer(sizer)
  show()
end # initialize

# Collect computer records from Directory and add to database

def on_okay()
  ldap = Net::LDAP.new :host => @server.get_value, :port => 389, 

:auth
=> { :method => :simple, :username => @username.get_value, :password =>
@password.get_value }

  filter = Net::LDAP::Filter.eq("objectcategory",

“CN=Computer,CN=Schema,CN=Configuration,#{@tree_base.get_value}”)

  # We don't want to return a result set as it could be pretty huge 

and
we don’t need it.
# We are treating the container name as the group name here.

  ldap.search(:base => @tree_base.get_value, :filter => filter,

:return_result => false) do |record|
computer_name = record.cn.to_s
begin
os = record.operatingsystem
rescue
os = ‘’
end
lab = record.dn.split(’,’)[1].split(’=’)[1]

    # Check db for lab and add it if it isn't already there

    unless Lab.find :name => lab
      lab = Lab.new(:name => lab)
      lab.save
      lab = lab.name
    end

    # Save machine record

    machine = Computer.new(:name => computer_name, :os => os, 

:location
=> lab)
machine.save
end
log_file = File.open(“log.txt”, “a”); log_file.puts “\n\nFinished
populate next instruction is close\n\n”; log_file.close
self.close()
end # on_okay
end # DBPopulateDialog class

After filling out the proper information and clicking on okay the data
is
populated however when it finishes the dialog hangs around. Furthermore
it
won’t close when you click on Cancel or the Window close widget (the X
in my
case). The log line executes just fine, the dialog just refuses to
close.

-Glen


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

Glen H. wrote:

I have an interesting problem. I have a dialog which refuses to go
away once it has finished it’s associated code.

Here is the code:

After filling out the proper information and clicking on okay the data
is populated however when it finishes the dialog hangs around.
Furthermore it won’t close when you click on Cancel or the Window
close widget (the X in my case). The log line executes just fine, the
dialog just refuses to close.

I haven’t tried out your code, but maybe you need to call end_modal, if
you’re calling show_modal to start the dialog?

alex

If it is modal I’m not intending it to be but I’ll check.

On Thu, Oct 2, 2008 at 2:42 PM, Alex F. [email protected] wrote:

populated however when it finishes the dialog hangs around. Furthermore it
[email protected]
http://rubyforge.org/mailman/listinfo/wxruby-users


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

On Thu, Oct 2, 2008 at 2:45 PM, Glen H. [email protected]
wrote:

Here is the code:
you’re calling show_modal to start the dialog?

“Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

Well end_modal doesn’t do anything either. Oddly before clicking on the
“okay” button the “cancel” button works, however after the on_okay event
is
processed the “cancel” button does nothing.


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

On Fri, Oct 3, 2008 at 11:39 AM, Glen H. [email protected]
wrote:

once it has finished it’s associated code.

“okay” button the “cancel” button works, however after the on_okay event is
processed the “cancel” button does nothing.


“Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

It would appear that the only instruction that doesn’t run at the end of
on_okay is close, exit works fine. This kind of blows, I suppose I’ll
have
to start another instance of the app and exit after the populate
finishes,
not the cleanest solution.


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

Hi Glen

Glen H. wrote:

It would appear that the only instruction that doesn’t run at the end
of on_okay is close, exit works fine. This kind of blows, I suppose
I’ll have to start another instance of the app and exit after the
populate finishes, not the cleanest solution.

I’m sure you won’t need to do this.

Generally, if you want help, please reduce the code to a standalone,
runnable, and ideally short sample. I’m very happy to help, but it’s too
much to expect people to install extra libraries and second-guess what
the rest of your app is doing.

I did try running your code, pruned of the LDAP stuff. It seems fine to
me - there’s nothing in the dialog layout itself. I would suggest
checking that the dialog has an explicit parent, not nil - it is better
in most cases that the dialog is linked to a parent frame. In the
special case that an application consists only of a single dialog, you
must use Dialog#destroy to end the app, close is not sufficient.

If this doesn’t help, I would look further into net/ldap and see whether
this is causing it to hang - ie, if ok does nothing but ‘close’ does it
work fine?

cheers
alex

On Fri, Oct 10, 2008 at 3:48 AM, Alex F. [email protected] wrote:

I’m sure you won’t need to do this.
application consists only of a single dialog, you must use Dialog#destroy to


wxruby-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/wxruby-users

Hey Alex,

Thanks for the reply, destroy did the trick. I don’t know why I didn’t
try
that before, according to my browser I’d looked at the method definition
in
the API docs. Odd that close doesn’t work, I’m creating this dialog the
same way I do all my others and close works for them.


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

On Fri, Oct 10, 2008 at 2:54 PM, Glen H. [email protected]
wrote:

the dialog has an explicit parent, not nil - it is better in most cases that
alex
Thanks for the reply, destroy did the trick. I don’t know why I didn’t try
that before, according to my browser I’d looked at the method definition in
the API docs. Odd that close doesn’t work, I’m creating this dialog the
same way I do all my others and close works for them.


“Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

I have another dialog behaving the same way now. My application has one
frame and from that frame I’m passing self as the parent argument for
the
Dialog Windows. I do this for other dialogs created by button events
and it
works okay. The dialogs that are unresponsive after pressing okay are
created through menu events should I be doing something differently when
creating a dialog from a menu option?

I will try to pair my code down and post a small working example but it
will
take a while. If anyone has any ideas off the top of their head I’m all
ears. Dialog#destroy does work so I can always do that.


“Hey brother Christian with your high and mighty errand, Your actions
speak
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

Another Idea for you Glen,

Instead of using Close, and Destroy to get rid of the dialog, if it’s a
Dialog that is used quite often, I would opt to use show_modal, and
end_modal, and after end_modal is called, just call hide, instead of
destroy.

An Example of this:

class MyDialog < Wx::Dialog
def initialize(*args)
super
ok = Wx::Button.new(self,Wx::ID_OK,"&Ok")
cancel = Wx::Button.new(self,Wx::ID_CANCEL,"&Cancel")
# … Add your own controls …
evt_button(Wx::ID_OK) do
# … do whatever processing you need …
end_modal(Wx::ID_OK)
end
evt_button(Wx::ID_CANCEL) do
# … Ask any, “Are you sure you want to cancel” here …
# Or don’t even put this handler in, as it’s automatically
handled by
Wx::Dialog
end
end
end

class MyFrame < Wx::Frame
def initialize(*args)
super
# We create our dialog that we are going to use a lot, and show only
# when needed.
@dlg = MyDialog.new(self,-1,“Information Report”)
# … add the rest of the stuff …
evt_button(ID_SHOW_DIALOG) do
@dlg.show_modal do |response|
# … process response …
end
@dlg.hide
end
end
end

This is just a bare bone example, that will not work, least you actually
put
it together. But it gives you an idea of how to use it, especially when
you
re-use a dialog multiple times.

Hope this helps,

Mario S.