12 de enero de 2005

Usando AutoCompletar en Textboxs de VFP 9

En Visual FoxPro 9 contamos con algunas nuevas propiedades en los textboxs, en este articulo tratare de explicar el Uso del Autocompletar

Básicamente se compone de 3 propiedades

AutoCompSource: Nos Permite especificar el nombre con el que se buscara los posibles datos de referencia, util si queremos utilizar la misma lista en uno o mas textboxs, por default el dato usado es el nombre del textbox, pero podemos especificarle el propio usando esta propiedad.

AutoCompTable: Indica el nombre de la tabla en la cual se almacenaran los datos que sean introducidos en el textbox, por default la tabla que se usa para almacenar estos valores es: Autocomp.DBF almacenada en el directorio de datos del usuario actual (home(7)) pero podemos indicarle por medio de esta propiedad en que ruta y archivo queremos que se almacene.

AutoComplete: Nos permite indicar los diferentes comportamientos del autocompletar en el textbox, los posibles valores son:
  • 0 - Deshabilitado: No activa el autocompletar
  • 1 - Alfabético: Ordena los elementos Alfabéticamente
  • 2 - Mas Frecuentemente usado (MFU): Ordena las opciones basándose en la cantidad usada de cada opcion y luego la ordena por la opcion mas recientemente actualizada
  • 3 - Mas usada Recientemente: Ordena las opciones basadas en el campo "Updated" de la tabla usada para autocompletar, el cual es actualizado cada vez que se selecciona una opción.
  • 4 - Personalizado: usa el Campo "Weight" de la tabla utilizada para autocompletar, el desarrollador es responsable de actualizar el campo con su propio algoritmo para especificar el ordenamiento, las opciones con el valor mas alto en el campo "Weight" son mostradas primero.
A continuacion un ejemplo (copie y pegue en un archivo PRG y ejecute):
PUBLIC oFrm
oFrm=NEWOBJECT("frm_autocompletar")
oFrm.SHOW
RETURN
DEFINE CLASS frm_autocompletar AS FORM
  AUTOSIZE = .T.
  HEIGHT = 236
  WIDTH = 447
  DOCREATE = .T.
  CAPTION = "Usando Autocompletar"
  MAXBUTTON = .F.
  MINBUTTON = .F.
  NAME = "frm_autoCompletar"

  ADD OBJECT txt1 AS Txt WITH ;
    TOP = 30, ;
    AutoComplete = 1, ;
    AutoCompSource = "txtDemo"

  ADD OBJECT txt2 AS Txt WITH ;
    TOP = 80, ;
    AutoComplete = 2, ;
    AutoCompSource = "txtDemo"

  ADD OBJECT txt3 AS Txt WITH ;
    TOP = 133, ;
    AutoComplete = 3, ;
    AutoCompSource = "txtDemo"

  ADD OBJECT txt4 AS Txt WITH ;
    LEFT = 23, ;
    TOP = 192, ;
    WIDTH = 169, ;
    AutoComplete = 4

  ADD OBJECT txt5 AS Txt WITH ;
    LEFT = 203, ;
    TOP = 190, ;
    WIDTH = 169, ;
    AutoComplete = 4

  ADD OBJECT lbl4 AS Lbl WITH ;
    CAPTION = "Ordenamiento Por codigo (AutoComplete = 4)", ;
    TOP = 170

  ADD OBJECT lbl3 AS Lbl WITH ;
    CAPTION = "Ordenamiento Por ultima vez usado (AutoComplete = 3)", ;
    TOP = 114

  ADD OBJECT lbl2 AS Lbl WITH ;
    CAPTION = "Ordenamiento Por mas usado (AutoComplete = 2)", ;
    TOP = 61

  ADD OBJECT lbl1 AS Lbl WITH ;
    CAPTION = "Ordenamiento Alfabetico (AutoComplete = 1)", ;
    TOP = 10

  PROCEDURE txt4.VALID
    IF DODEFAULT()
      UPDATE (THIS.AutocompTable) SET weight = 1 WHERE ALLTRIM(UPPER(SOURCE)) = ;
        IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.AutocompSource)))
      UPDATE (THIS.AutocompTable) SET weight = 0 WHERE ALLTRIM(UPPER(DATA)) = ;
        ALLTRIM(UPPER(THIS.VALUE)) AND ALLTRIM(UPPER(SOURCE)) = ;
        IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.AutocompSource)))
      USE IN (THIS.AutocompTable)
    ENDIF
  ENDPROC

  PROCEDURE txt5.VALID
    IF DODEFAULT()
      UPDATE (THIS.AutocompTable) SET weight = 0 WHERE ALLTRIM(UPPER(SOURCE)) = ;
        IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.AutocompSource)))
      UPDATE (THIS.AutocompTable) SET weight = 1 WHERE ALLTRIM(UPPER(DATA)) = ;
        ALLTRIM(UPPER(THIS.VALUE)) AND ALLTRIM(UPPER(SOURCE)) = ;
        IIF(EMPTY(THIS.AutocompSource),ALLTRIM(UPPER(THIS.NAME)),ALLTRIM(UPPER(THIS.AutocompSource)))
      USE IN (THIS.AutocompTable)
    ENDIF
  ENDPROC
ENDDEFINE

DEFINE CLASS Lbl AS LABEL
  AUTOSIZE = .T.
  BACKSTYLE = 0
  LEFT = 24
ENDDEFINE

DEFINE CLASS Txt AS TEXTBOX
  HEIGHT = 25
  LEFT = 24
  WIDTH = 265
  AutocompTable = "AutoCompletar"
ENDDEFINE

Para ver el efecto en acción, pruebe a ingresar en el primer textbox, 3 nombres: Juan, Pedro y Jose, (asegúrese de presionar la tecla Enter luego de terminar de escribir el nombre) luego Escriba Pedro (o Seleccionelo de la lista cuando se lo sugiera) 2 veces, Luego Escriba Jose si va al segundo Textbox luego de esto, al dar click en el control, le mostrara como primer elemento Pedro, ya que es el que mas se ha utilizado (dos veces mas que los otros en este ejemplo) ya que el segundo textbox utiliza la opcion "2- Mas Frecuentemente usado", (no presione Enter borre el contenido del segundo textbox de preferencia), Luego dirijase al tercer textbox y al dar click en el control podrá observar que el primer elemento sera Jose, ya que este utiliza la opción "3- Mas usada recientemente".

Ahora si Se Fija en los otros 2 textbox (el cuarto y quinto) estos utilizan la opcion "4- Personalizado", así que tienen código en el evento Valid para ajustar el campo "Weight" (peso en ingles) para ajustar el orden, el 4 textbox coloca el ultimo valor escrito o seleccionado en la ultima posición mientras que el quinto textbox coloca el ultimo valor escrito o seleccionado al inicio.

Saludos

Jorge Mota
Guatemala

1 comentario :

  1. Jorge: Yo se que esta publicación es vieja pero VFP sigue vigente. Yo programo en VFP pero primero construyo las formas e inserto los textbox en las formas. Quiero hacer un autocompletar en un textbox, pero no encuentro la forma, veo lo que tu has escrito pero ¿Como traduzco todo eso a la forma ya creada? No se que poner en AutoCompSource o en AutoCompTable. He hecho cualquier cantidad de pruebas y nada parece dar el resultado que espero. Lo que quiero es que se complete del campo de la tabla que ya está indexada ¿Tienes algún ejemplo con alguna forma ya creada?

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.