This is a sample using STATES.DBF related to CUSTOMER.DBF in the \fwh\samples folder. Please compile and test this program in the \fwh\samples folder.
Code: Select all | Expand
/*
*
* XbTree3.Prg
* 24-12-2010 08:39 PM
*
*/
#include "FiveWin.Ch"
#include "ord.ch"
#include "xbrowse.ch"
//----------------------------------------------------------------------------//
#xtranslate bmp( <c> ) => "c:\fwh\bitmaps\16x16\" + <c> + ".bmp"
REQUEST DBFCDX
static nTot := 0
//----------------------------------------------------------------------------//
function Main()
OpenData()
TreeBrowse( MakeTree() )
return (0)
//----------------------------------------------------------------------------//
init procedure PrgInit
SET DATE ITALIAN
SET CENTURY ON
SET TIME FORMAT TO "HH:MM:SS"
SET EPOCH TO YEAR(DATE())-50
SET DELETED ON
SET EXCLUSIVE OFF
RDDSETDEFAULT( "DBFCDX" )
XbrNumFormat( 'E', .t. )
SetKinetic( .f. )
SetGetColorFocus()
return
//----------------------------------------------------------------------------//
static function TreeBrowse( oTree )
local oDlg, oBrw, oFont
local aColors := { ;
{ CLR_BLACK, RGB(255,255,200) }, ;
{ CLR_BLACK, CLR_WHITE } }
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
DEFINE DIALOG oDlg SIZE 800,500 PIXEL ;
TITLE "Xbrowse Tree" FONT oFont
@ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
CELL LINES NOBORDER FOOTERS
oBrw:SetTree( oTree, { bmp( "open" ), bmp( "folder" ), bmp( "source" ) } )
ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 1 ] HEADER 'FirstName' SIZE 100
ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 2 ] HEADER 'LastName' SIZE 100
ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 3 ] HEADER 'Age' PICTURE '@Z 999'
ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 4 ] HEADER 'Salary' PICTURE '@Z 99,999,999.99'
WITH OBJECT oBrw
:bClrStd := { || aColors[ oBrw:oTreeItem:nLevel ] }
:bClrSel := { || { CLR_BLACK, CLR_HGRAY } }
:Item:cHeader := "State/City"
:Salary:nTotal := nTot
:nStretchCol := 1
END
oBrw:CreateFromCode()
ACTIVATE DIALOG oDlg CENTERED ON INIT ( oBrw:SetFocus(), .f. )
RELEASE FONT oFont
return nil
//----------------------------------------------------------------------------//
static function MakeTree()
local aTot
local oTree
STATES->( DbGoTop() )
TREE oTree
do while !STATES->( eof() )
TREEITEM STATES->NAME CARGO ( aTot := { '', '', 0, 0 } )
if STATES->CODE == CUST->STATE
TREE
do while !CUST->( eof() )
TREEITEM CUST->CITY CARGO { CUST->FIRST, CUST->LAST, CUST->AGE, CUST->SALARY }
aTot[ 4 ] += CUST->SALARY
CUST->( DbSkip( 1 ) )
enddo
nTot += aTot[ 4 ]
ENDTREE
endif
STATES->( DbSkip( 1 ) )
enddo
ENDTREE
STATES->( DbGoTop() )
return oTree
//----------------------------------------------------------------------------//
static function OpenData()
field CODE
USE STATES NEW SHARED
USE CUSTOMER NEW ALIAS CUST SHARED
SET ORDER TO TAG STATE
GO TOP
SELECT STATES
SET RELATION TO CODE INTO CUST SCOPED
GO TOP
return nil
//----------------------------------------------------------------------------//
Screenshot:
![Image](http://img52.imageshack.us/img52/3629/xbtree3.jpg)
In the above sample, the entire data is read into the TreeItem's cargo variable in the memory.
Method: 2
-------------
In the next sample, data is NOT read into memory but the DBF is navigated to show the data.
Code: Select all | Expand
/*
*
* XbTree4.Prg
* G.N.Rao
*
*/
#include "FiveWin.Ch"
#include "ord.ch"
#include "xbrowse.ch"
//----------------------------------------------------------------------------//
REQUEST DBFCDX
#xtranslate bmp( <c> ) => "c:\fwh\bitmaps\16x16\" + <c> + ".bmp"
//----------------------------------------------------------------------------//
function Main()
OpenData()
TreeBrowse( MakeTree() )
return (0)
//----------------------------------------------------------------------------//
init procedure PrgInit
SET DATE ITALIAN
SET CENTURY ON
SET TIME FORMAT TO "HH:MM:SS"
SET EPOCH TO YEAR(DATE())-50
SET DELETED ON
SET EXCLUSIVE OFF
RDDSETDEFAULT( "DBFCDX" )
XbrNumFormat( 'E', .t. )
SetKinetic( .f. )
SetGetColorFocus()
return
//----------------------------------------------------------------------------//
static function TreeBrowse( oTree )
local oDlg, oBrw, oFont
local aColors := { ;
{ CLR_BLACK, RGB(255,255,200) }, ;
{ CLR_BLACK, CLR_WHITE } }
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-12
DEFINE DIALOG oDlg SIZE 800,500 PIXEL ;
TITLE "Xbrowse Tree" FONT oFont
@ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
COLUMNS 'First', 'Last', 'Age', 'Salary' ;
ALIAS 'CUST' ;
CELL LINES NOBORDER FOOTERS
oBrw:SetTree( oTree, { bmp( "open" ), bmp( "folder" ), bmp( "source" ) }, ;
{ |oItem| CUST->( DbGoTo( oItem:Cargo ) ) } )
WITH OBJECT oBrw
:bClrStd := { || aColors[ oBrw:oTreeItem:nLevel ] }
:bClrSel := { || { CLR_BLACK, CLR_HGRAY } }
:Item:cHeader := "State/City"
:Age:cEditPicture := "@Z 999"
:Salary:cEditPicture := "@Z 999,999,999.99"
:nStretchCol := 1
END
oBrw:CreateFromCode()
ACTIVATE DIALOG oDlg CENTERED ON INIT ( oBrw:SetFocus(), .f. )
RELEASE FONT oFont
return nil
//----------------------------------------------------------------------------//
static function MakeTree()
local oTree
STATES->( DbGoTop() )
TREE oTree
do while !STATES->( eof() )
TREEITEM STATES->NAME CARGO 0
if STATES->CODE == CUST->STATE
TREE
do while !CUST->( eof() )
TREEITEM CUST->CITY CARGO CUST->( RecNo() )
CUST->( DbSkip( 1 ) )
enddo
ENDTREE
endif
STATES->( DbSkip( 1 ) )
enddo
ENDTREE
STATES->( DbGoTop() )
return oTree
//----------------------------------------------------------------------------//
static function OpenData()
field CODE
USE STATES NEW SHARED
USE CUSTOMER NEW ALIAS CUST SHARED
SET ORDER TO TAG STATE
GO TOP
SELECT STATES
SET RELATION TO CODE INTO CUST SCOPED
GO TOP
return nil
//----------------------------------------------------------------------------//