Subject Re: key or Onkey event
From Mervyn Bick <invalid@invalid.invalid>
Date Sun, 24 Sep 2023 12:43:53 +0200
Newsgroups dbase.getting-started

On 2023/09/23 22:16, Mustansir Ghor wrote:
> Dear Heinz
>
> I am Entering a Value in Combobox and wish to force Action with Tab Key.  But when I press Enter Key It triggers Change event first so the condition for key event to look for Tab key only does not work.
>

It used to be common practice to use a combobox's onChange event handler
to execute code depending on the selection made.  This has its problems
as the event fires every time the user uses the arrow keys to move
through the dropdown list.  Eventually dBASE added the onChangeCommitted
event to address this.

It's not a problem if the user only uses the mouse to make a selection
in the combobox dropdown list but a combobox's onChange event fires
every time a new value is highlighted in the dropdown list.  In other
words, if the user uses the up and down arrows to move through the list,
the onChange event fires each time a new value is highlighted.  If the
user presses Enter then the onChangeCommitted event fires.  This has
made the programmer's life much simpler.

The combobox's key and onKey events do not fire when the up and down
arrows are used. Except when the list contains only single character
entries, when any other key is pressed (including the Backspace nChar =
8, Tab nChar = 9  and Enter nChar = 13) the key event fires followed by
the onKey event.

The key event fires before a character is passed on the dBASE.  It is,
therefore, possible to use the key event handler to "swallow" keystrokes
that one doesn't want the combobox to see.  To disable the Backspace key

    function COMBOBOX1_key(nChar, nPosition,bShift,bControl)
       local lRet
       if nChar = 8 //Backspace
         lRet = false
       else
         lRet = true
       endif
       return lRet

Although it is normal to use either the onChange or the
onChangeCommitted event handler to implement the user's selection in the
combobox you don't have to use either of these two events at all.  You
could just as easily use the onKey event handler instead.

   function COMBOBOX1_onKey(nChar, nPosition,bShift,bControl)
      if nChar = 9 //Tab
        if this.value = 'Some'
           //Appropriate code
        elseif this.value = 'Thing'
           //Appropriate code
        elseif this.value = 'Else'
           //Appropriate code
        endif
      endif
      return

Mervyn.