Page 1 of 1

Como refrescar Intems de un de Tree en un Xbrose

Posted: Tue Mar 02, 2021 1:24 am
by checo176
Estimados amigos, espero se encuentren todos bien de salud. Necesito de su ayuda ya que me he quebrado la cabeza para actualizar los Ítems que han sido modificados en un Tree de un Xbrowse que uso para Indexar bases de datos. Sólo me funciona el refresco cuando cambio solo un Ítem del Tree, no así cuando uso la función de marcado para todos los Ítem del Tree, ya que solo me refresca el Ítem que seleccioné, pero no así sus Ítems debajo, siendo que la información de la columna a mostrar cambio, ya sea a .T. o .F., mostrando el Bitmaps, respectivo del Ítem.

A continuación les dejo algunas imágenes, para que puedan entender la solución que estoy buscando

Acá la ventana con el arbol inicial, antes de abrirse:

Image

Luego el Tree abierto:

Image

Cuando hago doble click sobre alguno de los Items del Tree, se marcan y refrescan sin problemas

Image

Luego aca tengo mi problema, al marcar la columna de la cabecera del Árbol, de modo de seleccionar en forma simultánea todos los Ítem de esa rama del Tree, solo puedo refrescar el Ítem de la cabecera de la rama, no así los items, ya que no los puedo refrescar, aunque la función si trabaja bien y cambia a .f. o .t., según sea el caso a toda la familia en la base de Datos. Intenté usar el Método obrw:otree:Refresh() y me da error, pero si uso ]obrw:Refresh()[/b, solo se refresca el Ítem que seleccioné del árbol. como pasa al seleccionar los items individual de la rama, como se mostró arriba.

Image

Acá les muestro parte de la línea de código que uso para hacer lo anterior:


Code: Select all

function Indexa(oWndMain)

   local oWnd, oCol
   local oRs, oRsTot
   local oTree, oItem
   local oBold, bFont
   local nMethod := 1
   local oBrw, oChild
   local oDlg, oBIndex, FntArial
   local cAlias := cGetNewAlias( "FBD" )
   local cDbName  := ""
   local cNtxName := ""
   local oDbName, oNtxName
   local cItem  := "Bases de Datos"
   local aGradBarMet:= { { 1/2, nRGB( 224, 255, 255), nRGB( 135, 206, 250 )  } , ;
                         { 1/2, nRGB( 030, 144, 255), nRGB( 000, 255, 255 ) } }
   local aGradRowSel:= {{ 1, RGB(000,191, 255), RGB(224,255,255)}}
   local aGradBarSel:= {{ 1, RGB(030,144,255) , RGB(000,255, 255) } }


   FW_SetUnicode( .T. )
   FW_TouchFriendly( .T. )

   CheckBDCdx()
   FBD->( OrdSetFocus( "FBDIND2" ), DBGoTop() )
   if FilLock(5)
      Replace FBD->INDEXA_FBD with .f. ALL
   endif
   commit
   unlock

   go top   
   SetBalloon( .t. )
   SetGetColorFocus()

   lSmallScr   := ( sqrt( screenwidthmm() ^ 2 + screenheightmm() ^ 2 ) / 25.4 < 12 )

   
  DEFINE FONT oBold NAME "TAHOMA" SIZE 0,-12 BOLD
  
  DEFINE WINDOW oWnd MDICHILD OF oWndMain TITLE "Indexacion Base de Datos"  
  
   @ 0,0 XBROWSE oBrw  OF oWnd ;
         COLUMNS "Descripcion"   ;
         JUSTIFY AL_LEFT,AL_LEFT, AL_CENTER ;
         LINES CELL AUTOCOLS  FASTEDIT
         
      oTree := BuildTree()
      oBrw:SetTree( oTree, { "OPEN", "CLOSE", "DATABASE" } ) 
            
      ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 1 ]  TITLE "Base de Datos" SIZE 100
      ADD TO oBrw DATA oBrw:oTreeItem:Cargo[ 2 ]  TITLE "Indexar"       SIZE 60
      
   WITH OBJECT oBrw:Indexar
         :AddResource("ON")
         :AddResource("OFF")
         :bBmpData   := { || iif( oBrw:oTreeItem:Cargo[ 2 ]= .T., 1, 2) }
         :bStrData   := " "
   END         
   WITH OBJECT oBrw

      :nStretchCol      := STRETCHCOL_WIDEST
      :nColDividerStyle := LINESTYLE_RAISED
      :nRowDividerStyle := LINESTYLE_RAISED
      :nMarqueeStyle    := MARQSTYLE_HIGHLROWMS

      :LAllowColSwapping   := .f.
      :lHScroll             := .f.
      
      :lColDividerComplete := .f.
      :lAllowRowSizing     := .f.
      :lAllowColHiding     := .f.
      :lKineticBrw         := .f.
      :nRowHeight          := 24
      :nHeaderHeight       := 22
      
      :bLDblClick       := {|nRow,nCol| EditBrowse(nRow,nCol,oBrw, oDlg, oTree) }
      :bClrRowFocus     := { || { CLR_BLACK, aGradRowSel/*RGB(185,220,255)*/ } }
      :bClrStd          := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
      :bClrSel          := {|| { nRGB( 0, 0, 0), aGradRowSel } } // para barra de linea selecc cuando el control no tiene el foco
      :bClrSelFocus     := { || { CLR_BLACK, aGradBarSel } } // para barra de linea selecc cuando el control tiene el foco           
 
      :aCols[ 1 ]:cHeader  := "Descripcion"
      :CreateFromCode()

   END 

   oWnd:oClient   := oBrw
   
   BtnBar( oBrw)
   oWnd:bPostEnd  := { || ( cAlias )->( DBCLOSEAREA() ) } 
  
   ACTIVATE WINDOW oWnd ON INIT ( oBrw:SetFocus() )   
   
return nil

Code: Select all

static function BuildTree()

   local oTree, cFamiBD

   TREE oTree
      while ! Eof()
         if Empty( cFamiBD )
            _TreeItem( FBD->FAMIBD_FBD ):Cargo := { Space( 13 ), .F. }
            TREE
            cFamiBD = FBD->FAMIBD_FBD
         else
            if cFamiBD != FBD->FAMIBD_FBD
               ENDTREE
               cFamiBD = FBD->FAMIBD_FBD
               _TreeItem( FBD->FAMIBD_FBD ):Cargo := { Space( 13 ), .F. }
               TREE
            endif   
         endif   
         if FBD->FAMIBD_FBD == cFamiBD
            _TreeItem( FBD->DESCRI_FBD ):Cargo := { FBD->NOMBD_FBD, FBD->INDEXA_FBD }
         endif   
         SKIP
      enddo
      ENDTREE
   ENDTREE

   GO TOP

return oTree

Code: Select all

STATIC FUNCTION EditBrowse(nRow, nCol, oBrw, oDlg, oTree)

     LOCAL xVar, nRecno := RecNo()
     LOCAL nColPos  := 0 ,;
           nColInit := 0 ,;
           nColGet  := 0 ,;
         lAppend  := .f.

     lFin := cBrowse(3, oBrw)
//     oBrw:oTree:Refresh()
     
return nil

//------------------------------------------------------------//

static Function cBrowse(nColGet, oBrw)

   LOCAL xVar, nRecno, lEscape := .f., nTotal := 0
   LOCAL cFamiBD:= oBrw:Descripcion:Value()
   LOCAL cNomBD := oBrw:oTreeItem:Cargo[ 1 ]


   if nColGet = 3
      Select FBD
      FBD->( OrdSetFocus( "FBDIND1" ), DBGoTop() )
      if !EMPTY(cNombD)
        IF  DbSeek ( cNomBD )
            msgstop(FBD->NomBD_FBD)
         IF FBD->Indexa_FBD = .f.
            if FilLock(5)
               FBD->Indexa_FBD = .t.
               oBrw:oTreeItem:Cargo := { oBrw:oTreeItem:Cargo[ 1 ] , .T. }
               oBrw:Refresh()
            endif
            
         ELSE
            if FilLock(5)
               FBD->Indexa_FBD = .f.
               oBrw:oTreeItem:Cargo := { oBrw:oTreeItem:Cargo[ 1 ] , .F. }
               oBrw:Refresh()
            endif
         ENDIF
        ENDIF
        commit
        unlock
      else
        SET FILTER TO FamiBD_FBD = cFamiBD
        FBD->(DbGoTop())
        Do  while !EOF()
        msgstop(FBD->NomBD_FBD)
//            IF  DbSeek ( cNomBD )
               IF FBD->Indexa_FBD = .f.
                  if FilLock(5)
                     FBD->Indexa_FBD = .t.
                     oBrw:oTreeItem:Cargo := { oBrw:oTreeItem:Cargo[ 1 ] , .T. }
//                     oBrw:Refresh()
                  endif
               ELSE
                  if FilLock(5)
                     FBD->Indexa_FBD = .f.
                     oBrw:oTreeItem:Cargo := { oBrw:oTreeItem:Cargo[ 1 ] , .F. }                     
                  endif
               ENDIF
//            ENDIF
            commit
            unlock
            DBskip()
        Enddo
        BuildTree()
        oBrw:Refresh()
        set filter to
      endif
   endif

   oBrw:SetFocus()

   oBrw:DrawSelect()   

RETURN lEscape

les agradezco de ante mano su apoyo y orientación.

Un gran abrazo