>>Programmatic change watches the value in a control. It is fired when the
>value is changed from code, and interactive change is fired when the user
>changes the value. It cannot be used to watch the values of other
>properties
>
>Alright, thanks for the info. If that is true though and if I'm
>reading the question correctly and he is programatically changing
>the Enabled or Visible status, all he would have to do in
>addition to changing these properties would be to change a value
>in a control. This would in turn trigger the programatic change.
>I know . . . a lot of extra work when this can be handled much
>better with a timed event. Just curious if this could work.
Why not make an invisible control with its
controlsource=othercontrol.enabled, then watch its ProgrammaticChange
event? It just might work.
I've tried it, and it almost does ;(.
I've made a form with two command buttons and a checkbox;
command2.click just flips the command1.enabled, and the
check1.controlsource="thisform.command1.enabled". The
check1.programmaticchange never fired. Tried interactive,
it doesn't fire either. I wanted it to fire whenever I clicked
command2, but I also wanted its caption to be changed from
"Enabled" to "Disabled", so I put
this.caption=Iif(this.value, "Enabled","Disabled")
into check1.refresh and called thisform.refresh at the end of
command2.click - didn't work either. What's worse,
check1.refresh fires before the check1.value changes,
(though the command1.enabled has already changed, and
the button was greyed or blacked already) so I got the
wrong caption all the time.
I still believe that using timers to catch events which we
can't catch otherwise is just a workaround and includes
some risks (overhead, firing when some other, more
important event is active), so they need lot of care in
order to work fine.
Probably the best approach in this case is to add specialized
methods to the form which would swap the state of the desired
objects, and perform any other action necessary. So, instead of
Thisform.command1.enabled=.f., we'd better call
Thisform.command1driver("enable") to do that and all the other
stuff, and use only that to enable/disable command1.