/* * DBComboBoxMod.prg * Clase TDBComboBoxMod() * * Copyright 2020 Ignacio Ortiz de Zúñiga * Copyright 2020 https://Xailer.com * All rights reserved * */ #include "Xailer.ch" //-------------------------------------------------------------------------- CLASS XDBComboBoxMod FROM TComboBoxMod PUBLISHED: PROPERTY aItemsBound INIT {} EDITOR PE_MultiList PROPERTY nDataType INIT dtDEFAULT VALUES dtDefault, dtINDEX, dtSTRING, dtBOUND PROPERTY oDataSet WRITE SetDataSet EDITOR PE_Component AS TDataSet PROPERTY oDataField WRITE SetFieldObject EDITOR PE_DataField AS TDataField PROPERTY lEditable INIT .T. PROPERTY lAutoSave INIT .T. PROPERTY cHint INIT "" PROTECTED: DATA lLocked INIT .T. PUBLIC: PROPERTY Value WRITE METHOD SetValue READ METHOD GetValue PROPERTY cText PROPERTY nIndex METHOD Create( oParent ) METHOD Free() INLINE ( ::SetDataSet( , .T. ), ::Super:Free() ) // --> Nil METHOD Refresh( lValue ) // --> lSuccess METHOD Change( nIndex, nOldIndex ) // --> Nil METHOD EditChange() // --> Nil METHOD DbLinked() INLINE ( ValType( ::oDataField ) == "O" ) RESERVED: METHOD GetValue() METHOD SetValue( Value ) METHOD Lock() INLINE ::lLocked := .T., ::lReadOnly := .T. METHOD UnLock() INLINE ::lLocked := ! ::lEditable, IIf( ! ::lLocked, ::lReadOnly := .f., ) METHOD WMLButtonDown( w,l,h ) INLINE ; IIf( !::lLocked, ::Super:WMLButtonDown( w,l,h ), ( ::SetFocus(), 0 ) ) METHOD WMLButtonDblClk() INLINE IIf( ! ::lLocked, Nil, ( ::SetFocus(), 0 ) ) METHOD SetFieldObject( oField ) METHOD SetDataSet( Value ) EXTERN DC_SetDataSet METHOD DCSetFieldObject( oField ) EXTERN DC_SetFieldObject METHOD ResetDataField() EXTERN DC_ResetDataField METHOD SetData() EXTERN DC_SetData METHOD GetData() EXTERN DC_GetData ENDCLASS //-------------------------------------------------------------------------- METHOD Create( oParent ) CLASS XDBComboBoxMod ::Super:Create( oParent ) // Nota: para cargar el valor desde el campo despues de que todo este creado - [JFG] ::Refresh() RETURN Self //-------------------------------------------------------------------------- METHOD Refresh( lValue ) CLASS XDBComboBoxMod IF Valtype( ::oDataField ) == "O" .AND. ::oDataSet != Nil .AND. ! ::oDataSet:lOnEdit() ::Value := ::oDataField:Value ENDIF return ::Super:Refresh( lValue ) //-------------------------------------------------------------------------- METHOD GetValue() CLASS XDBComboBoxMod LOCAL xValue IF Valtype( ::oDataField ) == "O" DO CASE CASE ::nDataType == dtDEFAULT IF Valtype( ::oDataField:Value ) == "N" xValue := ::nIndex ELSE xValue := ::GetText( ::nIndex ) ENDIF CASE ::nDataType == dtINDEX IF Valtype( ::oDataField:Value ) == "N" xValue := ::nIndex ELSE xValue := StrZero( ::nIndex, ::oDataField:nLen ) ENDIF CASE ::nDataType == dtSTRING xValue := ::GetText( ::nIndex ) CASE ::nDataType == dtBOUND IF ::nIndex > 0 IF Valtype( ::oDataField:Value ) == "N" .AND. len( ::aItemsBound ) > 0 .AND. Valtype( ::aItemsBound[ 1 ] ) == "C" xValue := Val( ::aItemsBound[ ::nIndex ] ) ELSE xValue := ::aItemsBound[ ::nIndex ] ENDIF else xValue := 0 ENDIF ENDCASE RETURN xValue ENDIF RETURN ::Super:GetValue() //-------------------------------------------------------------------------- METHOD SetValue( xValue, lFocused, lUpdPict, lWithEvent ) CLASS XDBComboBoxMod LOCAL nVal, nAt DO CASE CASE ::nDataType == dtDEFAULT IF Valtype( xValue ) == "N" .AND. xValue > 0 .AND. xValue <= Len( ::aItems ) xValue := ::aItems[ xValue ] ENDIF CASE ::nDataType == dtINDEX IF Valtype( xValue ) == "N" IF xValue > 0 .AND. xValue <= Len( ::aItems ) xValue := ::aItems[ xValue ] ELSEIF !Empty( xValue ) xValue := "Error: <" + ToString( xValue ) + ">" ELSE xValue := ::cHint ENDIF ENDIF CASE ::nDataType == dtBOUND IF ValType( ::oDataField ) == "O" .AND. ::oDataField:Valtype() == "N" IF ValType( xValue ) == "C" // se ha pasado el literal y no el valor bound nAt := AScan( ::aItems, Trim( xValue ) ) ELSE nAt := AScan( ::aItemsBound, xValue ) ENDIF ELSEIF ValType( xValue ) == "C" nAt := AScan( ::aItemsBound, Trim( xValue ) ) IF nAt == 0 //.AND. ::lFreeEdit nAt := AScan( ::aItems, Trim( xValue ) ) ENDIF ELSE nAt := 0 ENDIF IF nAt > 0 .AND. nAt <= Len( ::aItems ) xValue := ::aItems[ nAt ] ELSEIF !Empty( xValue ) xValue := "Error: <" + ToString( xValue ) + ">" ELSE xValue := ::cHint ENDIF ENDCASE RETURN ::Super:SetValue( xValue, lFocused, lUpdPict, lWithEvent ) //-------------------------------------------------------------------------- METHOD Change( nIndex, nOldIndex ) CLASS XDBComboBoxMod ::Super:Change( nIndex, nOldIndex ) IF ::oDataSet != NIL .AND. ::oDataSet:lOnEdit() .AND. Valtype( ::oDataField ) == "O" ::oDataField:SetValue( ::Value, .T. ) ENDIF RETURN Nil //-------------------------------------------------------------------------- METHOD EditChange() CLASS XDBComboBoxMod ::Super:EditChange() IF ::oDataSet:lOnEdit() .AND. Valtype( ::oDataField ) == "O" ::oDataField:SetValue( ::Value, .T. ) ENDIF RETURN Nil //-------------------------------------------------------------------------- METHOD SetFieldObject( xField ) CLASS XDBComboBoxMod ::DCSetFieldObject( xField ) IF Valtype( ::FoDataField ) == "O" ::nMaxLength := ::FoDataField:nLen ENDIF RETURN Nil