Miguel,
En alguna tabla o dbf debes tener uno o varios campos para guardar las claves de los items seleccionados, yo los separo usando ':'
oTree := TTreeView():ReDefine( 101, oCatUsrFldr:aDialogs[2], CLR_BLACK, CLR_WHITE, .f. ,"RSTree" )
oTree:oFont := aSysFnts[9]
// Elementos del tree
{'1101021' ,' Notas De Mostrador' Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ,'K003'}, ;
{'1101022' ,' Facturas' Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ,'K004'}, ;
{'1101023' ,' Cotizaciones' Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ,'K005'}, ;
{'1101024' ,' Ventas Express' Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ,'K006'}, ;
{'1101025' ,' Preventas/Pedidos' Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ,'K007'}, ;
// Obtener items seleccionados
static function GetUOptsSld( oTree, aItems )
local n, nCargo
for n = 1 to len( aItems )
 if oTree:GetCheck( aItems[n] )
   nCargo := aItems[ n ]:cargo
   if ascan( aUsrOptsSld, {|n| n == nCargo} ) == 0
    aadd( aUsrOptsSld, aItems[n]:cargo )        // Aqui guardo la clave de los items seleccionados : K003, K004, etc
   endif
 endif
 GetUOptsSld( oTree, aItems[n]:aItems )
next
 Â
return nil
*-----*
// Actualizar items seleccionados
aOpts2Apl := HB_ATokens( aDmXDts[1,1], ":", .f., .f. )
SrcOptsValues( oTree, aItems, aOpts2Apl )
oTree:Refresh()
static function SrcOptsValues( oTree, aItems, aOptsGrntd )
local nQ
for nQ := 1 to len( aItems )
  oTree:SetCheck( aItems[nQ], .f. )
  if ascan( aOptsGrntd, aItems[nQ]:cargo ) > 0
    oTree:SetCheck( aItems[nQ], .t. )
  endif
  SrcOptsValues( oTree, aItems[nQ]:aItems, aOptsGrntd )
next
return nil
*-----*
Cualquier dudad estamos a la orden.
Saludos