Un problemita con TTreeView
- jose_murugosa
- Posts: 943
- Joined: Mon Feb 06, 2006 4:28 pm
- Location: Uruguay
- Contact:
Un problemita con TTreeView
Hola,
Tengo un problema con ttreeview, que no he podido solucionar.....
Gracias a un amigo he podido entender mejor como funcionan los tree, y estoy tratando de hacer un tree en el cual se puedan seleccionar itemes de un nivel y automaticamente se seleccionen los sub-itemes del branch.
El problema es que no he encontrado otro evento para disparar la acción de tildado que el click y sucede que el click es un evento que no se dispara si estoy seleccionando o tildando.
Por ello si tildo un item, los sub-items no se tildarán a menos que de click en cualquier parte del tree que no seleccione ni tilde.
Alguien me podría sugerir una solución?
Adjunto el código y un link al exe, la dll y el prg para quien quiera probar el código.
http://www.box.net/shared/hbidjadl2s
Gracias desde ya por vuestra ayuda
Tengo un problema con ttreeview, que no he podido solucionar.....
Gracias a un amigo he podido entender mejor como funcionan los tree, y estoy tratando de hacer un tree en el cual se puedan seleccionar itemes de un nivel y automaticamente se seleccionen los sub-itemes del branch.
El problema es que no he encontrado otro evento para disparar la acción de tildado que el click y sucede que el click es un evento que no se dispara si estoy seleccionando o tildando.
Por ello si tildo un item, los sub-items no se tildarán a menos que de click en cualquier parte del tree que no seleccione ni tilde.
Alguien me podría sugerir una solución?
Adjunto el código y un link al exe, la dll y el prg para quien quiera probar el código.
http://www.box.net/shared/hbidjadl2s
Gracias desde ya por vuestra ayuda
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
José Murugosa
FWH + Harbour + Bcc7. Una seda!
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Un problemita con TTreeView
Hola Jose
Code: Select all
// Using a TreeView with checkboxes and checking their status
#include "FiveWin.ch"
function Main()
local oDlg, oTree
DEFINE DIALOG oDlg
oTree = TTreeView():New( 0, 0, oDlg,,,,,200,200,,.t.)
oTree:OnClick = { | nRow, nCol | CheckStatus( oTree, oTree:aItems, nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT BuildTree( oTree )
return nil
function BuildTree( oTree )
local oMenu := Array( 2 ), oSubMenu := Array( 3 )
oMenu[ 1 ]:= oTree:Add( "Principal" )
oMenu[ 1 ]:Cargo = "01"
oSubMenu[ 1 ]:= oMenu[ 1 ]:Add( "Imprimir..." )
oSubMenu[ 1 ]:SetCheck( .T. )
oSubMenu[ 1 ]:Cargo = "01:01"
oMenu[ 2 ]:= oTree:Add( "Proyectos" )
oMenu[ 2 ]:Cargo = "02"
oSubMenu[ 2 ]:= oMenu[ 2 ]:Add( "Definir Proyectos" )
oSubMenu[ 2 ]:Cargo = "02:01"
oSubmenu[ 3 ]:= oMenu[ 2 ]:Add( "Actualización datos" )
oSubMenu[ 3 ]:Cargo = "02:02"
oTree:Expand()
return nil
function CheckStatus( oTree, aItems, nRow, nCol )
local n, lActivo, nn, x
local cPrompt, cCargo
local oItem
local aiTmp
oItem := oTree:HitTest( nRow, nCol )
nn := LEN(oItem:cargo)
lActivo:= oTree:GetCheck( oItem )
for n = 1 to Len( aItems )
if LEFT(aItems[ n ]:cargo,nn) == oItem:cargo
aiTmp:= aItems[n]:aItems
FOR x:= 1 TO LEN( aiTmp )
oTree:SetCheck( aiTmp[ x ], lActivo )
NEXT
endif
next
return nil
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- jose_murugosa
- Posts: 943
- Joined: Mon Feb 06, 2006 4:28 pm
- Location: Uruguay
- Contact:
Re: Un problemita con TTreeView
Muchas Gracias Daniel!!!
Llevaba 4 días quemandome la cabeza sin encontrar el como.....
Gracias por la ayuda que siempre nos das en el foro!!
Llevaba 4 días quemandome la cabeza sin encontrar el como.....
Gracias por la ayuda que siempre nos das en el foro!!

Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
José Murugosa
FWH + Harbour + Bcc7. Una seda!
Re: Un problemita con TTreeView
Daniel,
En el ejemplo posteado da error cuando se da click en menos (-)
El error es:
'NIL' has no exported method: CARGO
Saludos,
Adhemar
En el ejemplo posteado da error cuando se da click en menos (-)
El error es:
'NIL' has no exported method: CARGO
Saludos,
Adhemar
Saludos,
Adhemar C.
Adhemar C.
- jose_murugosa
- Posts: 943
- Joined: Mon Feb 06, 2006 4:28 pm
- Location: Uruguay
- Contact:
Re: Un problemita con TTreeView
En realidad, hay 2 problemasacuellar wrote:Daniel,
En el ejemplo posteado da error cuando se da click en menos (-)
El error es:
'NIL' has no exported method: CARGO
Saludos,
Adhemar
En primer lugar, cuando se da click en cualquier parte del tree que no sea tildar o seleccionar produce el error que mencionas.
En segundo lugar, no funciona el tildado si el tree se coloca desde recursos.
Pero... nos vamos acercando!!!!!

( aramos dijo el mosquito....

Re: Un problemita con TTreeView
Bueno,
yo encontre el siguiente tema y tambien la solucion, pero no sé como implementarla.
si tenemos una estructura
menu1
submenu1
submenu2
menu2
-.-
ahi anda ok
ahora si tenemos :
menu1
submenu1
submenu1.1
submenu1.2
submenu2
menu2
da error cuando pulso el +, el mismo q plantea jose, con la var CARGO, y entiendo q oItem va a NIL, x eso da error.
Lo q entiendo es q en el ejemplo q puso Daniel, y q habiamos empezado a probar con jose, es q faltaria como una recursividad para subopciones, pero no se como implementar eso...
bueno, a ver los experimentados si nos echan una manito.
Gracias., salu2.
yo encontre el siguiente tema y tambien la solucion, pero no sé como implementarla.
si tenemos una estructura
menu1
submenu1
submenu2
menu2
-.-
ahi anda ok
ahora si tenemos :
menu1
submenu1
submenu1.1
submenu1.2
submenu2
menu2
da error cuando pulso el +, el mismo q plantea jose, con la var CARGO, y entiendo q oItem va a NIL, x eso da error.
Lo q entiendo es q en el ejemplo q puso Daniel, y q habiamos empezado a probar con jose, es q faltaria como una recursividad para subopciones, pero no se como implementar eso...
bueno, a ver los experimentados si nos echan una manito.
Gracias., salu2.
- jose_murugosa
- Posts: 943
- Joined: Mon Feb 06, 2006 4:28 pm
- Location: Uruguay
- Contact:
Re: Un problemita con TTreeView
Efectivamente,
No he podido encontrar la vuelta al problema... verdaderamente me supera, mañana seguiré sufriendo..... gracias a todos los que se han interesado en el tema
No he podido encontrar la vuelta al problema... verdaderamente me supera, mañana seguiré sufriendo..... gracias a todos los que se han interesado en el tema

Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
José Murugosa
FWH + Harbour + Bcc7. Una seda!
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Un problemita con TTreeView
Jose
Relamnete trabaja diferente el creado desde recurso que el creado desde codigo... no tengo una explicacion logica :-s
Relamnete trabaja diferente el creado desde recurso que el creado desde codigo... no tengo una explicacion logica :-s
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Un problemita con TTreeView
Ariel solucionado tu puntoAriel wrote:Bueno,
yo encontre el siguiente tema y tambien la solucion, pero no sé como implementarla.
si tenemos una estructura
menu1
submenu1
submenu2
menu2
-.-
ahi anda ok
ahora si tenemos :
menu1
submenu1
submenu1.1
submenu1.2
submenu2
menu2
da error cuando pulso el +, el mismo q plantea jose, con la var CARGO, y entiendo q oItem va a NIL, x eso da error.
Lo q entiendo es q en el ejemplo q puso Daniel, y q habiamos empezado a probar con jose, es q faltaria como una recursividad para subopciones, pero no se como implementar eso...
bueno, a ver los experimentados si nos echan una manito.
Gracias., salu2.
Code: Select all
// Using a TreeView with checkboxes and checking their status
#include "FiveWin.ch"
function Main()
local oDlg, oTree
DEFINE DIALOG oDlg SIZE 400, 600
oTree = TTreeView():New( 0, 0, oDlg,,,,,200,300,,.t.)
oTree:OnClick = { | nRow, nCol | CheckStatus( oTree, oTree:aItems, nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT BuildTree( oTree )
return nil
function BuildTree( oTree )
local oMenu
local oSub, oSub2, oSub3
oMenu := oTree:Add( "menu 1" )
oSub = oMenu:Add( "submenu 1" )
oSub = oMenu:Add( "submenu 2" )
oSub = oMenu:Add( "submenu 3" )
oSub = oMenu:Add( "submenu 4" )
oSub = oMenu:Add( "submenu 5" )
oSub2 = oSub:Add( "submenu 5-1" )
oSub2 = oSub:Add( "submenu 5-2" )
oSub2 = oSub:Add( "submenu 5-3" )
oSub2 = oSub:Add( "submenu 5-4" )
oSub2 = oSub:Add( "submenu 5-5" )
oSub = oSub2:Add( "submenu 5-5-1" )
oSub = oSub2:Add( "submenu 5-5-2" )
oSub = oSub2:Add( "submenu 5-5-3" )
oSub = oSub2:Add( "submenu 5-5-4" )
oSub2 = oSub:Add( "submenu 5-5-1-1" )
oSub2 = oSub:Add( "submenu 5-5-1-2" )
oSub2 = oSub:Add( "submenu 5-5-1-3" )
oMenu := oTree:Add( "Principal" )
oSub = oMenu:Add( "Imprimir..." )
oTree:Expand()
return nil
function CheckStatus( oTree, aItems, nRow, nCol )
local lActivo
local oItem
oItem := oTree:HitTest( nRow, nCol )
if oItem != NIL
lActivo:= oTree:GetCheck( oItem )
RunItems( oItem:aItems, lActivo )
endif
return nil
//----------------------------------------------------------------------------//
function RunItems( aItems, lActivo )
local n, oItem
for n = 1 to Len( aItems )
aItems[ n ]:SetCheck( lActivo )
if Len( aItems[ n ]:aItems ) > 0
RunItems( aItems[ n ]:aItems, lActivo )
endif
next
return nil
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Re: Un problemita con TTreeView
Daniel,
Gracias funcíonó perfecta la multiseleccion, ahora encontré otro bugecito
, si le fuerzo a q este seleccionado el subitem, no lo tiene en cuenta.
siguiendo con tu ej. :
si te fijas los sub:Setcheck(.t.) NO funcionan.
Grax.
Salu2. Ariel.
Gracias funcíonó perfecta la multiseleccion, ahora encontré otro bugecito

siguiendo con tu ej. :
Code: Select all
// Using a TreeView with checkboxes and checking their status
#include "FiveWin.ch"
function Main()
local oDlg, oTree
DEFINE DIALOG oDlg SIZE 400, 600
oTree = TTreeView():New( 0, 0, oDlg,,,,,200,300,,.t.)
oTree:OnClick = { | nRow, nCol | CheckStatus( oTree, oTree:aItems, nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT BuildTree( oTree )
return nil
function BuildTree( oTree )
local oMenu
local oSub, oSub2, oSub3
oMenu := oTree:Add( "menu 1" )
oSub = oMenu:Add( "submenu 1" )
oSub:SetCheck( .t. )
oSub = oMenu:Add( "submenu 2" )
oSub = oMenu:Add( "submenu 3" )
oSub = oMenu:Add( "submenu 4" )
oSub = oMenu:Add( "submenu 5" )
oSub2 = oSub:Add( "submenu 5-1" )
oSub2 = oSub:Add( "submenu 5-2" )
oSub2:SetCheck( .t. )
oSub2 = oSub:Add( "submenu 5-3" )
oSub2 = oSub:Add( "submenu 5-4" )
oSub2 = oSub:Add( "submenu 5-5" )
oSub = oSub2:Add( "submenu 5-5-1" )
oSub = oSub2:Add( "submenu 5-5-2" )
oSub:SetCheck( .t. )
oSub = oSub2:Add( "submenu 5-5-3" )
oSub = oSub2:Add( "submenu 5-5-4" )
oSub2 = oSub:Add( "submenu 5-5-1-1" )
oSub2 = oSub:Add( "submenu 5-5-1-2" )
oSub2:SetCheck( .t. )
oSub2 = oSub:Add( "submenu 5-5-1-3" )
oMenu := oTree:Add( "Principal" )
oSub = oMenu:Add( "Imprimir..." )
oTree:Expand()
return nil
function CheckStatus( oTree, aItems, nRow, nCol )
local lActivo
local oItem
oItem := oTree:HitTest( nRow, nCol )
if oItem != NIL
lActivo:= oTree:GetCheck( oItem )
RunItems( oItem:aItems, lActivo )
endif
return nil
//----------------------------------------------------------------------------//
function RunItems( aItems, lActivo )
local n, oItem
for n = 1 to Len( aItems )
aItems[ n ]:SetCheck( lActivo )
if Len( aItems[ n ]:aItems ) > 0
RunItems( aItems[ n ]:aItems, lActivo )
endif
next
return nil
si te fijas los sub:Setcheck(.t.) NO funcionan.
Grax.
Salu2. Ariel.
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Re: Un problemita con TTreeView
Ariel
Al parecer es otro de los _ de los DIALOGOS y la forma como procesan los mensajes...
en el siguiente ejemplo en la funcion TreeUno() uso la clausula NOWAIT despues proceso los mensajes pendientes con un sysrefresh y luego es que se hace efectiva la seleccion de item
en al funcion TreeDos() uso un dialogo modal, lo hago por medio del codeblock bPainted del dialogo para activar los item solo la primera vez...
Al parecer es otro de los _ de los DIALOGOS y la forma como procesan los mensajes...
en el siguiente ejemplo en la funcion TreeUno() uso la clausula NOWAIT despues proceso los mensajes pendientes con un sysrefresh y luego es que se hace efectiva la seleccion de item
en al funcion TreeDos() uso un dialogo modal, lo hago por medio del codeblock bPainted del dialogo para activar los item solo la primera vez...
Code: Select all
// Using a TreeView with checkboxes and checking their status
#include "FiveWin.ch"
function Main()
local oWnd
local oMenu
MENU oMenu
MENUITEM "Tree 1" ACTION treeuno()
MENUITEM "Tree 2" ACTION treedos()
ENDMENU
define window oWnd menu oMenu
activate window oWnd
return nil
function treeuno()
local oTree, oDlg
DEFINE DIALOG oDlg SIZE 400, 600
oTree = TTreeView():New( 0, 0, oDlg,,,,,200,300,,.t.)
oTree:OnClick = { | nRow, nCol | CheckStatus( oTree, oTree:aItems, nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( BuildTree( oTree ) ) NOWAIT
SetInitItem( oTree )
return nil
function treedos()
local oTree, oDlg
DEFINE DIALOG oDlg SIZE 400, 600
oTree = TTreeView():New( 0, 0, oDlg,,,,,200,300,,.t.)
oTree:OnClick = { | nRow, nCol | CheckStatus( oTree, oTree:aItems, nRow, nCol ) }
oDlg:bPainted = {|| SetInitItem( oTree ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( BuildTree( oTree ) )
return nil
function SetInitItem( oTree )
if oTree:Cargo == NIL
SysRefresh()
oTree:aItems[ 1 ]:aItems[ 1 ]:SetCheck( .T. )
oTree:aItems[ 1 ]:aItems[ 5 ]:aItems[ 2 ]:SetCheck( .T. )
oTree:aItems[ 1 ]:aItems[ 5 ]:aItems[ 5 ]:aItems[ 2 ]:SetCheck( .T. )
oTree:aItems[ 1 ]:aItems[ 5 ]:aItems[ 5 ]:aItems[ 4 ]:aItems[ 2 ]:SetCheck( .T. )
oTree:Cargo = 1
endif
return nil
function BuildTree( oTree )
local oMenu
local oSub, oSub2, oSub3
oMenu := oTree:Add( "menu 1" )
oSub = oMenu:Add( "submenu 1" )
// oSub:SetCheck( .t. )
oSub = oMenu:Add( "submenu 2" )
oSub = oMenu:Add( "submenu 3" )
oSub = oMenu:Add( "submenu 4" )
oSub = oMenu:Add( "submenu 5" )
oSub2 = oSub:Add( "submenu 5-1" )
oSub2 = oSub:Add( "submenu 5-2" )
// oSub2:SetCheck( .t. )
oSub2 = oSub:Add( "submenu 5-3" )
oSub2 = oSub:Add( "submenu 5-4" )
oSub2 = oSub:Add( "submenu 5-5" )
oSub = oSub2:Add( "submenu 5-5-1" )
oSub = oSub2:Add( "submenu 5-5-2" )
// oSub:SetCheck( .t. )
oSub = oSub2:Add( "submenu 5-5-3" )
oSub = oSub2:Add( "submenu 5-5-4" )
oSub2 = oSub:Add( "submenu 5-5-1-1" )
oSub2 = oSub:Add( "submenu 5-5-1-2" )
// oSub2:SetCheck( .t. )
oSub2 = oSub:Add( "submenu 5-5-1-3" )
oMenu := oTree:Add( "Principal" )
oSub = oMenu:Add( "Imprimir..." )
oTree:ExpandAll()
return nil
function CheckStatus( oTree, aItems, nRow, nCol )
local lActivo
local oItem
oItem := oTree:HitTest( nRow, nCol )
if oItem != NIL
lActivo:= oTree:GetCheck( oItem )
RunItems( oItem:aItems, lActivo )
endif
return nil
//----------------------------------------------------------------------------//
function RunItems( aItems, lActivo )
local n, oItem
for n = 1 to Len( aItems )
aItems[ n ]:SetCheck( lActivo )
if Len( aItems[ n ]:aItems ) > 0
RunItems( aItems[ n ]:aItems, lActivo )
endif
next
return nil
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- ruben Dario
- Posts: 986
- Joined: Thu Sep 27, 2007 3:47 pm
- Location: Colombia
Re: Un problemita con TTreeView
Mi pregunta al inicial el Dialogo carga se BuildTree( oTree ) es lo que entiendo
ACTIVATE DIALOG oDlg CENTERED ON INIT BuildTree( oTree )
Como lo cargo sin usar ON INIT BuildTree( oTree )
ACTIVATE DIALOG oDlg CENTERED ON INIT BuildTree( oTree )
Como lo cargo sin usar ON INIT BuildTree( oTree )
Re: Un problemita con TTreeView
Amigos, como puedo saber cual checkbox esta activo
saludos
saludos
Re: Un problemita con TTreeView
Gracias al Cristobal Navarro. pongo el codigo completo. muchas gracuas
#include "xbrowse.ch"
Static aSelected := {}
Static oTree
//----------------------------------------------------------------------------//
Function Main()
local oDlg, oImageList, n, ncargo
local oBtt2
local oFnt
DEFINE FONT oFnt NAME "Calibri" SIZE 0, -16
DEFINE DIALOG oDlg TITLE "Tipos de Servicios" SIZE 600, 650 FONT oFnt
oDlg:lHelpIcon := .F.
@ 10, 15 BTNBMP oBtt2 PROMPT "Selecccionados" FILENAME "..\bitmaps\link.bmp" OF oDlg ;
ACTION ( aSelected := {},NewSelected( oTree:aItems ), XBrowse( aSelected ) ) SIZE 80, 32 LEFT
@ 0.5, 20 TREEVIEW oTree OF oDlg SIZE 170, 300 COLOR Rgb( 128, 128, 128 ), GetSysColor( 5 ) CHECK
oTree:nStyle += WS_BORDER
oTree:bLClicked := { | nRow, nCol, nKeyFlags | NewClick( nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( AddItems( oImageList ), oTree:Expand() )
RELEASE FONT oFnt
Return NIL
//----------------------------------------------------------------------------//
Function AddItems( oImageList )
local oItem1, oItem2, oItem3, oItem4, oItem5, oItem6
local oItem11, oItem12, oItem13, oItem14, oItem15, oItem16
local oItem21, oItem22, oItem23
local oItem31, oItem32
local oItem41, oItem42, oItem43
local oItem51
local oItem61, oItem62
local Mydate, Mytime
Mydate := DATE()
Mytime := TIME()
if !Empty( oImageList )
oTree:SetImageList( oImageList )
endif
oItem1 := oTree:Add( "LAVADOS", 0 )
oItem11 := oItem1:Add( "INTERIOR", 2)
//oItem11:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem12 := oItem1:Add( "EXTERIOR", 2)
//oItem12:Cargo :={ "CHECKBOX", 3, oItem1 }
oItem13 := oItem1:Add( "MOTOR", 2)
//oItem13:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem14 := oItem1:Add( "CHASIS", 2)
//oItem14:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem15 := oItem1:Add( "PULVERIZADO", 2)
//oItem15:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem16 := oItem1:Add( "FITOSOI", 2)
//oItem16:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem2 := oTree:Add( "NEUMATICOS", 0 )
oItem21 := oItem2:Add( "MONTAJE", 2 )
//oItem21:Cargo := { "CHECKBOX", 2, oItem2 }
oItem22 := oItem2:Add( "BALANCEO", 2 )
//oItem22:Cargo := { "CHECKBOX", 2, oItem2 }
oItem23 := oItem2:Add( "ARREGLO", 2 )
//oItem23:Cargo := { "CHECKBOX", 2, oItem2 }
oItem3 := oTree:Add( "ALINEACION", 0 )
oItem31 := oItem3:Add( "REVISION ALINEACION", 2 )//; oItem31:Cargo := { "CHECKBOX", 2, oItem3 }
oItem32 := oItem3:Add( "ALINEACION", 2 ) //; oItem32:Cargo := { "CHECKBOX", 2, oItem3 }
oItem4 := oTree:Add( "CAMBIO DE ACEITE", 0 )
oItem41 := oItem4:Add( "MOTOR", 2 ) //; oItem41:Cargo := { "CHECKBOX", 2, oItem4 }
oItem42 := oItem4:Add( "CAJA", 2 ) //; oItem42:Cargo := { "CHECKBOX", 2, oItem4 }
oItem43 := oItem4:Add( "DIFERENCIAL", 2 ) //; oItem43:Cargo := { "CHECKBOX", 2, oItem4 }
oItem5 = oTree:Add( "ENGRASE", 0 )
oItem51 = oItem5:Add( "ENGRASE", 2 ) //; oItem51:Cargo:={ "CHECKBOX", 2, oItem5 }
oItem6 = oTree:Add( "SERVICIOS VARIOS", 0 )
oItem61 = oItem6:Add( "MECANICA", 2 ) //; oItem61:Cargo:={ "CHECKBOX", 2, oItem6 }
oItem62 = oItem6:Add( "ELECTRICO", 2 ) //; oItem62:Cargo:={ "CHECKBOX", 2, oItem6 }
Return NIL
//----------------------------------------------------------------------------//
Function NewClick( nRow, nCol )
local oItem
oItem := oTree:HitTest( nRow, nCol )
if !Empty( oItem )
if Len( oItem:aItems ) > 0
AEVal( oItem:aItems, { | o | oTree:SetCheck( o, !oTree:GetCheck( o ) ) } )
endif
endif
Return nil
//----------------------------------------------------------------------------//
Function NewSelected( aItems )
local x ,oItem
For x = 1 to Len( aItems )
oItem := aItems[ x ]
if Len( oItem:aItems ) == 0
if oTree:GetCheck( oItem )
AAdd( aSelected, oItem:cPrompt )
endif
else
NewSelected( oItem:aItems )
endif
Next x
*/
Return nil
Saludos
#include "xbrowse.ch"
Static aSelected := {}
Static oTree
//----------------------------------------------------------------------------//
Function Main()
local oDlg, oImageList, n, ncargo
local oBtt2
local oFnt
DEFINE FONT oFnt NAME "Calibri" SIZE 0, -16
DEFINE DIALOG oDlg TITLE "Tipos de Servicios" SIZE 600, 650 FONT oFnt
oDlg:lHelpIcon := .F.
@ 10, 15 BTNBMP oBtt2 PROMPT "Selecccionados" FILENAME "..\bitmaps\link.bmp" OF oDlg ;
ACTION ( aSelected := {},NewSelected( oTree:aItems ), XBrowse( aSelected ) ) SIZE 80, 32 LEFT
@ 0.5, 20 TREEVIEW oTree OF oDlg SIZE 170, 300 COLOR Rgb( 128, 128, 128 ), GetSysColor( 5 ) CHECK
oTree:nStyle += WS_BORDER
oTree:bLClicked := { | nRow, nCol, nKeyFlags | NewClick( nRow, nCol ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( AddItems( oImageList ), oTree:Expand() )
RELEASE FONT oFnt
Return NIL
//----------------------------------------------------------------------------//
Function AddItems( oImageList )
local oItem1, oItem2, oItem3, oItem4, oItem5, oItem6
local oItem11, oItem12, oItem13, oItem14, oItem15, oItem16
local oItem21, oItem22, oItem23
local oItem31, oItem32
local oItem41, oItem42, oItem43
local oItem51
local oItem61, oItem62
local Mydate, Mytime
Mydate := DATE()
Mytime := TIME()
if !Empty( oImageList )
oTree:SetImageList( oImageList )
endif
oItem1 := oTree:Add( "LAVADOS", 0 )
oItem11 := oItem1:Add( "INTERIOR", 2)
//oItem11:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem12 := oItem1:Add( "EXTERIOR", 2)
//oItem12:Cargo :={ "CHECKBOX", 3, oItem1 }
oItem13 := oItem1:Add( "MOTOR", 2)
//oItem13:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem14 := oItem1:Add( "CHASIS", 2)
//oItem14:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem15 := oItem1:Add( "PULVERIZADO", 2)
//oItem15:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem16 := oItem1:Add( "FITOSOI", 2)
//oItem16:Cargo :={ "CHECKBOX", 2, oItem1 }
oItem2 := oTree:Add( "NEUMATICOS", 0 )
oItem21 := oItem2:Add( "MONTAJE", 2 )
//oItem21:Cargo := { "CHECKBOX", 2, oItem2 }
oItem22 := oItem2:Add( "BALANCEO", 2 )
//oItem22:Cargo := { "CHECKBOX", 2, oItem2 }
oItem23 := oItem2:Add( "ARREGLO", 2 )
//oItem23:Cargo := { "CHECKBOX", 2, oItem2 }
oItem3 := oTree:Add( "ALINEACION", 0 )
oItem31 := oItem3:Add( "REVISION ALINEACION", 2 )//; oItem31:Cargo := { "CHECKBOX", 2, oItem3 }
oItem32 := oItem3:Add( "ALINEACION", 2 ) //; oItem32:Cargo := { "CHECKBOX", 2, oItem3 }
oItem4 := oTree:Add( "CAMBIO DE ACEITE", 0 )
oItem41 := oItem4:Add( "MOTOR", 2 ) //; oItem41:Cargo := { "CHECKBOX", 2, oItem4 }
oItem42 := oItem4:Add( "CAJA", 2 ) //; oItem42:Cargo := { "CHECKBOX", 2, oItem4 }
oItem43 := oItem4:Add( "DIFERENCIAL", 2 ) //; oItem43:Cargo := { "CHECKBOX", 2, oItem4 }
oItem5 = oTree:Add( "ENGRASE", 0 )
oItem51 = oItem5:Add( "ENGRASE", 2 ) //; oItem51:Cargo:={ "CHECKBOX", 2, oItem5 }
oItem6 = oTree:Add( "SERVICIOS VARIOS", 0 )
oItem61 = oItem6:Add( "MECANICA", 2 ) //; oItem61:Cargo:={ "CHECKBOX", 2, oItem6 }
oItem62 = oItem6:Add( "ELECTRICO", 2 ) //; oItem62:Cargo:={ "CHECKBOX", 2, oItem6 }
Return NIL
//----------------------------------------------------------------------------//
Function NewClick( nRow, nCol )
local oItem
oItem := oTree:HitTest( nRow, nCol )
if !Empty( oItem )
if Len( oItem:aItems ) > 0
AEVal( oItem:aItems, { | o | oTree:SetCheck( o, !oTree:GetCheck( o ) ) } )
endif
endif
Return nil
//----------------------------------------------------------------------------//
Function NewSelected( aItems )
local x ,oItem
For x = 1 to Len( aItems )
oItem := aItems[ x ]
if Len( oItem:aItems ) == 0
if oTree:GetCheck( oItem )
AAdd( aSelected, oItem:cPrompt )
endif
else
NewSelected( oItem:aItems )
endif
Next x
*/
Return nil
Saludos
Re: Un problemita con TTreeView
Con permiso de Jose, adjunto mi código

Code: Select all
#Include "FiveWin.ch"
Static aSelected := {}
Static oTree
//----------------------------------------------------------------------------//
Function Main()
local oDlg, oImageList
local oBtt1
local oBtt2
local oBtt3
local oFnt
DEFINE FONT oFnt NAME "Calibri" SIZE 0, -16
DEFINE DIALOG oDlg TITLE "Tipos de Servicios" SIZE 600, 650 FONT oFnt
oDlg:lHelpIcon := .F.
@ 07, 05 BTNBMP oBtt1 PROMPT "Seleccionados" FILENAME "..\bitmaps\link.bmp" OF oDlg ;
ACTION ( if( Empty( oImageList ), NewSelected( oTree:aItems ), Selected( oTree:aItems ) ), ;
XBrowse( aSelected ) ) SIZE 80, 32 LEFT ;
COLOR CLR_WHITE, Rgb( 160, 160, 160 ) ;
FLAT PIXEL NOROUND NOBORDER // TRANSPARENT
@ ( oDlg:nHeight / 2 ) - 40, 05 BTNBMP oBtt2 PROMPT "Salir" FILENAME "..\bitmaps\exit.bmp" OF oDlg ;
ACTION ( oDlg:End() ) SIZE 80, 32 RIGHT ;
COLOR CLR_WHITE, Rgb( 160, 160, 160 ) ;
FLAT PIXEL NOROUND NOBORDER // TRANSPARENT
oImageList := TImageList():New( 16, 16 )
oImageList:Add( TBitmap():Define( "conex_off1",, oDlg ) , TBitmap():Define( "conex_off",, oDlg ) )
oImageList:Add( TBitmap():Define( "conex_on1",, oDlg ) , TBitmap():Define( "conex_on",, oDlg ) )
oImageList:Add( TBitmap():Define( "conex_work",, oDlg ), TBitmap():Define( "conex_fet",, oDlg ) )
@ 0.5, 15 TREEVIEW oTree OF oDlg SIZE 205, 310 COLOR Rgb( 128, 128, 128 ), GetSysColor( 5 ) //CHECK
oTree:nStyle += WS_BORDER
oTree:bLClicked := { | nRow, nCol, nKeyFlags | if( Empty( oImageList ), ;
NewClick( nRow, nCol ), ;
MyClick( nRow, nCol ) ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( NewAddItems( oImageList ), oTree:Expand() )
RELEASE FONT oFnt
Return NIL
//----------------------------------------------------------------------------//
Function NewAddItems( oImageList, nImg1, nImg2 )
local x
local y
local oItem
local oItem1
local aItems := { "LAVADOS", "NEUMATICOS", "ALINEACION", "CAMBIO DE ACEITE", ;
"FILTROS", "ENGRASE", "SERVICIOS VARIOS" }
local aSubItems := { { "INTERIOR", "EXTERIOR", "MOTOR", "CHASIS", "PULVERIZADO" }, ;
{ "MONTAJE", "BALANCEO", "ARREGLO" }, ;
{ "REVISION ALINEACION", "ALINEACION" }, ;
{ "MOTOR", "CAJA", "DIFERENCIAL" }, ;
{ "ACEITE", "CARBURANTE", "CAJA CAMBIOS", "AIRE", "HABITACULO" }, ;
{ "ENGRASE" }, ;
{ "MECANICA", "ELECTRICO" } }
if !Empty( oImageList )
oTree:SetImageList( oImageList )
DEFAULT nImg1 := 0
DEFAULT nImg2 := 0
else
DEFAULT nImg1 := 0
DEFAULT nImg2 := 0
endif
For x = 1 to Len( aItems )
oItem := oTree:Add( " " + aItems[ x ], nImg1 )
For y = 1 to Len( aSubItems[ x ] )
oItem1 := oItem:Add( " " + StrCapFirst( aSubItems[ x ][ y ] ), nImg2 )
oItem1:Cargo := aSubItems[ x ][ y ]
Next y
Next x
Return nil
//----------------------------------------------------------------------------//
Function MyClick( nRow, nCol, lInv )
local oItem
local nImg
DEFAULT lInv := .T.
oItem := oTree:HitTest( nRow, nCol )
if !hb_IsNil( oItem )
nImg := if( oItem:nImage = 0, 1, 0 )
oItem:Set( , nImg )
oItem:nImage := nImg
if hb_IsNil( oItem:Cargo )
if Len( oItem:aItems ) > 0
if lInv
AEVal( oItem:aItems, ;
{ | o | if( o:nImage = 1, ( o:Set( , 0 ), o:nImage := 0 ), ;
( o:Set( , 1 ), o:nImage := 1 ) ) } )
else
AEVal( oItem:aItems, ;
{ | o | o:Set( , oItem:nImage ), o:nImage := oItem:nImage } )
endif
endif
endif
endif
return nil
//----------------------------------------------------------------------------//
Function Selected( aItems )
local x
For x = 1 to Len( aItems )
oItem := aItems[ x ]
if Len( oItem:aItems ) == 0
if oItem:nImage == 1
AAdd( aSelected, { oItem:cPrompt, oItem:nImage } )
endif
else
Selected( oItem:aItems )
endif
Next x
Return nil
//----------------------------------------------------------------------------//
Function NewClick( nRow, nCol )
local oItem
oItem := oTree:HitTest( nRow, nCol )
if !Empty( oItem )
if Len( oItem:aItems ) > 0
AEVal( oItem:aItems, { | o | oTree:SetCheck( o, !oTree:GetCheck( o ) ) } )
endif
endif
Return nil
//----------------------------------------------------------------------------//
Function NewSelected( aItems )
local x
For x = 1 to Len( aItems )
oItem := aItems[ x ]
if Len( oItem:aItems ) == 0
if oTree:GetCheck( oItem )
AAdd( aSelected, LTrim( oItem:cPrompt ) )
endif
else
NewSelected( oItem:aItems )
endif
Next x
Return nil
//----------------------------------------------------------------------------//

C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.