[Fxruby-users] Re: FXRuby question - Getting the SEL_CHANGED event to work
Status: Inactive
Brought to you by:
lyle
From: Lyle J. <ly...@us...> - 2003-06-03 13:34:28
|
John Reed wrote: > I'm trying to test if a combo box field in FXRuby has changed, to warn > the user if they hit the Cancel button without saving their changes. > Here's the code: > > def cancelentry(sender, sel, ptr) > > @@stacbo.connect(SEL_CHANGED) do > if MBOX_CLICKED_NO == FXMessageBox.question(self, MBOX_YES_NO, > "Cancel Update", "Changes made, cancel update?") > handle(nil, MKUINT(ID_CANCEL, SEL_COMMAND), nil) > return 1 > end > end > > end > > The problem is that the code never displays the message box. What is > the proper way to code for a SEL_CHANGED event? The combo box sends a SEL_CHANGED message to its message target immediately after the change takes place. For what you're trying to accomplish, I think you just want to save the original state of the combo box when the dialog box is first initialized: def setup(originalValue) @originalValue = originalValue @stackbo = FXComboBox.new(...) @stackbo.setText(originalValue) end and then compare the combo box's current state to this value when they click Cancel: def cancelentry(sender, sel, ptr) if @stackbo.getText() != @originalValue if MBOX_CLICKED_NO == FXMessageBox.question(...) handle(nil, MKUINT(ID_CANCEL, SEL_COMMAND), nil) return 1 end end end You could, alternately, catch the SEL_CHANGED message and set some state variable: def setup(originalValue) @theValueChanged = false @stackbo = FXComboBox.new(...) @stackbo.connect(SEL_CHANGED) { @theValueChanged = true } end def cancelentry(sender, sel, ptr) if @theValueChanged if MBOX_CLICKED_NO == FXMessageBox.question(...) handle(nil, MKUINT(ID_CANCEL, SEL_COMMAND), nil) return 1 end end end The problem with this approach (IMO) is that if they change the combo box's value from its original value to some new value, then change it *back* again before clicking Cancel, it will still show up as a "change". So for this kind of situation I prefer to just clone the original data the dialog box or form was initialized with, and then compare it against the form's current values at the end to decide if it's really been changed. Hope this helps, Lyle |