Como refrescar Intems de un de Tree en un Xbrose
Posted: Tue Mar 02, 2021 1:24 am
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:
Luego el Tree abierto:
Cuando hago doble click sobre alguno de los Items del Tree, se marcan y refrescan sin problemas
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 [b]]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.
Acá les muestro parte de la línea de código que uso para hacer lo anterior:
les agradezco de ante mano su apoyo y orientación.
Un gran abrazo
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:
Luego el Tree abierto:
Cuando hago doble click sobre alguno de los Items del Tree, se marcan y refrescan sin problemas
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 [b]]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.
Acá les muestro parte de la línea de código que uso para hacer lo anterior:
- Code: Select all Expand view
- 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 Expand view
- 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 Expand view
- 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