DCBROWSE array of objects.
Posted: Wed Dec 29, 2010 9:39 am
Hello Roger,
I made some modifications to the DCBROWSECOL, to facilitate browsing of an array of objects and prevent failure of existing code:
DcDialog.ch
_dcfunct.prg
_dcxbrow.prg
Regards,
Jack Duijf
I made some modifications to the DCBROWSECOL, to facilitate browsing of an array of objects and prevent failure of existing code:
DcDialog.ch
Code: Select all
// DcDialog.ch
#xcommand DCBROWSECOL ;
....
[OBJECTVAR <uVar> ;
.....
=>
AADD( DCGUI_GETLIST,DC_GetTemplate(GETLIST_BROWSECOL) ) ;
....
[;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR, ;
DC_ObjectVarBlock(<(uVar)>))] ;
....
Code: Select all
// DcFunct.prg
// J. Duijf 29-11-2010 Used to browse arrays of objects.
// This function is called only when: DCBROWSECOL OBJECTVAR cVar
//
// Entry: cVar = Name of var or access / assign method (as a string)
//
// This function creates a code-block to access a var or access / assign method of a object.
// The macro command builds a code-block that is passed thru function to actualy access the data.
// The macro is excuted just once.
//
FUNCTION DC_ObjectVarBlock(cVar ) // J. Duijf 29-11-2010 Used to browse arrays of objects
RETURN {|u,oDC_XbpColumn|DC_ObjectVarBlock_Access(u,oDC_XbpColumn,&("{|oBrowse,u|iif(u==nil,oBrowse:dataSource[oBrowse:arrayElement]:" + cVar + ",(oBrowse:dataSource[oBrowse:arrayElement]:" + cVar + " := u))}"))}
// J. Duijf 29-11-2010 Used to browse arrays of objects
// Entry: u = New value for property
// oDC_XbpColumn = Current DC_XbpColumn():New() object
// bAccess = Codeblock to access actual data
//
STATIC FUNCTION DC_ObjectVarBlock_Access(u,oDC_XbpColumn,bAccess )
LOCAL uRet := ""
LOCAL oBrowse := nil
if ValType(oDC_XbpColumn) = "O" // xbpColumn is known (post :Create())
oBrowse := oDC_XbpColumn:Parent // Get browse object
if ValType(oBrowse) = "O" // Parent object (Dc_Browse()) is created and assigned as parent
if !Empty(oBrowse:DataSource) // DataSource is NOT empty (At least 1 object)
uRet := Eval(bAccess,oBrowse,u) // Access / assign data
endif
endif
endif
Return uRet
Code: Select all
// _dcxbrow.prg
// Line 1825
LOCAL oSelf, bTmpDataBlock
// Line 1877
IF Valtype(bDataBlock) # 'B'
bDataBlock := DC_GetBlock( aGetListItem[bGETLIST_REFVAR] )
else // J. Duijf 29-12-2010
// Pass SELF as 2nd parameter to the datablock
oSelf := SELF
bTmpDataBlock := bDataBlock
bDataBlock := {|u|Eval(bTmpDataBlock,u,oSelf)}
ENDIF
Jack Duijf