Page 1 of 1

Button without focus

Posted: Thu Apr 22, 2010 7:37 pm
by souza.fo
I need to create a button that appears the number in the Edit / Combo active (focus) and the focus remains on the Edit / As. For example button "1", When I click on this button will display the number 1 in the Edit / Combo active (Just like when using the keyboard Windows Mobile).

thanks,

Fabio Souza

Re: Button without focus

Posted: Sun Apr 25, 2010 8:31 am
by Antonio Linares
Fabio,

You can give the focus to any control doing:

oControl:SetFocus()

i.e.:

oGet:SetFocus()

Re: Button without focus

Posted: Fri Apr 30, 2010 7:54 pm
by Jeff Barnes
Hi Fabio,

This might also help. I had to have a larger input screen for numbers in my application.
The code below allows the user to click a number then the focus automatically switches to the next get.

Code: Select all

Function SixBorg(nRecordNum)
   LOCAL nBorg1:=0, nBorg2:=0, oBORG, oSayBorg, cBorgTitle, aBorgItems:={}, oCbx
   LOCAL cBorg1:="", cBorg2:="", oGet1, oGet2, nGetFocus
   Define Dialog oBORG from 5,2 to 20,26 Title "Enter BORG" STYLE nStyle
      @ 0.5,2  say oSayBorg PROMPT "Dyspnea" of oBorg COLOR RGB(0,0,0),RGB(255,255,255) SIZE 25,10
      @ 0.5,9  say oSayBorg PROMPT "Fatigue" of oBorg COLOR RGB(0,0,0),RGB(255,255,255)   SIZE 25,10
      @ 1.5,2 Get oGet1 var nBORG1 of oBORG SIZE 20,10 PICTURE "99.9" UPDATE VALID (nGetFocus :=1,.t.)
      @ 1.5,7 Get oGet2 var nBORG2 of oBORG SIZE 20,10 PICTURE "99.9" UPDATE VALID (nGetFocus :=2,.t.)
        
        @ 3,1   BUTTON oBtn PROMPT "0"   SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=0,oGet2:Setfocus()),(nBorg2:=0,oGet1:SetFocus())),oBorg:Update() )
        @ 3,5   BUTTON oBtn PROMPT "0.5" SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=0.5,oGet2:Setfocus()),(nBorg2:=0.5,oGet1:SetFocus())),oBorg:Update() )
        @ 3,9   BUTTON oBtn PROMPT "1"   SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=1,oGet2:Setfocus()),(nBorg2:=1,oGet1:SetFocus())),oBorg:Update() )
        @ 3,13  BUTTON oBtn PROMPT "2"   SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=2,oGet2:Setfocus()),(nBorg2:=2,oGet1:SetFocus())),oBorg:Update() )

        @ 3.9,1  BUTTON oBtn PROMPT "3"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=3,oGet2:Setfocus()),(nBorg2:=3,oGet1:SetFocus())),oBorg:Update() )
        @ 3.9,5  BUTTON oBtn PROMPT "4"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=4,oGet2:Setfocus()),(nBorg2:=4,oGet1:SetFocus())),oBorg:Update() )
        @ 3.9,9  BUTTON oBtn PROMPT "5"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=5,oGet2:Setfocus()),(nBorg2:=5,oGet1:SetFocus())),oBorg:Update() )
        @ 3.9,13 BUTTON oBtn PROMPT "6"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=6,oGet2:Setfocus()),(nBorg2:=6,oGet1:SetFocus())),oBorg:Update() )

        @ 4.9,1  BUTTON oBtn PROMPT "7"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=7,oGet2:Setfocus()),(nBorg2:=7,oGet1:SetFocus())),oBorg:Update() )
        @ 4.9,5  BUTTON oBtn PROMPT "8"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=8,oGet2:Setfocus()),(nBorg2:=8,oGet1:SetFocus())),oBorg:Update() )
        @ 4.9,9  BUTTON oBtn PROMPT "9"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=9,oGet2:Setfocus()),(nBorg2:=9,oGet1:SetFocus())),oBorg:Update() )
        @ 4.9,13 BUTTON oBtn PROMPT "10"  SIZE 15,15 Action ( iif(nGetFocus=1,(nBorg1:=10,oGet2:Setfocus()),(nBorg2:=10,oGet1:SetFocus())),oBorg:Update() )

      @ 2,6   BUTTON oBtnBorgOK PROMPT "OK" SIZE 25,15 of oBORG ACTION (UpdateSixBORG(nRecordNum, nBorg1, nBorg2),oBORG:End())
      oBORG:Center()
   Activate Dialog oBORG NOMODAL
Return Nil
 

Re: Button without focus

Posted: Mon May 10, 2010 4:24 pm
by souza.fo
After searching the forum I found two solutions The first is using a fake __keyboard and the other is manipulating the data with a function. See below:

First Solution with a "fake" __keyboard():

Code: Select all

STATIC oFocusGet

(...)

@ 14,02 Say "Prod:" OF oWndProdutos SIZE 15,7.5 PIXEL
@ 13,17 GET oGetProduto VAR cProduto OF oWndProdutos PICT "@!" SIZE 38,10 PIXEL
oGetProduto:bGotFocus  := {|| oFocusGet := oGetProduto }

(...)

@ 36.5,01 BUTTON oBtn1 PROMPT "1" OF oWndProdutos SIZE 13,11 ACTION ( oFocusGet:SetFocus(), SetStateKey(49, .T.), SetStateKey(49, .F.) )
@ 36.5,16 BUTTON oBtn2 PROMPT "2" OF oWndProdutos SIZE 13,11 ACTION ( oFocusGet:SetFocus(), SetStateKey(49, .T.), SetStateKey(49, .F.) )
@ 36.5,31 BUTTON oBtn2 PROMPT "3" OF oWndProdutos SIZE 13,11 ACTION ( oFocusGet:SetFocus(), SetStateKey(51, .T.), SetStateKey(49, .F.) )

(...)

@ 49,91  BUTTON oBtnBack PROMPT "<-" OF oWndProdutos SIZE 13,11 ACTION ( oGetProduto:SetFocus(), SetStateKey(8, .T.), SetStateKey(8, .F.) )

*************************
#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>
#include <aygshell.h>

HB_FUNC( SETSTATEKEY )
{
  if( hb_parl(2) )
      keybd_event( hb_parvnl(1), 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
  else
      keybd_event( hb_parvnl(1), 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}

#pragma ENDDUMP
 

The Second Solution using a Function:

Code: Select all

STATIC oFocusGet

(...)

@ 14,02 Say "Prod:" OF oWndProdutos SIZE 15,7.5 PIXEL
@ 13,17 GET oGetProduto VAR cProduto OF oWndProdutos PICT "@!" SIZE 38,10 PIXEL
oGetProduto:bGotFocus  := {|| oFocusGet := oGetProduto }

(...)

@ 36.5,01 BUTTON oBtn1 PROMPT "1" OF oWndProdutos SIZE 13,11 ACTION DigVal("1") 
@ 36.5,16 BUTTON oBtn2 PROMPT "2" OF oWndProdutos SIZE 13,11 ACTION DigVal("2")
@ 36.5,31 BUTTON oBtn2 PROMPT "3" OF oWndProdutos SIZE 13,11 ACTION DigVal("3")

(...)

@ 49,91  BUTTON oBtnBack PROMPT "<-" OF oWndProdutos SIZE 13,11 ACTION DigVal("<") 


STATIC FUNCTION DigVal(cValor)
LOCAL cBuffer 

 cBuffer := Alltrim(oGetFocus:cText())

 If cValor == "<"  //Delete
    cBuffer := Alltrim(Substr(cBuffer, 1, oFocusGet:nPos -2) + Substr(cBuffer, oFocusGet:nPos))
 Else
   cBuffer += cValor
 Endif

 oGetFocus:cText(cBuffer)
 oGetFocus:SetFocus()

RETURN .T.
 


Best Regards,

Fabio Souza