>************************************************** >*-- Class: cboaliasqfill >*-- ParentClass: combobox >*-- Time Stamp: 08/07/07 05:08:13 PM >*-- Variation of quickfill combo that works on a specified alias >* >Define Class cboaliasqfill As combobox > > Height = 22 > SelectOnEntry = .T. > Style = 0 > Width = 120 > coldexact = "" > *-- Alias used as the RowSource for the combo > calias = "" > *-- Tag to use when trying to find a match for what was typed in so far > ctag = "" > *-- Name of field to search....Populated by combo in its SetCombo mathod > ckeyfield = "" > *-- When true, allows a new entry to be added > lallowaddnew = .F. > *-- XML Metadata for customizable properties > _MemberData = [<VFPData><memberdata name="lallowaddnew" type="property" display="lAllowAddNew"/></VFPData>] > Name = "cboaliasqfill" > > > Procedure handlekey > Lparameters tnKeyCode > Local lcSofar, lnSelStart, lnSelLength, lnSelect, lcFld > > With This > *** Handle backspace key > If tnKeyCode = 127 > If .SelStart = 0 > Return .F. > Endif > .SelStart = .SelStart - 1 > lnSelStart = .SelStart > lcSofar = Upper( Left( .DisplayValue, lnSelStart ) ) > Else > *** Get the value typed in so far > lnSelStart = .SelStart+1 > lcSofar = Upper( Left( .DisplayValue, .SelStart ) + Chr( tnKeyCode ) ) > Endif > *** See if we can find a match in the Alias used as the RowSource > lcFld = .calias + '.' + .ckeyfield > If !Empty( .ctag ) > If Seek( lcSofar, .calias, .ctag ) > .DisplayValue = Eval( lcFld ) > Else > If Not This.lallowaddnew > .ListIndex = 0 > lnSelStart = 0 > Else > Return .F. > Endif > Endif > Else > lnSelect = Select() > Select ( .calias ) > Locate For Upper( &lcFld ) = lcSofar > If Found() > .DisplayValue = Eval( lcFld ) > Else > If Not This.lallowaddnew > .ListIndex = 0 > lnSelStart = 0 > Else > Return .F. > Endif > Endif > Select ( lnSelect ) > Endif > *** 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 setcombo > With This > *** First of all, make sure that we have either a RowSourceType of 2 or 4 > If ! Inlist( .RowSourceType, 2, 6 ) > Assert .F. Message .Name + ': RowSourceType MUST be either 2 or 6' > Return .F. > Endif > *** Since RowSOurceType of 2-Alias can beused just like 6-Fields and > *** fields can be specified in the RowSource, let's just get the alias name > *** The following returns the alias name in both cases: > *** if alias.field,field,field is specified or if only an alias is specified > .calias = Juststem( .RowSource ) > *** Now check to see if the user specified fields > If Empty( Justext( .RowSource ) ) > *** Means no fields were specified...this better be a RowSourceType of 2-Alias > If .RowSourceType = 2 > .ckeyfield = Field( 1, .calias ) > Else > Assert .F. Message .Name + ': You MUST specify a field list when using a RowSourceType of 6' > Return .F. > Endif > Else > *** Parse out the first field > Local lcRest, lnCommaPos > lcRest = Justext( .RowSource ) > lnCommaPos = At( ',', lcRest ) > .ckeyfield = Iif( lnCommaPos = 0, lcRest, Left( lcRest, lnCommaPos - 1 ) ) > Endif > *** Set the cTag property > .ctag = Order( .calias ) > Endwith > Endproc > > > Procedure Init > If !This.setcombo() > Return .F. > Endif > Endproc > > > Procedure GotFocus > ComboBox::GotFocus() > With This > .uOldVal = This.Value > .coldexact = Set( 'EXACT' ) > .SelStart = 0 > .SelLength = Len( .Text ) > Endwith > Nodefault > Endproc > > > Procedure LostFocus > If This.coldexact = 'ON' > Set Exact On > Endif > Endproc > > > Procedure KeyPress > Lparameters nKeyCode, nShiftAltCtrl > *** handle the key...IOW, find the closest match in the list > If ( nKeyCode > 31 And nKeyCode < 128 ) Or ( nKeyCode = 7 ) > *** We need this to update the combo's display value > If This.handlekey( nKeyCode ) > Nodefault > Endif > Endif > Endproc >Enddefine >