FXRuby question - Getting the SEL_CHANGED event to work

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?

Thanks

John Reed

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

Thanks, Lyle. I took the 1st approach.

John Reed