/* * DBListBoxMod.prg * Clase TDBListBoxMod() * * Copyright 2020 Ignacio Ortiz de Zúñiga * Copyright 2020 https://Xailer.com * All rights reserved * */ #include "Xailer.ch" //-------------------------------------------------------------------------- CLASS XDBListBoxMod FROM TListBoxMod PUBLISHED: PROPERTY oDataSet WRITE SetDataSet EDITOR PE_Component AS TDataSet PROPERTY oDataField WRITE SetFieldObject EDITOR PE_DataField AS TDataField PROPERTY aItemsBound INIT {} EDITOR PE_MultiList PROPERTY nDataType INIT dtDEFAULT VALUES dtDefault, dtINDEX, dtSTRING, dtBOUND PROPERTY lEditable INIT .T. PROPERTY lAutoSave INIT .T. PROTECTED: DATA lLocked INIT .T. PUBLIC: PROPERTY Value READ METHOD GetValue WRITE METHOD SetValue PROPERTY nIndex METHOD Refresh( lValue ) // --> lSuccess METHOD Change( nIndex ) // --> Nil METHOD DbLinked() INLINE ( ValType( ::oDataField ) == "O" ) RESERVED: METHOD SetDataSet( Value ) EXTERN DC_SetDataSet METHOD SetFieldObject( oField ) EXTERN DC_SetFieldObject METHOD ResetDataField() EXTERN DC_ResetDataField METHOD SetData() EXTERN DC_SetData METHOD GetData() EXTERN DC_GetData METHOD GetValue() METHOD SetValue( Value ) METHOD Lock() INLINE ::lLocked := .T. METHOD UnLock() INLINE ::lLocked := ! ::lEditable METHOD WMKeyDown() EXTERN DC_WMKeyDown METHOD WMLButtonDown() INLINE IIf( ! ::lLocked, Nil, ( ::SetFocus(), 0 ) ) METHOD WMLButtonDblClk() INLINE IIf( ! ::lLocked, Nil, ( ::SetFocus(), 0 ) ) METHOD Free() INLINE ( ::SetDataSet( , .T. ), ::Super:Free() ) ENDCLASS //-------------------------------------------------------------------------- METHOD Refresh( lValue ) CLASS XDBListBoxMod IF Valtype( ::oDataField ) == "O" .AND. ::oDataSet != Nil .AND. ! ::oDataSet:lOnEdit() ::Value := ::oDataField:Value ENDIF RETURN ::Super:Refresh( lValue ) //-------------------------------------------------------------------------- METHOD GetValue() CLASS XDBListBoxMod 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 xValue := ::aItemsBound[ ::nIndex ] ENDIF ENDCASE ENDIF RETURN xValue //-------------------------------------------------------------------------- METHOD SetValue( xValue ) CLASS XDBListBoxMod DO CASE CASE Empty( xValue ) ::nIndex := 1 CASE ::nDataType == dtDEFAULT IF Valtype( xValue ) == "N" ::nIndex := xValue ELSE ::SelectString( xValue ) ENDIF CASE ::nDataType == dtINDEX IF Valtype( xValue ) != "N" ::nIndex := Val( xValue ) ELSE ::nIndex := xValue ENDIF CASE ::nDataType == dtSTRING ::SelectString( ToString( xValue, "" ) ) CASE ::nDataType == dtBOUND ::nIndex := AScan( ::aItemsBound, xValue ) ENDCASE RETURN Nil //-------------------------------------------------------------------------- METHOD Change( nIndex ) CLASS XDBListBoxMod ::Super:Change( nIndex ) IF ::oDataSet:lOnEdit() .AND. Valtype( ::oDataField ) == "O" ::oDataField:SetValue( ::Value, .T. ) ENDIF RETURN Nil //--------------------------------------------------------------------------