I had modified/developed some code for up/down/enter keys. Kindly try this.
Code: Select all
/*
CSBox ( Combined Search Box ) try
*/
#include "minigui.ch"
PROC Main()
set navigation extended
aCountries := HB_ATOKENS( MEMOREAD( "Countries.lst" ), CRLF )
ASORT( aCountries ) // This Array MUST be sorted
DEFINE WINDOW frmCSBTest ;
AT 0,0 ;
WIDTH 550 ;
HEIGHT 300 ;
TITLE 'CSBox ( Combined Search Box ) Test' ;
MAIN ;
ON INIT MakeCSBs()
ON KEY ESCAPE ACTION frmCSBTest.Release
@ 55, 190 TEXTBOX txbMessy
END WINDOW // frmCSBTest
frmCSBTest.Center
frmCSBTest.Activate
RETU // Main()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
PROC MakeCSBs() // Making CSBox(s)
DefnCSBox( ThisWindow.Name, 'Country',; // Names suffix
'Country Name :',; // Prompt
25,; // CSBox Box Row No
100,; // CSBox Box Col No
200,; // Text Box Width
20,; // Text Box Height
aCountries )
frmCSBTest.TxBCountry.SetFocus()
RETU // MakeCSBs()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
PROC DefnCSBox( ; // Define a CSBox
cFrmName,; // Form / Window Name
cCSBName,; // CSBox Name
cLblValu,; // Prompt
nCSBRow,; // CSBox Row No
nCSBCol,; // CSBox Col No
nTxBWidth,; // Text Box Width
nTxBHeight,; // Text Box Height
aArray ) // Search array
Public cLblName := "Lbl" + cCSBName,;
cTxBName := "TxB" + cCSBName,;
cLsBName := "LsB" + cCSBName,;
nLblWidt := 0,;
nTxBCol := 0,;
nLsBRow := 0
DEFINE LABEL &cLblName
PARENT &cFrmName
ROW nCSBRow
COL nCSBCol
HEIGHT nTxBHeight
VALUE cLblValu
RIGHTALIGN .T.
AUTOSIZE .T.
END LABEL // &lblName
nLblWidt := GetProperty( cFrmName, cLblName, "WIDTH" )
nTxBCol := nCSBCol + nLblWidt + 5
DEFINE TEXTBOX &cTxBName
PARENT &cFrmName
ROW nCSBRow - 2
COL nTxBCol
WIDTH nTxBWidth
HEIGHT nTxBHeight
ongotfocus CSBoxGotFocus()
onenter CloseCsBox()
onlostfocus CSBoxLostFocus()
ONCHANGE SetCSBoxVal( cFrmName, this.name , aArray )
END TEXTBOX // &cTxBName
nLsBRow := GetProperty( cFrmName, cTxBName, "ROW" ) + nTxBHeight - 1
DEFINE LISTBOX &cLsBName
PARENT &cFrmName
COL nTxBCol
ROW nLsBRow
WIDTH nTxBWidth
HEIGHT 200
ITEMS {}
END LISTBOX
SetProperty( cFrmName, cLsBName, "VISIBLE", .F. )
RETU // DefnCSBox()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
PROC SetCSBoxVal( ; // Setting CSBox values
cFrmName,; // Form / Windows name
cTxBName,; // Text Box Name
aList ) // Items list
LOCAL cCurval := GetProperty( cFrmName, cTxBName, "Value" ),;
nFrmHeig := GetProperty( cFrmName, "HEIGHT" ),;
aResults := {},;
n1Result := 0,;
cLsBName := "LsB" + SUBSTR( cTxBName, 4 ),;
c1Found := '',;
cMethod := '',;
lNoResult := .F.
IF !EMPTY( cCurval )
WHILE ( n1Result := ASCAN( aList, { | c1 | UPPER( LEFT( c1, LEN( cCurval ) ) ) == UPPER( cCurval )}, n1Result + 1 ) ) > 0 ;
.AND. n1Result < LEN( aList )
AADD( aResults, aList[ n1Result ] )
ENDDO
IF !EMPTY( aResults )
nLsBRow := GetProperty( cFrmName, cLsBName, "ROW" )
nLsBCol := GetProperty( cFrmName, cLsBName, "COL" )
nLsBLeng := GetProperty( cFrmName, cLsBName, "WIDTH" )
nLsBHeig := MAX( MIN( LEN( aResults ) * 15, nFrmHeig - nLsBRow - 40 ), 20 )
DoMethod( cFrmName, cLsBName, "Release" )
for i := 1 to len(_hmg_sysdata[1])
if ((_hmg_sysdata[18,i] > nLsBRow .and. _hmg_sysdata[18,i] < nLsBRow + nLsBHeig) .or. (_hmg_sysdata[18,i]+_hmg_sysdata[21,i] > nLsBRow .and. _hmg_sysdata[18,i]+_hmg_sysdata[21,i] < nLsBRow + nLsBHeig)) .and. ((_hmg_sysdata[19,i] > nLsBCol .and. _hmg_sysdata[19,i] < nLsBCol + nLsBLeng) .or. (_hmg_sysdata[19,i]+_hmg_sysdata[20,i] > nLsBCol .and. _hmg_sysdata[19,i]+_hmg_sysdata[20,i] < nLsBCol + nLsBLeng)) .and. _hmg_sysdata[4,i] == GetFormHandle(CFrmName)
setproperty(cFrmName,_hmg_sysdata[2,i],"VISIBLE",.f.)
endif
next i
DEFINE LISTBOX &cLsBName
PARENT &cFrmName
ROW nLsBRow
COL nLsBCol
WIDTH nLsBLeng
HEIGHT nLsBHeig
ITEMS aResults
VALUE 1
ONDBLCLICK {||SetProperty( cFrmName, cTxBName, "VALUE", this.item( this.value ) ),;
SetProperty( cFrmName, cLsBName, "VISIBLE", .F. ),;
CSBoxSearchOver()}
END LISTBOX
SetProperty( cFrmName, cLsBName, "VISIBLE", .T. )
ELSE
lNoResult := .T.
ENDIF !EMPTY( aResults )
ELSE
lNoResult := .T.
ENDIF !EMPTY( cCurval )
IF lNoResult
SetProperty( cFrmName, cLsBName, "VISIBLE", .F. )
ENDIF
RETU // SetCSBoxVal()
function CSBoxSearchOver()
Local nLsBRow := this.row
Local nLsBCol := this.col
Local nLsBLeng := this.width
Local nLsBHeig := this.height
Local cFrmname := thiswindow.name
for i := 1 to len(_hmg_sysdata[1])
if ((_hmg_sysdata[18,i] > nLsBRow .and. _hmg_sysdata[18,i] < nLsBRow + nLsBHeig) .or. (_hmg_sysdata[18,i]+_hmg_sysdata[21,i] > nLsBRow .and. _hmg_sysdata[18,i]+_hmg_sysdata[21,i] < nLsBRow + nLsBHeig)) .and. ((_hmg_sysdata[19,i] > nLsBCol .and. _hmg_sysdata[19,i] < nLsBCol + nLsBLeng) .or. (_hmg_sysdata[19,i]+_hmg_sysdata[20,i] > nLsBCol .and. _hmg_sysdata[19,i]+_hmg_sysdata[20,i] < nLsBCol + nLsBLeng)) .and. _hmg_sysdata[4,i] == GetFormHandle(CFrmName)
setproperty(cFrmName,_hmg_sysdata[2,i],"VISIBLE",.t.)
endif
next i
return nil
function CSBoxGotFocus
local cFrmName := thiswindow.name
on key UP of &cFrmName action CSBoxDoUpKey()
on key DOWN of &cFrmName action CSBoxDoDownKey()
return nil
function CSBoxDoUpKey
local cFrmName := thiswindow.name
if iscontroldefined(&cLsBName,&cFrmName)
if getproperty(cFrmName,cLsBName,"VALUE") > 1
setproperty(cFrmName,cLsBName,"VALUE",getproperty(cFrmName,cLsBName,"VALUE")-1)
endif
endif
return nil
function CSBoxDoDownKey
local cFrmName := thiswindow.name
if iscontroldefined(&cLsBName,&cFrmName)
if getproperty(cFrmName,cLsBName,"VALUE") < getproperty(cFrmName,cLsBName,"ITEMCOUNT")
setproperty(cFrmName,cLsBName,"VALUE",getproperty(cFrmName,cLsBName,"VALUE")+1)
endif
endif
return nil
function CloseCsBox
local cFrmName := thiswindow.name
Local nLsBRow := 0
Local nLsBCol := 0
Local nLsBLeng := 0
Local nLsBHeig := 0
if iscontroldefined(&cLsBName,&cFrmName)
nLsBRow := getproperty(cFrmName,cLsBName,"ROW")
nLsBCol := getproperty(cFrmName,cLsBName,"COL")
nLsBHeig := getproperty(cFrmName,cLsBName,"HEIGHT")
nLsBLeng := getproperty(cFrmName,cLsBName,"WIDTH")
if getproperty(cFrmName,cLsBName,"VALUE") > 0
SetProperty(cFrmName,cTxBName, "VALUE", getproperty(cFrmName,cLsBName,"ITEM",getproperty(cFrmName,cLsBName,"VALUE")) )
SetProperty(cFrmName,cLsBName, "VISIBLE", .F. )
endif
for i := 1 to len(_hmg_sysdata[1])
if ((_hmg_sysdata[18,i] > nLsBRow .and. _hmg_sysdata[18,i] < nLsBRow + nLsBHeig) .or. (_hmg_sysdata[18,i]+_hmg_sysdata[21,i] > nLsBRow .and. _hmg_sysdata[18,i]+_hmg_sysdata[21,i] < nLsBRow + nLsBHeig)) .and. ((_hmg_sysdata[19,i] > nLsBCol .and. _hmg_sysdata[19,i] < nLsBCol + nLsBLeng) .or. (_hmg_sysdata[19,i]+_hmg_sysdata[20,i] > nLsBCol .and. _hmg_sysdata[19,i]+_hmg_sysdata[20,i] < nLsBCol + nLsBLeng)) .and. _hmg_sysdata[4,i] == GetFormHandle(cFrmName)
Setproperty(cFrmName,_hmg_sysdata[2,i],"VISIBLE",.t.)
endif
next i
endif
return nil
function CSBoxLostFocus
local cFrmName := thiswindow.name
release key UP of &cFrmName
release key DOWN of &cFrmName
CloseCsBox()
return nil
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.