Subject Re: pushbutton
From Mustansir Ghor <mustan31@hotmail.com>
Date Wed, 30 Nov 2022 03:22:37 -0500
Newsgroups dbase.getting-started

Dear Mervyn Sir

I was waiting for your reply before I post. Thank you anyway for the solution.

I wonder why it must not have corrected from dBase12 to dBase 2019

Best Regards
Mustansir


Mervyn Bick Wrote:

> On 2022/11/28 20:42, Mustansir Ghor wrote:
> > Dear All
> >
> > When Pushputton gets focus in dbase 2019, I need to press Enter button twice to execute the push button whereas same form if I run in dbase 11 plus the pushbutton executes with focus on it by pressing it only once.
> >
> > If anybody has any clue where I need to correct pls advice me.
>
> This is a bug that first appeared in dBASE 12 and has continued on into
> dBASE 2019.
>
> I have created a custom pushbutton (pb_one_press.cc) that uses the
> CALLBACK command to trap when the user presses the Enter key while the
> pushbutton has focus.  This immediately triggers the pushbutton's
> onClick event.
>
> Ken, you may want to consider this control for inclusion in the dUFLP.
>
> An example form and the custom control are attached.
>
> Mervyn.
>
> clear
> ** END HEADER -- do not remove this line
> //
> // Generated on 2022-11-30
> //
> parameter bModal
> local f
> f = new ghor_mbForm()
> if (bModal)
>    f.mdi = false // ensure not MDI
>    f.readModal()
> else
>    f.open()
> endif
>
> class ghor_mbForm of FORM
>    set procedure to pb_one_press.cc additive
>    with (this)
>       onOpen = class::FORM_ONOPEN
>       metric = 0        // Chars
>       height = 8.5455
>       left = -3.4286
>       top = 1.3182
>       width = 122.2857
>       text = ""
>    endwith
>
>    this.CBCUSTOMER = new COMBOBOX(this)
>    with (this.CBCUSTOMER)
>       height = 1.5
>       left = 6.0
>       top = 3.5
>       width = 39.0
>       fontSize = 14.0
>       dataSource = 'array {"MUSTANSIR","GHOR","DAR","TZ"}'
>       style = 1        // DropDown
>    endwith
>
>    this.EAMOUNT = new ENTRYFIELD(this)
>    with (this.EAMOUNT)
>       height = 1.5
>       left = 51.0
>       top = 3.5
>       width = 18.0
>       fontSize = 14.0
>       value = ""
>       validRequired = true
>    endwith
>
>    this.PBSAVE = new PB_ONE_PRESS(this)
>    with (this.PBSAVE)
>       onClick = class::PBSAVE_ONCLICK
>       height = 1.5
>       left = 77.0
>       top = 3.5
>       width = 14.0
>       text = "Display It"
>    endwith
>
>    this.TEXT1 = new TEXT(this)
>    with (this.TEXT1)
>       height = 1.0
>       left = 7.0
>       top = 6.0
>       width = 54.0
>       text = "Text1"
>    endwith
>
>
>    function PBSAVE_onClick()
>          form.text1.text=""
>          form.text1.text=form.cbcustomer.value+" has following balance "+form.eamount.value
>       return
>
>    function form_onOpen()
>          with(this)
>           height = 8.5
>      left = 20.0
>      top = 3.0
>      width = 120.0
>          endwith
>      return
>
>
> endclass
>
> class pb_one_press(parentObj) of pushbutton(parentObj) custom
>  
>    /*
>  
>    Filename:   pb_one_press.cc
>  
>    Date:       2022-11-30
>  
>    Author:     Mervyn Bick
>  
>    
>  
>    Description:
>  
>       Starting with dBASE 12 and continuing in dBASE 2019, if a user Tabs
>                 to a pushbutton control it takes two presses of the Enter key to trigger
>                 the pushbutton's onClick event.   If the user uses the mouse to click on
>                 the pushbutton the onClick event fires immediately.
>                 
>                 This custom pushbutton triggers the object's onClick event immediately
>                 if the user tabs to the control and then preses the Enter key.  
>                 
>                 The custom control works without a problem in dBASE 11 so there should
>                 be no adverse effects if this bug is ever fixed for dBASE 2019.
>
>       This custom control will only work with dBASE Plus 8 and later as the
>       CALLBACK feature in not avaiable in earlier versions of dBASE.
>
>    */
>  
>    with (this)
>       onOpen = CLASS::onOpen
>       onClose = CLASS::onClose
>    endwith
>  
>    function onOpen()
>       #include winuser.h
>       if type("GetWindowLongA") # "FP"
>          extern CLONG GetWindowLongA(CHANDLE, CINT) user32
>       endif
>       if type("SetWindowLongA") # "FP"
>          extern CLONG SetWindowLongA(CHANDLE, CINT, CLONG) user32
>       endif
>       if type("CallWindowProcA") # "FP"
>          extern CLONG CallWindowProcA(CPTR, CHANDLE, CUINT, CUINT, CUINT) user32
>       endif
>            if type("this.oldproc") = 'U'
>                         this.oldproc = GetWindowLongA(this.hwnd, GWL_WNDPROC)
>                         CALLBACK CLONG wndproc(CHANDLE, CUINT, CUINT, CUINT) OBJECT this
>                         this.newproc = GetCallAddress(class::wndproc)
>                         SetWindowLongA(this.hwnd, GWL_WNDPROC, this.newproc)
>                 endif                
>       return
>
>    function onClose
>       if type("this.oldproc") = "FP"
>          if this.oldproc <> null and not empty(this.oldproc)
>          // must restore original window procedure for pushbutton
>          SetWindowLongA(this.hwnd, GWL_WNDPROC, this.oldproc)      
>          RELEASE CALLBACK wndproc OBJECT this
>          endif            
>       endif
>       return
>
>    function wndproc(hwnd,umsg,wparam,lparam)
>                   if umsg = WM_CHAR  and wParam = VK_RETURN
>                      //Enter key pressed while object has focus
>                                 this.onClick()                
>             endif
>        return CallWindowProcA(this.oldproc, hwnd, uMsg, wParam, lParam)
>
endclass