Yo queria algo más sencillo y encontré ejemplos con combobox, pero ninguno combinaba mis 3 exigencias: busqueda incremental, abierto a nuevos valores, y con la lista desplegada y activa.
Combinando varios artículos y añadiendo nuevo código conseguí lo que deseaba.
Aquí os dejo el código.
********************************
PUBLIC oform1
oform1 = NEWOBJECT("form1")
oform1.SHOW
RETURN
DEFINE CLASS form1 AS FORM
TOP = 0
LEFT = 0
HEIGHT = 190
WIDTH = 480
DOCREATE = .T.
CAPTION = "Form1"
NAME = "Form1"
ADD OBJECT combo1 AS COMBOBOX WITH ;
COMMENT = "", ;
ROWSOURCETYPE = 2, ;
HEIGHT = 25, ;
INCREMENTALSEARCH = .T., ;
LEFT = 30, ;
SELECTONENTRY = .T., ;
TABINDEX = 2, ;
TOP = 28, ;
WIDTH = 350, ;
INPUTMASK = "", ;
NAME = "Combo1"
ADD OBJECT label4 AS LABEL WITH ;
AUTOSIZE = .T., ;
FONTBOLD = .T., ;
BACKSTYLE = 0, ;
CAPTION = "Uno de la lista o nuevo, desplegado", ;
HEIGHT = 17, ;
LEFT = 30, ;
TOP = 12, ;
WIDTH = 207, ;
TABINDEX = 4, ;
FORECOLOR = RGB(88,99,124), ;
NAME = "Label4"
ADD OBJECT command1 AS COMMANDBUTTON WITH ;
TOP = 12, ;
LEFT = 408, ;
HEIGHT = 36, ;
WIDTH = 49, ;
CAPTION = "Salir", ;
TABINDEX = 3, ;
NAME = "Command1"
PROCEDURE LOAD
CAPSLOCK(.F.) && simulo trabajar con minusculas
PUBLIC mf
mf = SYS(2015)
OPEN DATABASE (HOME(2) + "Northwind\Northwind.dbc")
SELECT 0
USE Customers
ENDPROC
PROCEDURE combo1.INIT
* Creo propiedad para almacenar configuracion CapsLock
IF PEMSTATUS(THIS,'lCaps',5) = .F.
WITH THIS
.ADDPROPERTY('lCaps',.F.)
ENDWITH
ENDIF
THIS.COMMENT = ''
ENDPROC
PROCEDURE combo1.KEYPRESS
LPARAMETERS nKeyCode, nShiftAltCtrl
IF BETWEEN(nKeyCode, 32, 122)
* Primero comprueba la lista
FOR X=1 TO THIS.LISTCOUNT
IF UPPER(SUBSTR(THIS.LIST(X), 1, THIS.SELSTART+1)) == ;
UPPER(SUBSTR(THIS.TEXT, 1, THIS.SELSTART)+CHR(nKeyCode))
NCURPOS = THIS.SELSTART + 1
THIS.VALUE = THIS.LIST(X)
THIS.SELSTART = NCURPOS
THIS.SELLENGTH = LEN(LTRIM(THIS.LIST(X))) - NCURPOS
THIS.COMMENT = SUBSTR(THIS.LIST(X),1,NCURPOS)
NODEFAULT
EXIT
ENDIF
NEXT X
* Si no está en la lista
IF X > THIS.LISTCOUNT
NCURPOS = LEN(THIS.COMMENT) + 1
THIS.COMMENT = THIS.COMMENT + CHR(nKeyCode)
THIS.DISPLAYVALUE = THIS.COMMENT
THIS.SELSTART = NCURPOS
NODEFAULT
ENDIF
ENDIF
* Si pulsamos Retroceso o flecha izda.
IF nKeyCode = 127 OR nKeyCode = 19
NCURPOS = LEN(THIS.COMMENT) -1
THIS.COMMENT = LEFT(THIS.COMMENT, NCURPOS)
THIS.DISPLAYVALUE = THIS.COMMENT
THIS.SELSTART = NCURPOS
NODEFAULT
ENDIF
IF nKeyCode = 13
THIS.LOSTFOCUS
ENDIF
ENDPROC
PROCEDURE combo1.LOSTFOCUS
THIS.ROWSOURCE = ''
USE IN SELECT('curcombo')
* Devolvemos config. inicial CapsLock
CAPSLOCK(THIS.lcaps)
* Tiempo busqueda incremental predeterminado
_INCSEEK = 0.5
*
* El dato introducido / seleccionado, se encuentra
* en la propiedad 'DisplayValue'.
*
ENDPROC
PROCEDURE combo1.GOTFOCUS
THIS.lcaps = CAPSLOCK()
IF CAPSLOCK() = .F.
CAPSLOCK(.T.) && Fuerzo a mayúsculas
ENDIF
_INCSEEK = 5.5 && Tiempo busqueda incremental al maximo
LOCAL cFile, cCampo
cFile='customers' && Tabla de la que tomar los datos
cCampo='upper(ltrim(companyname))' && campo a mostrar
SELECT &cCampo AS cDato FROM &cFile DISTINCT WHERE !EMPTY(&cCampo) ;
ORDER BY cDato INTO CURSOR curcombo nofilter
THIS.ROWSOURCE = 'curcombo' && Establecemos origen de datos
KEYBOARD '{ALT+DNARROW}' && Desplegamos lista
*
* Si le pasamos un valor previo (en la propiedad 'DisplayValue'),
* simulamos haberlo tecleado para que se situe en la lista.
*
IF !EMPTY(THIS.DISPLAYVALUE)
cTexto = THIS.DISPLAYVALUE
FOR yy = 1 TO LEN(cTexto)
cLetra = SUBSTR(cTexto, yy, 1)
KEYBOARD cLetra
ENDFOR
ENDIF
ENDPROC
PROCEDURE command1.CLICK
* El dato lo obtenemos de la propiedad 'DisplayValue'
IF !EMPTY(ALLTRIM(THISFORM.combo1.DISPLAYVALUE))
=MESSAGEBOX(THISFORM.combo1.DISPLAYVALUE)
ENDIF
USE IN SELECT('customers')
CLOSE ALL
RELEASE mf
THISFORM.RELEASE
ENDPROC
ENDDEFINE
*-- EndDefine: form1
**************************************************
Jose Antonio Blasco
Excetente Funciona de Pelicula, ya lo implementé para los combo box
ResponderBorrarHola y buenas tardes. Primero espero este foro siga en funcionamiento, pues estoy retomando la programación en VFP6, después de más de 18 años de no programar en este lenguaje.
ResponderBorrarEstas lineas las he puesto en el load de mi FORM1 y me dice que no puede llevar procedimientos. Debo entender que esta declaración es desde un programa aparte y debe hacerse la llamada antes de activar la FORM. De antemano Gracias por sus comentarios al foro, que de ya me han ayudado mucho.
Mi nombre es Noé y mi correo es noejdvl@gmail.com.
No me funciona de forma correcta. no me muestra lo que voy escribiendo
ResponderBorrarDefinitivamente no me funciono.. necesito es buscar y seleccionar y luego llevarme el codigo de ese eleento para guardarlo en una tabla
ResponderBorrarBUENO Y ESOS NOMBRE DE DONDE LOS SACA NO HAT BASES NILISTA
ResponderBorrarDe la table Customers de la base de datos (HOME(2) + "Northwind\Northwind.dbc") que viene en los ejemplos de VFP.
BorrarGracias, funciona perfecto
ResponderBorrarHola espero que todavía pueda darme una ayuda respecto a este combo con búsqueda incremental. Funciona perfecto, pero me surge una duda como puedo hacer para que la búsqueda incremental sea con coincidencia dentro del nombre y no como comienza el nombre????
ResponderBorrarEspero sea clara mi consulta.
Saludos!