>************************************************** >*-- Class: cbonotinlist >*-- ParentClass: combobox >*-- BaseClass: combobox >*-- allows selection of an item not in the combo's list to be used as its controlsource...only works if the combo's bound column is 1 >* >Define Class cbonotinlist As combobox > > *-- Used to save the control source of the combo before the control is unbound > ccontrolsource = "" > cOldExact = "" > uOldVal = "" > Name = "cbonotinlist" > > *-- Called from Valid...it updates the "bound" field > Procedure updatecontrolsource > Local lcAlias, lcControlSource > With This > If ! Empty( .ccontrolsource ) > lcAlias = Juststem( .ccontrolsource ) > If Upper( Alltrim( lcAlias ) ) = 'THISFORM' > lcControlSource = .ccontrolsource > Store .DisplayValue To &lcControlSource > Else > Replace ( .ccontrolsource ) With .DisplayValue In ( lcAlias ) > Endif > Endif > Endwith > Endproc > > *-- Updates display value from the field in the underlying table if this is a "bound" control > Procedure refreshdisplayvalue > Local lcControlSource > With This > If ! Empty( .ccontrolsource ) > lcControlSource = .ccontrolsource > .DisplayValue = &lcControlSource > Endif > Endwith > Endproc > > Procedure HandleKey > LOCAL lcSofar, lnSelStart, lnSelLength, lnRow > WITH This > *** Handle backspace key > IF LASTKEY() = 127 > .SelStart = .SelStart - 1 > ENDIF > *** Get the value typed in so far > lnSelStart = .SelStart > lcSofar = LEFT( .DisplayValue, lnSelStart ) > *** Find a match in column #1 of the combo's internal list > FOR lnRow = 1 TO .ListCount > IF UPPER( .List[ lnRow, 1 ] ) = UPPER( lcSoFar ) > .ListIndex = lnRow > EXIT > ENDIF > ENDFOR > *** Highlight the portion of the value after the insertion point > .SelStart = lnSelStart > lnSelLength = LEN( ALLTRIM( .DisplayValue ) ) - lnSelStart > IF lnSelLength > 0 > .SelLength = lnSelLength > ENDIF > ENDWITH > Endproc > > Procedure KeyPress > *** handle the key...IOW, find the closest match in the list > IF This.SelStart > 0 > IF ( LASTKEY() > 31 AND LASTKEY() < 128 ) OR ( LASTKEY() = 7 ) > This.HandleKey() > ENDIF > ENDIF > EndProc > > Procedure Init > If DoDefault() > With This > .ccontrolsource = .ControlSource > .ControlSource = '' > Endwith > Endif > Endproc > > Procedure Valid > This.updatecontrolsource() > Endproc > > Procedure Refresh > This.refreshdisplayvalue() > Endproc > > Procedure GotFocus > If Lower( This.Parent.BaseClass ) = 'column' > *** This is needed so it will work in a grid > ComboBox::GotFocus() > This.refreshdisplayvalue() > Nodefault > Else > This.uOldVal = .Value > combobox::GotFocus() > This.SelStart = 0 > This.SelLength = LEN( This.Text ) > .cOldExact = SET( 'EXACT' ) > SET EXACT OFF > NODEFAULT > Endif > Endproc >Enddefine >