Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Combobox input
Message
De
22/03/2016 18:58:16
 
 
À
22/03/2016 15:57:03
Information générale
Forum:
Visual FoxPro
Catégorie:
Gestionnaire d'écran & Écrans
Titre:
Versions des environnements
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Database:
Visual FoxPro
Application:
Desktop
Divers
Thread ID:
01633537
Message ID:
01633565
Vues:
65
>I want to use a combobox for two purposes. On is fro choosing an option from a file, and the other is, if the user's option isn't in the file, they can type the otion into the 'textbox' part of the combo, and I can take care of adding it to the file in the lostfocus event. Problem is that either the first record value sits in that box and it will not take input, or it acts as a search box, and if you type the first letter of one of the records in the file, it pops that value into the box. I have tried as many combinations of controlsource, rowsource and rowsourcetype as there are, and nothing works. Any ideas will me greatly appreciated! I have always just used a combobox as somethign to select from, but I am trying to avoid a separate 'add another option to the file' screen, if at all possible, but taking care of adding new options via the combobox.tofill
Hi,

This can be done with the autofill class, made by Mike Gagnon:
How to create a "auto-fill" style combobox AND allows to add value not found

&&Create a combobox class and add the following:


&&In the InterActive Event of the ComboBox:


LOCAL lnStyle, lnLastKey, lcDisplayValue
lnLastKey=lastkey()
lnStyle = this.style
IF this.style = 2
    this.style = 0
ENDI
IF (lnLastKey>=32 and lnLastKey<=126)
    IF this.selstart>=1
        lcDisplayValue=substr(this.displayvalue,1,this.selstart-1)+(chr(lnLastKey))
    ELSE
        lcDisplayValue=(chr(lnLastKey))+allt(this.displayvalue)
    ENDI
    IF empty(lcDisplayValue)
        lcDisplayValue=allt(chr(lnLastKey))
    ENDI
    FOR i = 1 to this.listcount
            If Upper(lcDisplayValue) == Upper(Substr(This.List(i),1,Len(lcDisplayValue)))
                This.DisplayValue=This.List(i)
                This.SelStart=Len(lcDisplayValue)
                nlLength=Len(Allt(This.DisplayValue))-Len(lcDisplayValue)
                This.SelLength=Iif(nlLength <0,0,nlLength)
                this.lastdisplayvalue = this.displayvalue
                this.lastselstart = this.selstart
                this.lastsellength = this.sellength
                RETURN
            ENDI
    ENDFOR
ENDIf


&&In the combobox requery:


&&this.Value = this.DisplayValue && Just to reset the display value


&&In the valid of the combobox:


If !Empty(This.DisplayValue)
    Local cTableName,cFieldName,nAnswer,cValue
    Store Juststem(This.RowSource) To cTableName &&Won't work for VFP5.0
    Store Justext(This.RowSource) To cFieldName && This is normally used for 3 character extension, but it works for any lenght. Won't work for VFP5.0
    Select (cTableName)
    Locate For &cFieldName = This.DisplayValue
    If !Found()
        nAnswer = Messagebox("This value was not found in the table,"+Chr(13)+"Do you want to save it in the table?",36,"")
        If nAnswer = 6
            Insert Into &cTableName (&cFieldName) Values (This.DisplayValue)
            If CursorGetProp("Buffering") > 1  && Check to see if we should use tableupdate
                Tableupdate(1,.T.,cTableName)
            ENDIF
        this.Requery() && To reset the display value
        Else
            Store '' To This.DisplayValue
        Endif
    Endif
ENDIF


&&Note: Properties to be created in the comboxbox class.

&&1. acstyle (Default value = 2)
&&2. lastdisplayvalue  (Default value = [none])
&&3. lastsellength (Default value = 0)
&&4. lastselstart (Default value = 0)
Rgds,

Koen
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform