DCBROWSE array of objects.

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
jdsoft
Posts: 113
Joined: Thu Jan 28, 2010 1:13 pm
Location: Overberg
Contact:

DCBROWSE array of objects.

#1 Post by jdsoft »

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

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)>))]               			    ;
     ....
_dcfunct.prg

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
_dcxbrow.prg

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
Regards,
Jack Duijf
Regards,
Jack Duijf

User avatar
rdonnay
Site Admin
Posts: 4729
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: DCBROWSE array of objects.

#2 Post by rdonnay »

Jack -

This is very good.
Just a small change to make it work with multi-dimensional arrays would make it perfect.

Then we can write a nice sample program to show other eXpress++ users how to use this powerful new feature.

Roger
The eXpress train is coming - and it has more cars.

User avatar
jdsoft
Posts: 113
Joined: Thu Jan 28, 2010 1:13 pm
Location: Overberg
Contact:

Re: DCBROWSE array of objects.

#3 Post by jdsoft »

Hello Roger,

I managed this. Now you can browse a single dimensional array with objects, or a multi dimensional array with objects.
See sample program below, and modifications in Express++

Regards,
Jack Duijf

Code: Select all

#include "dcdialog.ch"
#INCLUDE "AppEvent.ch"

FUNCTION Main()

LOCAL aData    := {}
LOCAL GetList  := {}
LOCAL oBrowse  := nil
LOCAL oData    := nil
USE kla_stam Alias customer

DO WHILE !CUSTOMER->(Eof())
  oData := MyData():new()
  oData:id := CUSTOMER->KL_NUMMER
  oData:name := CUSTOMER->KL_NAAM
  oData:address := CUSTOMER->KL_ADRES2
  oData:city := CUSTOMER->KL_WOONPL
  oData:zip := CUSTOMER->KL_POSTK
  AAdd(aData,{oData,CUSTOMER->(Recno())})
  CUSTOMER->(dbSkip())
ENDDO

@ 0,0 DCBROWSE oBrowse DATA aData SIZE 20,20 FIT  EDIT xbeBRW_ItemSelected
DCBROWSECOL ELEMENT 2                         HEADER 'Recno()'  WIDTH  5 PARENT oBrowse
DCBROWSECOL OBJECTVAR "id"          ELEMENT 1 HEADER 'ID'       WIDTH  5 PARENT oBrowse
DCBROWSECOL OBJECTVAR "name"        ELEMENT 1 HEADER 'Name'     WIDTH 15 PARENT oBrowse
DCBROWSECOL OBJECTVAR "address"     ELEMENT 1 HEADER 'Address'  WIDTH 15 PARENT oBrowse
DCBROWSECOL OBJECTVAR "city"        ELEMENT 1 HEADER 'City'     WIDTH 10 PARENT oBrowse
DCBROWSECOL OBJECTVAR "zip"         ELEMENT 1 HEADER 'Zip'      WIDTH  6 PARENT oBrowse
DCBROWSECOL OBJECTVAR "zipcity()"   ELEMENT 1 HEADER 'Zip+city' WIDTH 16 PARENT oBrowse
dCREAD GUI FIT TITLE 'Browse array of objects'
RETURN nil

CLASS MyData
EXPORTED:
 VAR id
 VAR name
 VAR address
 VAR city
 VAR zip
INLINE METHOD zipcity() ; Return AllTrim(::zip) + " " + ::city
INLINE METHOD Init
::id := ''
::name := ''
::address := ''
::city := ''
::zip := ''
RETURN self
ENDCLASS

PROC appsys; return
Below you see the code snippets for Express++
DcDialog.ch

Code: Select all

//DcDialog,ch
#xcommand DCBROWSECOL                                                       ;
                ....
                [OBJECTVAR <uVar> [ELEMENT <nObjPointer>]]		    ;
                .....
=>
  AADD( DCGUI_GETLIST,DC_GetTemplate(GETLIST_BROWSECOL) )                   ;
      .....
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR,                           ;
         DC_ObjectVarBlock(<(uVar)>,<nObjPointer>))]        		    ;
     .....
_DcFunct.prg

Code: Select all

// _DcFunct.prg
FUNCTION DC_ObjectVarBlock(cVar,nPointer )                                             // J. Duijf 29-11-2010 Used to browse arrays of objects
if ValType(nPointer) = "N" .and. nPointer > 0
   RETURN {|u,oDC_XbpColumn|DC_ObjectVarBlock_Access(u,oDC_XbpColumn,&("{|oBrowse,u|iif(u==nil,oBrowse:dataSource[oBrowse:arrayElement," + Ltrim(Str(nPointer)) + "]:" + cVar + ",(oBrowse:dataSource[oBrowse:arrayElement," + Ltrim(Str(nPointer)) + "]:" + cVar + " := u))}"))}
else
   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))}"))}
endif
Return nil
_dcxbrow.prg

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
Regards,
Jack Duijf

User avatar
rdonnay
Site Admin
Posts: 4729
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: DCBROWSE array of objects.

#4 Post by rdonnay »

Jack -

I made some modifications to simplify the code.
Using a macro to compile the code block did not cause any benefit at runtime because the macro was inside the parent code block.

I put the DC_ObjectVarBlock() function in _DCXBROW.PRG because this is unique to the browsing system.
I also had to make some other changes to the DC_XbpColumn() class for the datalink to work correctly and for cell-editing to work correctly.

I moved the OBJECTVAR clause in DCDIALOG.CH to the bottom of all the clauses. This should now allow the uVar not to cause a syntax error if not using quotes.

Copy OBJECTS.PRG and OBJECTS.XPJ to your \exp19\samples\browse folder.
Copy _DCXBROW.PRG to your \exp19\source\dclipx folder.
Copy DCDIALOG.CH to your \exp19\include folder.
Attachments
BrowseObjects.zip
(64.82 KiB) Downloaded 748 times
The eXpress train is coming - and it has more cars.

User avatar
hz_scotty
Posts: 107
Joined: Thu Jan 28, 2010 8:20 am
Location: Wr.Neustadt / Österreich

Re: DCBROWSE array of objects.

#5 Post by hz_scotty »

err.jpg
err.jpg (23.43 KiB) Viewed 12595 times
hi
get some error with your update (BrowseObjects.zip) - what's the mistake?
best regards
Hans

User avatar
jdsoft
Posts: 113
Joined: Thu Jan 28, 2010 1:13 pm
Location: Overberg
Contact:

Re: DCBROWSE array of objects.

#6 Post by jdsoft »

Hello Roger,

After aplying the changes, i am unable to compile existing projects.
I solved this as follows:
1. Just replace _dcxbrow.prg
2. Just replace the #xcommand DCBROWSECOL in my existing dcdialog.ch
3. Rebuild Dclipx (build19_sl1 /all

Then there is a obsure vertical line in the test program. This is caused by the double DCBROWSE command. You need to remove one of them.

Regards,
Jack Duijf

Code: Select all

#xcommand DCBROWSECOL                                                       ;
                [DATA <xData>]                                              ;
                [ADSFIELD <adsFld> [CURSOR <adsCursor>] [FORMAT <adsFormat>]];
                [FIELD <fld>]                                               ;
                [PICTURE <cPict>]                                           ;
                [ELEMENT <nPointer>]                                        ;
                [WIDTH <nWidth>]                                            ;
                [<h:HEADER,HEADING> <cHeader>] [HEADPRES <aHeadPres>]       ;
                [<f:FOOTER,FOOTING> <cFooter>] [FOOTPRES <aFootPres>]       ;
                [TYPE <anType>]                                             ;
                [REPRESENTATION <aRep>]                                     ;
                [ALIGN <nAlign>]                                            ;
                [COLOR <bncFgC> [,<ncBgC>] ]                                ;
                [HCOLOR <bncHFgC> [,<ncHBgC>] ]                             ;
                [FCOLOR <bncFFgC> [,<ncFBgC>] ]                             ;
                [HFONT <bcHFont>]                                           ;
                [HHEIGHT <bnHHeight>]                                       ;
                [FFONT <bcFFont>]                                           ;
                [FHEIGHT <bnFHeight>]                                       ;
                [PARENT <oParent>]                                          ;
                [PARENTID <cPID>]                                           ;
                [TOOLTIP <cToolTip>]                                        ;
                [MESSAGE <cMsg> [INTO <oMsg>]]                              ;
                [HELPCODE <cHelpCode>]                                      ;
                [OBJECT <oObject>]                                          ;
                [HIDE <bHide>]                                              ;
                [VALID <bValid> [<always:ALWAYS>] [ALWAYS <_always>]]       ;
                [FONT <cFont>]                                              ;
                [CARGO <xCargo>]                                            ;
                [PRESENTATION <aPres>]                                      ;
                [EVAL <bEval>]                                              ;
                [PREEVAL <bPreEval>]                                        ;
                [POSTEVAL <bPostEval>]                                      ;
                [WHEN <bWhen>]                                              ;
                [SORT <bSort>                                               ;
                     [<lb:LEFTBUTTON>] [_LEFTBUTTON <_lb>]                  ;
                     [<def:DEFAULT>] [_DEFAULT <_def>]]                     ;
                [TITLE <cTitle>]                                            ;
                [ID <cId>]                                                  ;
                [ACCELKEY <nAccel>]                                         ;
                [GOTFOCUS <bGotFocus>]                                      ;
                [LOSTFOCUS <bLostFocus>]                                    ;
                [EDITOR <bcEdit> [EXITKEY <nExitKey>] ]                     ;
                [GROUP <cGroup>]                                            ;
                [<prot: PROTECT, EDITPROTECT> <bProtect>]                   ;
                [<p: PIXEL>] [_PIXEL <_pixel>]                              ;
                [DATATOOLTIP <bTipWhen> [TIPBLOCK <bTipBlock>]]             ;
                [<lNoCreate:NOCREATE>] [_NOCREATE <_noc>]                   ;
                [<lNoResize:NORESIZE>] [_NORESIZE <_nor>]                   ;
                [CLASS <bcClass>]                                           ;
                [<lHide:HIDE>]                                              ;
                [DRAG <bDrag> [TYPE <nDragType>] [DIALOG <bDD>]]            ;
                [DROP <bDrop> [TYPE <nDropType>] [CURSOR <nDropCursor>]]    ;
                [<lNoAutoResizeColumn:NOAUTORESIZE>]                        ;
                [CONFIG <oConfig>]                                          ;
                [SUBCLASS <cSubClass>]                                      ;
                [OBJECTVAR <uVar> [ELEMENT <nOPointer>]]                    ;
									    ;
 =>                                                                         ;
  AADD( DCGUI_GETLIST,DC_GetTemplate(GETLIST_BROWSECOL) )                   ;
      [;DC_GetListSet(DCGUI_GETLIST,nGETLIST_SUBTYPE,<anType>)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_CAPTION,<cHeader>)]            ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR,                           ;
         {|a| IIF(a==NIL .OR. <fld>==a, <fld>, <fld>:=a) })]                ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR,                           ;
         DC_AdsFieldBlock(<adsCursor>,<adsFld>,<adsFormat>))]               ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VAR,                           ;
         DC_ObjectVarBlock(<(uVar)>,<nOPointer>))]        		    ;
      [;DC_GetListSet(DCGUI_GETLIST,nGETLIST_WIDTH,<nWidth>)]               ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_FONT,<cFont>)]                 ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_PICTURE,<cPict>)]              ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_WHEN,<bWhen>)]                 ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_VALID,<bValid>)]               ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_TOOLTIP,<cToolTip>)]           ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_CARGO,<xCargo>)]               ;
      [;DC_GetListSet(DCGUI_GETLIST,aGETLIST_PRESENTATION,<aPres>)]         ;
       ;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,                       ;
        {<bSort>,<(bSort)>,<cFooter>,<bcEdit>,<nExitKey>,                   ;
        <.lb.>,<.lNoCreate.>,<.def.>,<.lNoResize.>,<.lHide.>,               ;
        <.lNoAutoResizeColumn.>, <.always.> [.OR. <_always>]})              ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,<_lb>,6)]              ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,<_noc>,7)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,<_nor>,9)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS,<_def>,8)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,aGETLIST_COLOR,{<bncFgC>,<ncBgC>})]     ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_MESSAGE,{<cMsg>,nil})]         ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_MESSAGE,                       ;
         DC_GetAnchorCB(@<oMsg>,'O'),2)]                                    ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_HELPCODE,<cHelpCode>)]         ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_GROUP,                         ;
        DC_GetAnchorCB(@<oObject>,'O'))]                                    ;
      [;DC_GetListSet(DCGUI_GETLIST,nGETLIST_POINTER,<nPointer>)]           ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PARENT,                        ;
        DC_GetAnchorCB(@<oParent>,'O'))]                                    ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PARENT,<cPID>)]                ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_REFVAR,                        ;
        {<xData>,<(xData)>})]                                               ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PROTECT,<bProtect>)]           ;
      [;DC_GetListSet(DCGUI_GETLIST,oGETLIST_CONFIG,<oConfig>)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,lGETLIST_PIXEL,<.p.>)]                  ;
      [;DC_GetListSet(DCGUI_GETLIST,lGETLIST_PIXEL,<_pixel>)]               ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_EVAL,<bEval>)]                 ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_TITLE,<cTitle>)]               ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_ID,DC_GetIdDefault(<cId>,<(fld)>,'COL_'))] ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_HIDE,<bHide>)]                 ;
      [;DC_GetListSet(DCGUI_GETLIST,nGETLIST_ACCELKEY,<nAccel>)]            ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_GOTFOCUS,<bGotFocus>)]         ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_LOSTFOCUS,<bLostFocus>)]       ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_GETGROUP,<cGroup>)]            ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_CLASS,<bcClass>)]              ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_PREEVAL,<bPreEval>)]           ;
      [;DC_GetListSet(DCGUI_GETLIST,bGETLIST_POSTEVAL,<bPostEval>)]         ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS2,                      ;
        {<bncHFgC>,<ncHBgC>,<bcHFont>,<bnHHeight>})]                        ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS3,<aHeadPres>)]         ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS4,<aFootPres>)]         ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS5,<(fld)>)]             ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS6,<aRep>)]              ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS7,<nAlign>)]            ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS8,                      ;
        {<bncFFgC>,<ncFBgC>,<bcFFont>,<bnFHeight>})]                        ;
      [;DC_GetListSet(DCGUI_GETLIST,xGETLIST_OPTIONS9,                      ;
        {<bTipWhen>,<bTipBlock>})]                                          ;
      [;DC_GetListSet(DCGUI_GETLIST,aGETLIST_DRAGDROP,                      ;
        {<bDrag>,<nDragType>,<bDD>,<bDrop>,<nDropType>,<nDropCursor>})]     ;
      [;DC_GetListSet(DCGUI_GETLIST,cGETLIST_SUBCLASS,<cSubClass>)]         ;
Regards,
Jack Duijf

User avatar
rdonnay
Site Admin
Posts: 4729
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: DCBROWSE array of objects.

#7 Post by rdonnay »

Here is a version of OBJECTS.PRG that should work ok.

Code: Select all

#include "dcdialog.ch"
#INCLUDE "appevent.CH"

FUNCTION Main()

LOCAL oData, aData[0], GetList[0], oBrowse, oRecord, i, nRecNo, lStatus

USE ..\..\data\customer

oRecord := CUSTOMER->(DC_DbRecord():new())

DO WHILE !CUSTOMER->(Eof())
  oRecord := CUSTOMER->(DC_DbRecord():new())
  CUSTOMER->(DC_DbScatter(oRecord))
  AAdd(aData,{oRecord,CUSTOMER->(RecNo())})
  CUSTOMER->(dbSkip())
ENDDO

@ 0,0 DCBROWSE oBrowse DATA aData SIZE 20,20 FIT ;
      FILTER {|a|Left(a[1]:bill_city,1)$'ASWBGH'} ;
      EDIT xbeBRW_ItemSelected

DCBROWSECOL OBJECTVAR cust_nmbr ELEMENT 1  HEADER 'ID'       WIDTH  5 PARENT oBrowse
DCBROWSECOL OBJECTVAR bill_name ELEMENT 1  HEADER 'Name'     WIDTH 15 PARENT oBrowse
DCBROWSECOL OBJECTVAR bill_strt ELEMENT 1  HEADER 'Address'  WIDTH 15 PARENT oBrowse
DCBROWSECOL OBJECTVAR bill_city ELEMENT 1  HEADER 'City'     WIDTH 10 PARENT oBrowse
DCBROWSECOL OBJECTVAR bill_zip  ELEMENT 1  HEADER 'Zip'      WIDTH  4 PARENT oBrowse
DCBROWSECOL ELEMENT 2 HEADER 'Record' WIDTH 5 PICTURE '9999' PARENT oBrowse

DCREAD GUI FIT ADDBUTTONS TITLE 'Browse array of objects' TO lStatus

IF lStatus
  FOR i := 1 TO Len(aData)
    oRecord := aData[i,1]
    nRecno := aData[i,2]
    CUSTOMER->(dbGoTo(nRecno))
    CUSTOMER->(DC_DbGather(oRecord))
  NEXT
ENDIF

RETURN nil

PROC appsys; return
The eXpress train is coming - and it has more cars.

User avatar
rdonnay
Site Admin
Posts: 4729
Joined: Wed Jan 27, 2010 6:58 pm
Location: Boise, Idaho USA
Contact:

Re: DCBROWSE array of objects.

#8 Post by rdonnay »

Here is a big improvement that now allows expressions instead of just vars.

This sample shows how to browse elements of a Getlist:

Code: Select all

STATIC FUNCTION BrowseGetListObjects( aGetList )

LOCAL GetList[0], oBrowse

@ 0,0 DCBROWSE oBrowse DATA aGetList SIZE 20,20 FIT

DCBROWSECOL DATA {||DC_GetListType(aGetList[oBrowse:arrayElement,nGETLIST_TYPE])} ;
   HEADER 'Type' WIDTH 15 PARENT oBrowse

DCBROWSECOL OBJECTVAR className() ELEMENT oGETLIST_OBJECT ;
   HEADER 'Class Name' WIDTH 10 PARENT oBrowse

DCBROWSECOL OBJECTVAR setParent() ELEMENT oGETLIST_OBJECT ;
   HEADER 'Parent' WIDTH 10 PARENT oBrowse

DCBROWSECOL OBJECTVAR currentSize()[1] ELEMENT oGETLIST_OBJECT ;
   HEADER 'Width' WIDTH 3 PARENT oBrowse PICTURE '9999'

DCBROWSECOL OBJECTVAR currentSize()[2] ELEMENT oGETLIST_OBJECT ;
   HEADER 'Height' WIDTH 3 PARENT oBrowse PICTURE '9999'

DCBROWSECOL OBJECTVAR currentPos()[1] ELEMENT oGETLIST_OBJECT ;
   HEADER 'Col' WIDTH 3 PARENT oBrowse PICTURE '9999'

DCBROWSECOL OBJECTVAR currentPos()[2] ELEMENT oGETLIST_OBJECT ;
   HEADER 'Row' WIDTH 3 PARENT oBrowse PICTURE '9999'

DCREAD GUI FIT TITLE 'Browsing GetList' MODAL

RETURN nil
This is the updated code for DC_ObjectVarBlock():

Code: Select all

FUNCTION DC_ObjectVarBlock( cVar, nElement )

LOCAL bAccess

bAccess := {|u,o|_ObjectAccess(u,o,cVar,nElement)}

RETURN bAccess

* ---------

STATIC FUNCTION _ObjectAccess( u,oColumn,cVar,nElement )

LOCAL oBrowse, aData, oObject, bError, lStatus := .f.

IF Valtype(oColumn) # 'O'
  RETURN ''
ENDIF

oBrowse := oColumn:parent
aData := oBrowse:dataSource
IF Empty(aData)
  RETURN ''
ENDIF
IF Valtype(nElement) == 'N'
  oObject := aData[oBrowse:arrayElement,nElement]
ELSE
  oObject := aData[oBrowse:arrayElement]
ENDIF
IF Valtype(oObject) # 'O'
  u := '<not an object>'
  lStatus := .t.
ELSE
  PRIVATE _oObject := oObject
  bError := ErrorBlock({|e|Break(e)})
  BEGIN SEQUENCE
  IF u == nil
    u := &('_oObject:' + cVar)
  ELSE
    &('_oObject:' + cVar) := u
  ENDIF
  lStatus := .t.
  END SEQUENCE
  ErrorBlock(bError)
ENDIF
IF !lStatus
  u := '<' + cVar + ':undefined>'
ENDIF

RETURN u

GetlistBrowse.Jpg
GetlistBrowse.Jpg (95.84 KiB) Viewed 12563 times
The eXpress train is coming - and it has more cars.

Post Reply