52:
Is there a way to define a default Editor which is assigned to each node when the string is loaded (method 2)

PROCEDURE OnSelectionChanged(oXMLGrid)
	/*SelectedNode(0).Editor = "edit"*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:SelectionChanged := {|| OnSelectionChanged(oXMLGrid)} /*Fires when the user changes the selection.*/

		oXMLGrid:Editors():Add("edit",1/*EditType*/)
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNode:Picture := "pic1"
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
				oNodes:Add("Child <b>3"):Value := 103
			oNode:Expanded := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
51:
How can I specify a default editor

PROCEDURE OnAddNode(oXMLGrid,NewNode)
	/*NewNode.Editor = "calc"*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:AddNode := {|NewNode| OnAddNode(oXMLGrid,NewNode)} /*Occurs when a node is added to the nodes collection.*/

		oXMLGrid:Editors():Add("calc",20/*CalculatorType*/)
		oXMLGrid:LoadXML("<numbers><first_number>100</first_number><second_number>200</second_number></numbers>")
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
50:
Is there a way to define a default Editor which is assigned to each node when the string is loaded (method 1)

PROCEDURE OnAddNode(oXMLGrid,NewNode)
	/*NewNode.Editor = "edit"*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:AddNode := {|NewNode| OnAddNode(oXMLGrid,NewNode)} /*Occurs when a node is added to the nodes collection.*/

		oXMLGrid:SetProperty("SelForeColorChild",AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
		oXMLGrid:Editors():Add("edit",1/*EditType*/)
		oXMLGrid:LoadXML("http://www.exontrol.net/testing.xml")
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
49:
How can I assign editors to nodes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oEditor,oEditor1,oEditor2
	LOCAL oEditors
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AllowDuplicateEntries := .T.
		oEditors := oXMLGrid:Editors()
			oEditor := oEditors:Add("name",1/*EditType*/)
				oEditor:Appearance := 4/*EtchedApp*/
			oEditor1 := oEditors:Add("phone",8/*MaskType*/)
				oEditor1:Mask := "(###)-######"
				oEditor1:Appearance := 4/*EtchedApp*/
			oEditor2 := oEditors:Add("date",7/*DateType*/)
				oEditor2:Appearance := 4/*EtchedApp*/
		oNode := oXMLGrid:Nodes():Add("Customer")
			oNode:Picture := "mihai"
			oNodes := oNode:Nodes()
				oNodes:Add("Name","Mihai Filimon"):Editor := "name"
				oNodes:Add("Phone","(0744)-845287"):Editor := "phone"
				oNodes:Add("BirthDay","12/31/1971"):Editor := "date"
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,82)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
48:
I use LoadXml, then inside onNodeAdd event, I add the picture. But the picture doesnt show up. Does the picture have to be a bitmap

PROCEDURE OnAddNode(oXMLGrid,NewNode)
	/*NewNode.Picture = LoadPicture("c:\exontrol\images\colorize.gif")*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:AddNode := {|NewNode| OnAddNode(oXMLGrid,NewNode)} /*Occurs when a node is added to the nodes collection.*/

		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
				oNodes:Add("Child <b>3"):Value := 103
			oNode:Expanded := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
47:
How can I assign a picture to a node ( method 3 )

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:SetProperty("HTMLPicture","pic1","c:\exontrol\images\zipdisk.gif")
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNode:Picture := "pic1"
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
				oNodes:Add("Child <b>3"):Value := 103
			oNode:Expanded := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
46:
How can I save the control's content using a different version of XML DOM
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL d
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		d := CreateObject("Msxml2.DOMDocument.3.0")
		oXMLGrid:LoadXML("<customer><first_name>Joe</first_name><last_name>Smith</last_name></customer>")
		oXMLGrid:SaveXML(d)
		DevOut( d:xml() )
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
45:
How can I load the control's content using a different version of XML DOM
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL d
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		d := CreateObject("Msxml2.DOMDocument.3.0")
			d:async := .F.
			d:loadXML("<customer><first_name>Joe</first_name><last_name>Smith</last_name></customer>")
		oXMLGrid:LoadXML(d)
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
44:
How can I get the XML string from the control's content
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL d
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		d := CreateObject("MSXML.DOMDocument")
		oNode := oXMLGrid:Nodes():Add("Root")
			oNode:Image := 1
			oNode1 := oNode:Nodes():Add("Child1")
				oNode1:Image := 2
				oNode1:Value := "Value <b>1"
			oNode2 := oNode:Nodes():Add("Child2")
				oNode2:Image := 2
				oNode2:Value := "Value <b>2"
		oXMLGrid:ExpandAll()
		oXMLGrid:ResizeToFit(0)
		oXMLGrid:SaveXML(d)
		DevOut( d:xml() )

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
43:
How can I load the control from a XML DOM object

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL d
	LOCAL oIXMLDOMNamedNodeMap
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		d := CreateObject("Msxml2.DOMDocument.3.0")
			d:appendChild(d:createElement("Root"))
			oIXMLDOMNamedNodeMap := d:childNodes():item(0):attributes()
				oIXMLDOMNamedNodeMap:setNamedItem(d:createAttribute("Item-1"))
				oIXMLDOMNamedNodeMap:item(0):value := "value <b>1"
				oIXMLDOMNamedNodeMap:setNamedItem(d:createAttribute("Item-2"))
				oIXMLDOMNamedNodeMap:item(1):value := "value <b>2"
		oXMLGrid:LoadXML(d)
		oXMLGrid:ExpandAll()
		oXMLGrid:ResizeToFit(0)
		DevOut( d:xml() )

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
42:
How can I load XML from http or URL

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:LoadXML("http://www.exontrol.net/testing.xml")
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
41:
How can I load XML from a supplied string

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:LoadXML("<customer><first_name>Joe</first_name><last_name>Smith</last_name></customer>")
		oXMLGrid:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
40:
How do I programatically search for a node
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
		oXMLGrid:Nodes():Add("Parent 3")
		oXMLGrid:Search("Child 1",-1):Selected := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
39:
How can I show the control's selection using your EBN technology

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oAppearance
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oAppearance := oXMLGrid:VisualAppearance()
			oAppearance:Add(1,"gBFLBCJwBAEHhEJAAChABUgIg6AADACAxRDQNABQKAAzQFAYaBiG6GAAGIYxWgmFgAQhFcZQSKUOQTDKNYykCIRSDUJYkSZEIyjAIoBQSGYZAIkGY4ah2A42RhNETyHDkUx7E6EZToCA6ChGOozThOEgUOAsExRIaJJ6oSTJAjGR46UjHdTwHCNHyfEAZZSqSaqLhuEYuQLZNZ1dL9KzFFqyIRQaK0IgmaI5VrFVqTPSQASLIKWKKjObIarOA53XjFd51DSFBTuGIYaZxGZYeqmeZdT7Xcr2fZUdw2EinIRFeqsHglbQcaBpegXVjNWw5N7EMDuKCdLACdYDaLlWiwHpQAZ7Vi+KgkXDcBwCUIhYQAGy4MAGcwvO7ed70HgOGoBxhmMZxilmW48Eca4TmmYw6jELYFkYB5MjubZ5F2fBWjeKZGjeYIkF4C4/DOPZrm0QhBBCEoBiSRh0B0RwhhQMRIAGYQtAMEIElgFQaEUUAwiECR6FyZAgBgRZOgE" +;
		"KZfAkAZDjYGIGiGGBuB6BxiAgcgigeYg4gYJIJmIaIkm0PpikiNJ1guYwDjYMoMk6GJWDaDZjFOIg6g6Y4zioPoPk8KQGEIPgkEkFJ+hGZIIiIJYSmSKQ2CqE4kkkPhShQZRJEIVoUmUeRWFiFplikdhZheZZJgIXoYGIGI2GaCwOGmJhqDOZpJjSOobmcAoWHKHJJmmVh2CeZ4JmSIoemeSZ2H6H5nnKBoCiCZxpliHYhmiCgOgMLQokoNJJiOaQDHKEokmISQiEmGQmDoZhiiaaYKHKGonGoCh+iKJ4qEiKJ5imaoDGqKoqksao2i4KQrAqRoxh+SpqlaNgwiuCpkliLprkOCo+i+ThLAaQoOA6GJ+4gbIIn4PIOg4Ow2k6L5rnMVpSjSS57FaVgqm2CxmHmNptkKNpejeZpbgYbIyCYc5uiWKJqBuHpqjobpLiKbo6mSM4unKPJLjuVp2CgL4LmSKo+m+ShChCNAwAOUwCkCTx8BcBpAnAOQKEIPB" +;
		"wkwNwOkMDwMEcEpEnETBXBaRQwnwZJxkKJAYkIMIRGQXBwnIN5yEyFJFkmcoJk8KocgmTI3C4LAzJrSpPlyVw2jwM4LjcOY7nOLJ3DyFQOF0BwxiyKwDCMRpRmyA5bEqUpwgwCwihCMR9EcUpUnUTRXFaVZ1FyCwegudI9HcSoaiaIwDGKWNuCCMpZnaAwzGqWpzj2Nw+luM59kKZ4LGqHkOIpRdieD2M4eorwPDZAsLEX48AOAPAKMEeAmhbD1F6OsY4fwKjFHaHwN4HQ3ATHMJ9SA4wTjnVIO4LYfwai4HmHQewRAvh0AoB4DYlALi9BYJERqewnhVGqPUTob2OD2A6I8Mo2RwvUCCCINgEwkiVG6PcQoH21iUH8A8QocQMjnDuI0cY9h8gFBaCMeYPBzidHMMQSInAzBeD0J4V4fxvjsDIG8WoiQ0D9BSHsKgdhPgPGKPEfgnwXjNGsOofgPh5iDDAN8KI5gzh+A+I4RAUgoCzFSG8fY/wPjBFSP0" +;
		"f4nhKBkHkFwXYlw8hjHyOgHI1QhDiHAEMRQeBBCmAMEAaoFBQCGBIBEQQUASB3FoLEFYBRuBbG6HQV4gR5jBGwD0A44QCAhEGM8WIghZAmDMKQQozAUiFCgKkH4rxKjyBWOEQhsx4DOA0CsYoeBoBhGAOUQQjQaB6B4JUZQiwwAMCCHId4JRWiPCsCoWQxwhj8D+IsbIeweAnEKAsUQghbBWGiokXgdxIDtGwMsRYghxBWAYLQM4QAXiHGoGEQgURHAyCMFgZoGRvh0CKFUCIrQpiyBCLMDY4xCASEEEsMobBfhRB6AMYoCxrh3GSP0SoigsCdA+OQAggBHixHQFEY4hguDLFGOsaoehWjeCMA0EI2QRjkEIJARi7w+g3GONwdYGBKBbEWKMEQLxkg2E+CccoBBQiUCkI4KQSgshNBSOUIgqRKhMDkDMXwJxuDfBCCAe4jRBjmBEKwconAajlGILkLQawmjHAYMcPILxu0fEwFMBwYgmAnBMOQYwtBki" +;
		"ZCYJUSQsRMhmHkFscgPAwgyFcFAJImAYDiE0DwTojAZhSDcE0bIvQbjnAIOETgUhWjyCUJgaQ1hyiMFiHkGYrg7A8EyNMBIJBZjqE4HMRQawisaAuJ0AgnhPBzHcH4J42VoDnBGOMUAFAHTBCyOsEw5hoD6FALQFwhgoDaA6EMdAhQIiiCaEERAyRUjuBkBYWQLRRB0DcI4KI2gehHHSAQfoYRaBYmIHoGQiwUgNBSKUKgrhLBSG0CEJA5heglDQNQTgfRfDqDaE0dIxQcinOEJ4KaZwnjqWqKgGguhLBUBUI0KI6llimAmNoTIURCiqHKOoJoURVBVCdm0LQjwogpC6FYVYVQ2j3BICoJISRVB7EsKsSojhZBWC0M0LI6RiDeFaBUV1FwdC9CYGsAAvw5DzCULoK4Wh2hdHWMUPIrwqjuF8FcbQ/QvjaDaG0WAVRPDACwFsBoYR1i1DeKkRoHRYizDWBEMY7BCiR0KE4Xo2AdgtCwOwUomRZhMAaL0B" +;
		"IawegmHYGsGosw7COGkFoLYTQ0jsHKEkWoFhXDWCyEsHYZx0C9FCB8WwthtBbC2G0NYahGi3FuFYdwuhtDxBaCYYwDRghJAiBYcQXAtiNDiO6+ouQrguHMFwbYnb+B9F4LoKwFh0BdC2K0OsKgBizGsP4RY3AIiDDgO4Yo4ReBXEcPILwWxmh5GiIURAvQLiuHsF4bYqw7CtEKE0XY1xBD3C+FsdofR3jFyEFccw/gvjbGOHwFw5R5C4BGP8AQNxmN5HgEYBIwQsAvAMGAbgHRBjwEMBEYQNx9gKC8MwEohR4DGAyMEVAwh2jcAYAcQIcBrAhGIFgR4EgxBcBfFsIsaxsCvAt1wHIfAtA9G8MAQY/wLDjC4G0Ro8RjA5GCBcQ4HQxjcD7woPwAQ0DqHOBkZw/BGiRHkEYJIyQsgvBMGQbgnRJjyEMEkY4+QngcHKBwVs5xjBHDSHgOwixyBMASJYOYBgwjMCyI8GQZBmCpEyPEVwZdECtEGGUXgYBoiy" +;
		"HgP8ZomRng6DOFwdonR5huA0M8DI7wfBmC4N0SAmgYBhhoAsBnA7ONgGhQh6AjBEhogtAXgjA0BugOhRh5h3BIhnBNAfglA0gugWhQgsAbAuBUhdAEAwh0AmgXhTh6gDBQhqM4giB0gWgmhNBagTBUhqgkgLgmBzB4hIhTgaB7BVhrAtBnrSgug2AfAZBnBbhrgtB3gpA1BugAhVh6APACBrhNgHgxA2Aug8r0AbBkhsgphZgvgkhegwhAgShPBot4gng1A2guhWhah7BjBshtgtg3g3A2hmhLhbh6BTBupkhHg5POBNgih7A8B/huBdhXg7A3Buhuhdh7hDB4hGg9Avg8oiB2heh7gLBzhpg9gDg6g3hGh+hfh8ADgAhvAdhpu/gvAGhdg7hpgjhBAsBnu0hvAOhhh8BDgIuDgng3gSAggXhihyBvgFjmgphHA4hvAevggDgQhtBUgLhFhEg/AZgCHaARByguBXhLA5BvAuhdg8gTgMBRB+A0A/hkgn" +;
		"Q8h8hjgchzguB3r9hvA+hnh9ADgguNgHhOg5B/AghogdAjgkh0guB+gqA5AvAnAYgYhPglh1AugnhVA6gvBWhpA9AbgPh1B+g3hXA5g/BNhmBVA3gaB1hehHhZA7AvBmhsh9Oqh2gOhXhbA7AfBfhkhOApgUBTBNhBhdA7gugrgIBTA/g7B3guh3glgYSFBvhqggBwh4Auh+AmAjhHgGhwh+AjhEh4gvAXhjA8BvgOhxh+BDvZAvAVAhAjhEB2hyB+BjhMh5gvA3hnA8hvgeAUAsg4BZh6AkBaBABACAg")
			oAppearance:Add(2,"gBFLBCJwBAEHhEJAEGg4BFIDg6AADACAxRDAMgBQKAAzQFAYahsGCGAAGIYxUgmFgAQhFcZQSKUOQTDKMIziYBYfgkMIgSbJUgDGAkRRdDSOYDmGQYDiCIoRShOMIjHLUXxtDaIZwhEAoJb+RgAUY/cTzaAEUwHHiTKInaCQGhsCYJUJAdRURQ9EwvCIZBpEWwLChENQwWLCNj2TScBwjCyqbale45ViqdoDU8lORLUi+M4zSBPcZVTRtGShPDBKTjMKKYgkG4lVpRNa0PC1GTzQ6mazkKQLRADDIDVbAeL3LiMBy9LyLLItSIrFqqaJma7ccgRDj4AY7Ua+czufBZbozOqDYzAey7TDWLRXFDNIzzTgQAyHHrETbHGqzFxMAEa5YGqYpVj2HwzDuQ5oHKIQgggSRAlIYw6B0ThGFGDIAFUDAhBMfZRiGNAkFECZnG4IQdneJwmnsSQrGAAhWAIJBJBIQgFCQIBiEIAglgqYo0i4V4MEgRI9gSToYFS" +;
		"b4Fk6Y4+BmBZhFOJgTC8TBogQAArgqco4muCZOkOMJtgmYpIjYKg7GKE4uCUK4AAKKg2DwI4DiCZw5k6KJ2D6D4OHiag4DwIxiiQAArAqMosnEPBPAOIhOg+DozjIJ4PGSY4iEwPAkhKLhHUUSQsnKFCnkYU9MjORhcCsAAIACLQ8iaSJ6FKC5jJoaobA8KYoACCRKnmMJzhuDpZnSboMCKGJ4nMPIPDmYAACwKIDk6CoLCeU40m6I5oliMoKDyaICokLIpgoThviOKJoGYf4KmUKhMjMLJLCAAojCyaYoiYGoGmqM46CkOwPEoKonAACxKlSdItmiWBeBeDgrioNo3D0KxSlAAAtgsUpYnUPRPEoco8hCa+T40SxbBRj5tEsHJ1i6JhbGYS4ug8awelQLZAAKZI5C4DxrhYQ9ehmUppWiA48nAPRuFKYpiAAC47laZQ9iuKZSgOPotkuFI7C6C4gACPJAm8eQOhOQZoikDp3kCS5AACPoEk8fBGnqQg" +;
		"pDOSppD2TxjlyPZD6CfwekQTx5lKP5ImseZTCAL5MAMhZKEwA5jC6SIyEqfh0kuD4MjAAAwcwBw0iKDwjlKVozmyChPDSThyiMDxGk6awbB6XY1iwfQInkPg0GMEAADEdRDmcVovm8ex3FkPJrH0WJ5w4UAAkcMYMHOaxmjGTxNGcao1jWbYMkcAAMk2RJ7lycxMgMdpEHMTZMnuXBM7uMAOAG1jAED8HAQ47wGjDHgPwEI+RggcGOAmAAqxDj8DoHMTY3BUi7GWPOCAKg3jIBOEIXggBAEBA")
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:SetProperty("SelBackColor",0x1000000)
		oXMLGrid:SetProperty("SelForeColor",-1)
		oXMLGrid:SetProperty("SelBackColorCollapse",0x2000000)
		oXMLGrid:SetProperty("SelBackColorChild",-1)
		oXMLGrid:SetProperty("SelForeColorChild",-1)
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
			oNode:Expanded := .T.
			oNode:Selected := .T.
		oNode1 := oXMLGrid:Nodes():Add("Parent 3")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child <b>1"):Value := 103
				oNodes1:Add("Child <b>2"):Value := 104
		oXMLGrid:Nodes():Add("Parent 4")
		oXMLGrid:EndUpdate()
		oXMLGrid:SetProperty("LevelWidth",0,96)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
38:
Is it possible to assing a picture to a node (method 2)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:SetProperty("HTMLPicture","pic1","c:\exontrol\images\zipdisk.gif")
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
			oNode:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"left[18],client[text=`<img>pic1</img>`,align=0x20]")
			oNode:Expanded := .T.
		oNode1 := oXMLGrid:Nodes():Add("Parent 3")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child <b>1"):Value := 103
				oNodes1:Add("Child <b>2"):Value := 104
			oNode1:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"left[18],client[text=`<img>pic1</img>`,align=0x20]")
			oNode1:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,"right[4],client[text=`<img>pic1:19</img>`,align=0x12]")
		oXMLGrid:Nodes():Add("Parent 4")
		oXMLGrid:EndUpdate()
		oXMLGrid:SetProperty("LevelWidth",0,96)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
37:
Is it possible to assing a picture to a node (method 1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:SetProperty("HTMLPicture","pic1","c:\exontrol\images\zipdisk.gif")
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNode:Picture := oXMLGrid:HTMLPicture("pic1")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
				oNodes:Add("Child <b>3"):Value := 103
			oNode:Expanded := .T.
		oXMLGrid:Nodes():Add("Parent 3")
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
36:
I get "The key already exists" when adding a new node. What can I do ( method 2 )
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oNodes := oXMLGrid:Nodes()
			oNodes:Add("Item",,"Key1")
			oNodes:Add("Item",,"Key2")
			oNodes:Add("Item",,"Key3")
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
35:
I get "The key already exists" when adding a new node. What can I do ( method 1 )
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AllowDuplicateEntries := .T.
		oNodes := oXMLGrid:Nodes()
			oNodes:Add("Item")
			oNodes:Add("Item")
			oNodes:Add("Item")
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
34:
How can I mark the node only, without its child

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
			oNode:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"top[20,frame=RGB(0,0,0),framethick]")
			oNode:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,oNode:BackgroundExt(-1/*exExpandBackgroundExtState*/))
			oNode:Expanded := .T.
		oXMLGrid:Nodes():Add("Parent 3")
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
33:
How can I mark the entire node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oXMLGrid:Nodes():Add("Parent 1")
		oNode := oXMLGrid:Nodes():Add("Parent 2")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
			oNode:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"[frame=RGB(0,0,0),framethick]")
			oNode:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,oNode:BackgroundExt(-1/*exExpandBackgroundExtState*/))
			oNode:Expanded := .T.
		oXMLGrid:Nodes():Add("Parent 3")
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
32:
How can I specify aditional information for a node, when it is expanded

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNode1 := oNodes:Add("Child <b>1")
					oNode1:Value := 100
					oNode1:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,"top[2],bottom[2],left[2],right[2],client[pattern=6,frame]")
				oNodes:Add("Child <b>2"):Value := 102
			oNode:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"top[4],bottom[4],left[17],right[4],client[text=`<font ;6><fgcolor A0A0A0>Count: 2`,align=0x20]")
			oNode:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,"top[4],bottom[4],left[4],right[4],client[text=`<font ;6><fgcolor A0A0A0>Count: 2`,align=0x02]")
			oNode:Expanded := .T.
		oXMLGrid:ResizeToFit(0)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
31:
Is it possible to show aditional information for a node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AlignChildContent := .T.
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 102
			oNode:SetProperty("BackgroundExt",-1/*exExpandBackgroundExtState*/,"top[4],bottom[4],left[4],right[4],client[text=`<font ;6><fgcolor A0A0A0>Count: 2`,align=0x02]")
			oNode:SetProperty("BackgroundExt",0/*exCollapseBackgroundExtState*/,oNode:BackgroundExt(-1/*exExpandBackgroundExtState*/))
			oNode:Expanded := .T.
		oXMLGrid:ResizeToFit(0)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
30:
How can I hide the expanding bars under each parent node (method 2)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:SetProperty("Background",0/*exExpandButtonUp*/,-1)
		oXMLGrid:SetProperty("Background",1/*exExpandButtonDown*/,-1)
		oXMLGrid:AlignChildContent := .T.
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNode1 := oNodes:Add("Child <b>2")
					oNodes1 := oNode1:Nodes()
						oNodes1:Add("Sub Child <b>2.1"):Value := 101
						oNode2 := oNodes1:Add("Sub Child <b>2.2")
							oNodes2 := oNode2:Nodes()
								oNodes2:Add("Sub Child <b>2.1.1"):Value := 101
								oNodes2:Add("Sub Child <b>2.2.2"):Value := 102
							oNode2:Expanded := .F.
					oNode1:Expanded := .T.
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
29:
How can I align the child nodes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:AlignChildContent := .T.
		oNodes := oXMLGrid:Nodes()
			oNodes:Add("Parent A"):Value := 100
			oNode := oNodes:Add("Parent B")
				oNodes1 := oNode:Nodes()
					oNodes1:Add("Child<font ;6><off -4><b>1"):Value := 101
					oNodes1:Add("Child<font ;6><off -4><b>2"):Value := 102
					oNode1 := oNodes1:Add("Child<font ;6><off -4><b>3")
						oNodes2 := oNode1:Nodes()
							oNodes2:Add("Node<font ;6><off -4><b>1"):Value := 103
							oNodes2:Add("Node<font ;6><off -4><b>2"):Value := 104
				oNode:Expanded := .T.
				oNode:Selected := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
28:
How do I change the control's visual appearance using the UI Visual Designer
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AllowDuplicateEntries := .T.
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:SetProperty("GridLinesColor",AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
		oNodes := oXMLGrid:Nodes()
			oNode := oNodes:Add("Parent A")
				oNodes1 := oNode:Nodes()
					oNodes1:Add("Child<font ;6><off -4><b>1"):Value := 100
					oNodes1:Add("Child<font ;6><off -4><b>2"):Value := 101
					oNode1 := oNodes1:Add("Child<font ;6><off -4><b>3")
						oNodes2 := oNode1:Nodes()
							oNodes2:Add("Node<font ;6><off -4><b>1"):Value := 102
							oNodes2:Add("Node<font ;6><off -4><b>2"):Value := 103
				oNode:Expanded := .T.
				oNode:Selected := .T.
			oNodes:Add("Parent B"):Nodes():Add(Transform(1,""))
		oXMLGrid:SetProperty("LevelWidth",0,96)
		oXMLGrid:VisualDesign := "gBFLBWIgBAEHhEJAEGg6oBUHSTNAgAA8IZ7/jEZf78jUZicKAYOhULB8jAQxhEaGUjAkfhcICIgg4vAUHgRCJ0MkcInQBC01ACAADACAxRDAMgBQKAAzQFAYahmG6GAAGEZhYgmFgAQhFcZQSKUOQTDKMIziaQIRDINQlSTJcQjKKEUQTFiXIyAKKwEgmEQMQiCcbzXIUBxAAqXZZFUaKAg2Qg4TLBAzUTCQbR7HieQghGoqPpWF4gAhCJQGSYZaDqOQyRhkCC4DIITZkRbTUBiRSdWx8AAMIyiGpoJbudjyXg6V5OTblez9P7AMBvS6nKrhcp2PrhTSYWr+Gp5R7IMhyLI8Uw/DS/Yq1GDYIiuOoIQhCUD0LQ9EyXJqnaIzmgXJqFcCR9lUMZYGwFgCnUdJAF4bY3BsfZOnMd4+l0bR2CwHRWAMRpEGEL5WmsRYPCkZZNmeLQ5l0HoHEuJIxmOL50HgBAWgmDpEGGLJWAqbwPg+RZkH+eg9D4Txfhu" +;
		"RZeGGdwQH2PQTCmDpFFaKoVB+D5Xmed5pHoX44AWfR+F8UwVnEdpdkMMJKDIChygyIQpAoEh4iIJ5JlgTIcH+XoIFoEwnGEAh6A0KBgiMIICHdRgIlAM4MlKAIcCaIYIjYLoLGKIhqCcMxiTgJQ1A0IxEhsJgJFiPg+guI4yFYOA0GMWIUloNhNGIaIXCUI5CE4SwkEkchMhGCxlBkQIUCQZJZCiFIRk0aQVH8IBmAOBJeDcZJYmyFgnAmAhaGaCxmGmIhqhoZJZgiXYYAgFgCHQOYOFOEITCQCJpCyEoTW6NoACUZJiFCEoekiaZgmSHQXlYEh0DuDpTjCDQiEgchAg0IpJBoXoZiYKYqHaHAimkYguhMIZpAOMh0GEGBmg6JYqmkGowmyK4rAqNoyDsGg2BmCApCuAgNh8agrkqdYkGea4ChGCBAEAoAAJig4YqAm6cp2hKegwoChKIoykKUpinKgqSqKsrCtK4rywLEsizLQtS2LcuC5Louy8L0vi" +;
		"/MAwTCMMxDFMYxzIMkyjLMwzTOM80DRNI0zUNU1jXNg2TaNs3DdN43zgOE4jjOQ5TmOc6DpOo6zsO07jvPA8TyPM9D1PY9z4Pk+j7Pw/T+P9AEBQJA0EQVBkHQhCUKQtDENQ5D0QRFEkTRRFUWRdGEZRpG0cR1HkfSBIRFmSc55yQXxfHmB5cEGdp0EyJg7BUWoqFQfY/B8f5PnOd5+H6EAB4mRFD3F2G4cImAygZAKDkIwUBKCFASDwKIExyDsBAE4IQcBUg/AUEIGAaQegFAoDAHIkAgg7EgCkAgaAMjGDSEBcIRx+BVAqMUSKmgKjEHINQJCoQCAUCIqVU6qVVqtA+MdWKs1agRVwrpXivlgLCWIJwUIKQlAyE4KAJQEgZBsEoEoJA5haCKF+JAGYCRhBvA2LINgdglgTEIMEFoMxmiTCoM8GgzQ5hUE2DETYswEgCGAE4Y4MRlByAkGQQIHS3BSDaAQJQkg6AdAWEIKAEx0gdB6BwSYsh9DCkIHE" +;
		"bQdgIikCSA5fQpAsgjCYNMOg1QchPGmygGDJhSA9BIHYJwzARgMGiNQeobQThXA6JUQoZQrjWEOGMIwwwYgFBKHQIIsx2hFD6F8WgjB+h0CkDEBACABkwJkAAKc4QANbJ010noOpzNiKKUcpJSymlPGoHIGDawRiBEI24rpXywljLKWcYAWB+AkDCCASYyRSADBgCQRQXQNCOGAOYGQGAOCCCKBESgTgwgjByNQXwbQNiIGcCEEAKAli0BwCQAAURUgRDSOgAU5RPBJFQJMdASAjA2AoIQaAoA6g6CaB4XYSxWDHAMKILAiBlDHAiBoRgLBICbCaK4VIAxEDFFUNcBIfRrBrBULwIA6RwABE4JIdoLxMjMHIBMfA1Q1CdCaKgbwsBIh8CwEIYYAwEjJDWHQLQ9QVgZDyMMZw5QKjJAoIIcwABjhAHWBkBgkABC5EsYsVgtg9gVFwAENotAtCuBiLkAgRwhAAGeOQN48h1BtHeBMTItxijoBgJ0Xw7gai" +;
		"9EqOYdwuR2B4AGEcUA4wmj1F0L0OwwhsiyEaNcGwvBuD/AuKMUtlAQglAGEkRg6A6g5AyEYGQBQqC0AAEIEw+wxhDDQEguozxuhIUwHMU4uxRASAGIcNI+A7CZDOOkYQURPimHiDMAgwQ4BUAyAcYI0BGAbjQBAUgHQBifGOHkTYAAgBHDiJgPwnIbD6DyJwE46R1BzV2nkCkNguBdAqEZTIY4ciHHiM4LIngjghEJh0IoJAjBwE+IcRItg/AdHMKwRIIwkCyB4JUEgyRJBEE6CUZI8gmCED+B4Q4ER3BuAmNAPI7A6BIEMLQXYLxOjyHoMMGDIQWDJBmMwOYSRWZXHOEkeQbQJCyGiNMEQGh5ikHYHcZwsxiDvB4M8SY3B+g9CgAYXg2A6hNHmIwDgewOhHHCOANoUQqBlAuEYaQFA+glCOFISgjQVhJGiLMMI1whDLCOFwQQbgpj1ASV8KgdQKhJCmNQaoTWaCbEmzgJwQRjjBGwH4DwRh6hpC2FYW" +;
		"ovQ6hcGuJUYofQujXHqO0NwfwPgnDaGEAonwDhxHyBILIcgC38GyNYRomw0jaAsKUUoaAsCHD6I4P25BCBGDkFse4CRzhwC4HexIcxuDXCaMsOqwQQjjDaJ8E4jAmBzC8HcVI6w9BeHuLUeIfRvhXHaPMP4nBjjxHoHkLwBxIj7BaOAc4RgJiFHCBgNwFRDhhw4CURA4QcARHPxEI4ngHB1DGHgdoERHhjEwP4IrGBMgGCaESI42R0iMywOkdwdgyjZEMF8TA5hMieDbfwDIrg5ibHMDkJI6+sDWHCN8UIaBDjGEOKMNAugfCVFIOkTQRhOB3HKCcXotg+joBsO0XIbw1DaGcLEVo6h9DuFqK8NYmhoj8D8GoKYhAGgECziMeYjQPgHESPYPY6wLiWQiG4LYrh0i7HcHsZ3ih2h2GSO4NqewOAKDmBYGIMRjB+HUJwIwgxiDxE4F8DoxQ5AcDeCMY4nhTgcDYFkDwRwMiDlQCYXI+g5CVGgK8IoCQ6Bw" +;
		"FuE0A49ADjxHMGwYYiAEEuauAAQrWq8tca6QcnobGwihp3myp5G0BsA3AaG1ghhIheJ+G4J/m5qBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTAUAlAVBGAABRgRBRB5hoACBTADgeBJgogThoBIBGA2AUgEhQggB1AqBFD9AXgIgMgGgiBbAFogA1AYBYhhA2B7BNBOAHFjhVBthSh7gchWBVB2gBhTiqg5AlhSBfAzgZhIAnhxgqhNA2gZBQg8BggpBxgwgFBiASATgShWgog1haA8BagZB5hDhTBrByApAFhEABgMgBhVhgB4h7guBGAHBegvBFgsgWhIgVgWhVBogzBrhuByAIgOB8ABgdhRhfLeB8AshugZg6hBhjBgB7BdhMBrAtArgUBmgjB5hOAIADBDgehiBNhjgahZgXBMABBrhYBqhihVg9gfAzA7hDhoBkAmiDhEAkggBpAxgdAOgnAjAohGBAgqgWgAAIBEhfB8BoBtAJAUBCB5hb" +;
		"mpBiAuB0B8AdAFAkhlgAhNIUhQgBhggIAmAKgChghIA2ALgBBNBDgeASBSBOBoBUhbgFhOh4BkhygGhhhIB2AegHhiAIgGAfgGEKhyAmgJhNBYgmAkA6hihDgmAugLhjAIhGIEhjCwgsA6hPAIhkhPgOhggDhOA+gNBkAJAGBCgMgPBJAUhNvpBYh+BDspBIhGBFA9Iwg2BJA8hjB5BWBWgVhlgJBmBagVsphGBTA7AmAJgGBigYhmBJgWBms3gZB2BIgBhPBZg0htgbhnAJhGBygchnBJhWGSAPBphmBegbD+g6B+gfhoAKAGgCgghoBKAWB/jNhphshQgiAiBKA2tLtQhGtSBPB6BWgKglBPBzhGgagmhphKB2gegnhqAKgGgbA+AqBKBegVgPoaAmgqgqhqhKg2gugqBqBDhigKgsBqh6hWg2gthjhjhmg6gshqBJA+prhsALAGhCgwhsAKhoh5iBBqAihKuuhLA2hOgzhshDhqhSgyGdBChWg1ht" +;
		"gJhmhSA+glAYBCBtA9BrAaAihfg2BuTuhhgeBMhrgmADA5BNgrg2A5A8AsBrhGhyg8hvBLhWh2g7hhB7hkhbBSBOgrh0hZg/tkAHAChAhvhzBmBhBSBQAQCAg"
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
27:
How do I specify to search for name of the nodes only, when the user filters the control

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:FilterBarPromptVisible := -1/*exFilterBarVisible*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child<font ;6><off -4><b>1"):Value := 100
				oNodes:Add("Child<font ;6><off -4><b>2"):Value := 101
				oNodes1 := oNodes:Add("Child<font ;6><off -4><b>3"):Nodes()
					oNodes1:Add("Node<font ;6><off -4><b>1"):Value := 102
					oNodes1:Add("Node<font ;6><off -4><b>2"):Value := 103
			oNode:Expanded := .T.
		oXMLGrid:AutoSearch := 1/*exContains*/
		oXMLGrid:FilterBarPromptType := 35/*exFilterPromptApplyOnName+exFilterPromptStartWith*/
		oXMLGrid:FilterBarPromptPattern := "No"
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
26:
Is it possible to include child-nodes, when do filtering

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:FilterBarPromptVisible := -1/*exFilterBarVisible*/
		oXMLGrid:HideSelection := 1/*exHideAlways*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child<font ;6><off -4><b>1"):Value := 100
				oNodes:Add("Child<font ;6><off -4><b>2"):Value := 101
				oNodes1 := oNodes:Add("Child<font ;6><off -4><b>3"):Nodes()
					oNodes1:Add("Node<font ;6><off -4><b>1"):Value := 102
					oNodes1:Add("Node<font ;6><off -4><b>2"):Value := 103
			oNode:Expanded := .T.
		oXMLGrid:AutoSearch := 3/*exAnyContains*/
		oXMLGrid:FilterBarPromptType := 226/*exFilterPromptIncludeChild+exFilterPromptApplyOnValue+exFilterPromptApplyOnName+exFilterPromptContainsAny*/
		oXMLGrid:FilterBarPromptPattern := "Child3"
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
25:
How can I change the control's filtering so it searches for Contains rather than Start

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:FilterBarPromptVisible := -1/*exFilterBarVisible*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child<font ;6><off -4><b>1"):Value := 100
				oNodes:Add("Child<font ;6><off -4><b>2"):Value := 101
				oNodes1 := oNodes:Add("Child<font ;6><off -4><b>3"):Nodes()
					oNodes1:Add("Node<font ;6><off -4><b>1"):Value := 102
					oNodes1:Add("Node<font ;6><off -4><b>2"):Value := 103
			oNode:Expanded := .T.
		oXMLGrid:AutoSearch := 3/*exAnyContains*/
		oXMLGrid:FilterBarPromptType := 98/*exFilterPromptApplyOnValue+exFilterPromptApplyOnName+exFilterPromptContainsAny*/
		oXMLGrid:FilterBarPromptPattern := "Child3"
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
24:
How do I enable the control's filtering support

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:FilterBarPromptVisible := -1/*exFilterBarVisible*/
		oXMLGrid:HideSelection := 1/*exHideAlways*/
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 101
				oNodes:Add("Child <b>3"):Value := 102
			oNode:Expanded := .T.
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
23:
How can I hide the expanding bars under each parent node (method 1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABDEMACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziaQIRDINQlSTJcQjKKEUQTFiXIyAKKwEgmEQMQiCcbzXIUBxAAqXZZFUaKAgOMJDTLBAzUTCUKx7HynQACCCaTpGVo8hYhEoDJKMdB1HIZIwyBBcqBNWTFdLAAJFKTdKAMIyiGp4DbudjyXg6V5OTblez9P7AMBvS6nKrhcp2PrhTSYWr+Gp5R7IMhyLI8Uw/DS/Yq1GDYIiuOoIQhCUD0LQ9EyXJqnaJnaC5aiuCT7VRjWDYFgFdTpQC8bZuGz7Trmd59XTadhYHSsAyNRDCL6tayLDxSZabZ5aOa6HoOS4kjGY4vnQeAEBaCYOkQYYslYCpvA+D5FmSc55j0PhfF8eYHlwQZ2nQTImDsFRaioVB9j8Hx/k+c53n4fogAeTJFHuXY3HCTAygyAociMKBKEKBIeCiCZyHYEAnCEOBUh+" +;
		"BQhBgNIegKCgYBySAgh2SAUgINAMmMNIgCcCYjn4KoKmKSI2C6CpiHIagkDMYgCAoIg1A0IxEhsJgJFiPg+g+Y4yFYOA0GMWIIloNhNGIaIXCUI5CE4SwkEkchOFCFIlBkThQCUCQZDYSglCQcxaEUX5IBmBJhDeDZZDYOwlgmQhghaGZmkmKhnhoZo5ioTYYk2WYEgEYAnGOGJlDkCQyECDqfCkNoCCUSQ6A6BYhCgCZ0g6HoOEmWR9GFYw4m0OwIlIJIHCRc4shGJhpjoaocieaZiC6GAimkUgehIOwnGYEYGGiah6jaE4rg6SpCjKK5rEOMYjGGGIChKOgglmdoij6L5aEYfo6CkGIEAQgIA==")
		oXMLGrid:VisualAppearance():Add(2,"gBFLBCJwBAEHhEJAAChABC0MACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziaQIRDINQlSTJcQjKKEUQTFiXIyAKKwEgmEQMQiCcbzXIUBxAAqXZZFUaKAgOMJDTLBAzUTCUKx7HynQACCCaTpGVo8hYhEoDJKMdB1HIZIwyBBcqBNWTFdLAAJFKTdKAMIyiGp4DbudjyXg6V5OTblez9P7AMBvS6nKrhcp2PrhTSYWr+Gp5R7IMhyLI8Uw/DS/Yq1GDYIiuOoIQhCUD0LQ9EyXJqnaJnaC5aiuCT7VRjWDYFgFdTpQC8bZuGz7Trmd59XTadhYHSsAyNRDCL6tayLDxSZabZ5aOa6HoOS4kjGY4vnQeAEBaCYOkQYYslYCpvA+D5FmQf56D0PhPF+G5Fl4YZ3BAfY9BMKYOkUVoqhUH4PleZ53mkehfjgBZ9H4XxTBWcR2l2QwwkoMgKHKDIhCkCgSHiIgnkmWBMhw" +;
		"f5egglInGEAh6A0KBgiMIICHdLIIlAM4MlKAIcCaIYIjYLoLGKIhqCcMxiR8JQ1A0IxEhsJgJFiPg+guI4yFYOA0GMWIUloNhNGIaIXCUI5CE4SwkEkchMhGCxlBkQIUCQZJZCiFIRk0aQVH8IBmAOBJeDcZJYmyFgnAmAhaGaCxmGmIhqhoZJZgiXYYAgFgCHQOYOFOEITCQCJpCyEoTVUNoACUZJiFCEoekiaZgmSHQXlYEh0DuDpTjCDQiEgchAg0IpJBoXoZiYKYqHaHAimkYguhMIZpAOMh0GEGBmg6JYqmkGowmyK4rAqNoyDsGg2BmCApCuAgNh8agrkqdYkGea4ChGCBAEAgI")
		oXMLGrid:VisualAppearance():Add(3,"gBFLBCJwBAEHhEJAAChABa8GACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIzkKJpAAiCRQGiYZyHKcxMYgQrAZBEbKMLwrAYUIRCCaofAAGIaRDIcZPXQjZSMdSkHRpKi6Mo2TpPUpSDpUM6VCL3KhqKxXeq1cp2XpfWBYNhVbTafyyaiqKiSWy0EQRBSDXBcNxXHalazhNpCbTSWoqLrhRzDMCwC6rUwCeYJQzCcLxLCcMwjA5/MDeFLXCwjBJ+W5aFhzBYsbx1NKcZ7nWgaAqOKp/OKnECuBh2EYNMywK5rew7BqTf5tW7ZNx2TYNMYPKiDajcDJMOwqWpUVDjOQ4fidXzfSbPcrxfBsLp/FOKhmDKGQKHUGoFEiIRPCiE5pl8ChzhuNpyHgU49mSdxtEOWBkCCNRdGQExBhyTRQCcExeG+X5zneeAmh8Uw1nEIIfDMUJSDQSYyGCFR/GCR5yAkJRgGMRgDHyTYjGS" +;
		"VgmgkchSAoJJhhIRIXCSSQXm4H4HgkQhGBuBgJEgVJWgSVJSAYLg4E2Yx2BuAhJGIcIYCWIxHm4NINiOCJeBuDANliOIBFOJAjhiZQ5AkMhAg6BhJCgbgbH6ZJiFYHAlAkKQkg6EYOEkCRLFTQw4m0OwIlIJIHCRVAshGGRmHmGhohqZoiC4ZAimYEgeF4OwkCUSRUFwZw5mYX4eg6SZyH6HpoAOMRxFUFRihKBgglaVZagqIpXCWNoGCkFRkAQgI")
		oXMLGrid:HideSelection := 1/*exHideAlways*/
		oXMLGrid:ExpandButtons := 3/*exCustom*/
		oXMLGrid:SetProperty("ExpandButtonsCustom",.T.,16777216)
		oXMLGrid:SetProperty("ExpandButtonsCustom",.F.,33554432)
		oXMLGrid:SetProperty("Background",0/*exExpandButtonUp*/,0x3000000)
		oXMLGrid:SetProperty("Background",1/*exExpandButtonDown*/,0x3000000)
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNode1 := oNodes:Add("Child <b>2")
					oNodes1 := oNode1:Nodes()
						oNodes1:Add("Sub Child <b>2.1"):Value := 101
						oNode2 := oNodes1:Add("Sub Child <b>2.2")
							oNodes2 := oNode2:Nodes()
								oNodes2:Add("Sub Child <b>2.1.1"):Value := 101
								oNodes2:Add("Sub Child <b>2.2.2"):Value := 102
							oNode2:Expanded := .F.
					oNode1:Expanded := .T.
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
22:
How can I change the visual appearance for expand/collapse buttons

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABDEMACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziaQIRDINQlSTJcQjKKEUQTFiXIyAKKwEgmEQMQiCcbzXIUBxAAqXZZFUaKAgOMJDTLBAzUTCUKx7HynQACCCaTpGVo8hYhEoDJKMdB1HIZIwyBBcqBNWTFdLAAJFKTdKAMIyiGp4DbudjyXg6V5OTblez9P7AMBvS6nKrhcp2PrhTSYWr+Gp5R7IMhyLI8Uw/DS/Yq1GDYIiuOoIQhCUD0LQ9EyXJqnaJnaC5aiuCT7VRjWDYFgFdTpQC8bZuGz7Trmd59XTadhYHSsAyNRDCL6tayLDxSZabZ5aOa6HoOS4kjGY4vnQeAEBaCYOkQYYslYCpvA+D5FmSc55j0PhfF8eYHlwQZ2nQTImDsFRaioVB9j8Hx/k+c53n4fogAeTJFHuXY3HCTAygyAociMKBKEKBIeCiCZyHYEAnCEOBUh+" +;
		"BQhBgNIegKCgYBySAgh2SAUgINAMmMNIgCcCYjn4KoKmKSI2C6CpiHIagkDMYgCAoIg1A0IxEhsJgJFiPg+g+Y4yFYOA0GMWIIloNhNGIaIXCUI5CE4SwkEkchOFCFIlBkThQCUCQZDYSglCQcxaEUX5IBmBJhDeDZZDYOwlgmQhghaGZmkmKhnhoZo5ioTYYk2WYEgEYAnGOGJlDkCQyECDqfCkNoCCUSQ6A6BYhCgCZ0g6HoOEmWR9GFYw4m0OwIlIJIHCRc4shGJhpjoaocieaZiC6GAimkUgehIOwnGYEYGGiah6jaE4rg6SpCjKK5rEOMYjGGGIChKOgglmdoij6L5aEYfo6CkGIEAQgIA==")
		oXMLGrid:VisualAppearance():Add(2,"gBFLBCJwBAEHhEJAAChABC0MACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziaQIRDINQlSTJcQjKKEUQTFiXIyAKKwEgmEQMQiCcbzXIUBxAAqXZZFUaKAgOMJDTLBAzUTCUKx7HynQACCCaTpGVo8hYhEoDJKMdB1HIZIwyBBcqBNWTFdLAAJFKTdKAMIyiGp4DbudjyXg6V5OTblez9P7AMBvS6nKrhcp2PrhTSYWr+Gp5R7IMhyLI8Uw/DS/Yq1GDYIiuOoIQhCUD0LQ9EyXJqnaJnaC5aiuCT7VRjWDYFgFdTpQC8bZuGz7Trmd59XTadhYHSsAyNRDCL6tayLDxSZabZ5aOa6HoOS4kjGY4vnQeAEBaCYOkQYYslYCpvA+D5FmQf56D0PhPF+G5Fl4YZ3BAfY9BMKYOkUVoqhUH4PleZ53mkehfjgBZ9H4XxTBWcR2l2QwwkoMgKHKDIhCkCgSHiIgnkmWBMhw" +;
		"f5egglInGEAh6A0KBgiMIICHdLIIlAM4MlKAIcCaIYIjYLoLGKIhqCcMxiR8JQ1A0IxEhsJgJFiPg+guI4yFYOA0GMWIUloNhNGIaIXCUI5CE4SwkEkchMhGCxlBkQIUCQZJZCiFIRk0aQVH8IBmAOBJeDcZJYmyFgnAmAhaGaCxmGmIhqhoZJZgiXYYAgFgCHQOYOFOEITCQCJpCyEoTVUNoACUZJiFCEoekiaZgmSHQXlYEh0DuDpTjCDQiEgchAg0IpJBoXoZiYKYqHaHAimkYguhMIZpAOMh0GEGBmg6JYqmkGowmyK4rAqNoyDsGg2BmCApCuAgNh8agrkqdYkGea4ChGCBAEAgI")
		oXMLGrid:HideSelection := 1/*exHideAlways*/
		oXMLGrid:ExpandButtons := 3/*exCustom*/
		oXMLGrid:SetProperty("ExpandButtonsCustom",.T.,16777216)
		oXMLGrid:SetProperty("ExpandButtonsCustom",.F.,33554432)
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNode1 := oNodes:Add("Child <b>2")
					oNodes1 := oNode1:Nodes()
						oNodes1:Add("Sub Child <b>2.1"):Value := 101
						oNode2 := oNodes1:Add("Sub Child <b>2.2")
							oNodes2 := oNode2:Nodes()
								oNodes2:Add("Sub Child <b>2.1.1"):Value := 101
								oNodes2:Add("Sub Child <b>2.2.2"):Value := 102
							oNode2:Expanded := .F.
					oNode1:Expanded := .T.
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
21:
Does your control support transparent selection

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1,oNodes2
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:SelBackMode := 1/*exTransparent*/
		oXMLGrid:SetProperty("SelBackColorChild",oXMLGrid:SelBackColor())
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNode1 := oNodes:Add("Child <b>2")
					oNodes1 := oNode1:Nodes()
						oNodes1:Add("Sub Child <b>2.1"):Value := 101
						oNode2 := oNodes1:Add("Sub Child <b>2.2")
							oNodes2 := oNode2:Nodes()
								oNodes2:Add("Sub Child <b>2.1.1"):Value := 101
								oNodes2:Add("Sub Child <b>2.2.2"):Value := 102
							oNode2:Expanded := .T.
					oNode1:Expanded := .T.
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
20:
How can I show the selection with some transparent marker

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oXMLGrid:AllowDuplicateEntries := .T.
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 101
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oNode1 := oXMLGrid:Nodes():Add("Parent")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child <b>1"):Value := 100
				oNodes1:Add("Child <b>2"):Value := 101
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABdcGACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziYBYJhGBQxAJCI4DBCIZBwGKQBjASQpUhqHYDTbIMByBIUIxMGiYIRoGAxTiAMo8RrSEZTdD8ExTAZ/XzfMAKRpOFo/ULEUw0NR8aRABiNQbkWjYDp1f5nVRaFTxYKoSxbNqIRpGCzoJrKdI1SBEMTWBAddSdBKzX7tHArLgSQJdSrLMrzDIka4cACcZxkCioXozBpZVjRMaZJC2KAbMaBQgsQALGqjAaVUJQEgZTTmHS/BLPYDsLQdDyXAqnYTkFwWZa4ATtOK5b6jK6dQgmfAAaJGWzYHpGL4QGCYZKGapMgsKaVmwYp8j2RoCCWB4VHQIQjD6FIjF2RpumyewRj6XYrjoMpdk4Pgbm4DZXmmSpRnWeJ9hiN4zAkSRCECBAkFAGhGDGUB1ByBhVGUCxAkQIQ2AsRZRFQDAoEIXoXCU" +;
		"IQGBSNg9BoYBNjMbJ/DGTBznyQAwCIKISCOCRigiHgqgmIhIgCfw3k2dgFn6DAihiMg1g2Yo4mINoNBCEwMkOCgPDOTgyhCZBJBYRIQTGmYOGQaQ2E6EQjhkLg2hOZRJDoURAmSSRWFqEJlHAAhZhaZgJHYX4YCWKYKFOGQljmGgohoJoYloUoambTxqgmZwZkoboWCYeZWFaHaOBDRIkCmahDhIIh5nmfoHGOKgmDmIpjGiHoIEIVQjnyXA3A+cwgkiIooloZgoiWD5zgCYIMhCFAEIC")
		oXMLGrid:SetProperty("SelBackColor",0x1000000)
		oXMLGrid:SetProperty("SelForeColor",-1)
		oXMLGrid:SetProperty("SelBackColorChild",-1)
		oXMLGrid:SetProperty("SelForeColorChild",-1)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
19:
How can I highlight the focused/selected node only, instead highlighting its childrend collection (method 3)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 101
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABGYDg6AADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKNYykCIRSDUJYkSZEIyjAIoBQ4GACJBmKKodgONYYTLFYCwTJETw5FKEZTEWQBTjGOY5TbNcgUPCMex7IiVJYpOK6ThqTYfQjLUBvfTgAS4f6Laaneg4JDOUYtTjIADRWBMeSxAatK6rWr7BqOYoDUJZcQyDIcNzXAa9aLjO5wAiWPp4VJZM54FKVEzfQSrZqoDIrEgOZpBYjMdSgADFXQGDbHbhuS5IWwTBpQZhaGZQTb+mZtZ7oMI6HTuSztW7EMLAC6bJx7LoDazoGKSDo0TZRXLNYqzPIdf4OVq4YTxVi2PZGnmLJfGwOY8m2NhTAmPJcmAZBbmiDo3DuW4ZEgAQQhKAYkkYdA6hyDIjBkAIqBgQgmn0YxRFgGIjF8CRwhOB4ZAkPQdFYMRfCsYICFYCgkEkEhCA0JDeEICglgqYo0i4" +;
		"XQMEgZI9gaToYHSb4Hk6Y4+CGB5hlOJgbC8TBoiQAArgqco4muC5OkOMJtguYxIlYMg7GME4uC0K4AAKKg+DwJADiCZw5k6KQWEaEYOHkChADwI5izIKwKjKzQ8E8A4iFaEYOjOMgvhEZRjiIVA8CUEouE9SRJEycoWCMCJmFvUAzkYZArAACAgi0PInEkGhauKCYsmqHQPCmSAAgsSp5lCc4dg6WgUm6DkQhicw8g8OiDiwKQDk6EoNCgU40m6JZpFiUoSDyaQCokLIqAobh3iWKRogaB4MmWKhsjMLJLCAAorCyagokYIoImsM46DEOwPEoSovABZR0nSL5pFgfgfhALAqFaPw9CuUrgC2CxSlidQ9E8SoSkSEpsZXj5LFsNAAC2bZLDydYwiaW4GFOMIPGsPpcC2QACmSOQuA8a42EvYoZnKcVsAOPJwD0bpSmKagAAuO52m0PYsCmcoLkCLhLjSOwuguIAAjyQpvnkLobkOaQpC6f5CkuQAAj6Bp" +;
		"PHwZwCkQKYzkqcQ9k8Y5cj2RejH8JpGE8eZykeSprnmcwoC+TADAAAJMEwA5jDaSoyksHh8rmDLgDBzoHDyJIPCOUpejWbQKG8PJQHMIwPE6UJrhsPpljeLJ9CieQ+DSYwQAAMR1kOZxejGb57hcYQ8mufR4nmVwMFAAJHDGDBzmsbozk8TYHHKN42G2LJHAADJNmSe5enOTIjH6Rhzk2Nke4vBMt8GAHADY5wbgUD8HEQ47wOjHHiPwMI+RigcGOAmAorgjj8EIHMTY3B0i7GePQDoBwdBvGSCcIQ6BACAIC")
		oXMLGrid:SetProperty("SelBackColor",0x1000000)
		oXMLGrid:SetProperty("SelForeColor",-1)
		oXMLGrid:SetProperty("SelBackColorChild",-1)
		oXMLGrid:SetProperty("SelForeColorChild",-1)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
18:
How can I highlight the focused/selected node only, instead highlighting its childrend collection (method 2)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 101
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABJUIQAAYAQGKIaBoAKBQAGaAoDDQMw1QwAAwjSK0EwsACEIrjKCRShyCYZRhGcTSAAUEhiGKQBgiGDhViWAwyDABEbwS78agBFyRlqyfKccx9DaAQEBA")
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:SetProperty("SelBackColor",0x1a0a0a0)
		oXMLGrid:SetProperty("SelForeColor",-1)
		oXMLGrid:SetProperty("SelBackColorChild",-1)
		oXMLGrid:SetProperty("SelForeColorChild",-1)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
17:
How can I highlight the focused/selected node only, instead highlighting its childrend collection (method 1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child <b>1"):Value := 100
				oNodes:Add("Child <b>2"):Value := 101
			oNode:Selected := .T.
			oNode:Expanded := .T.
		oXMLGrid:SetProperty("LevelWidth",0,64)
		oXMLGrid:SetProperty("LevelWidth",1,96)
		oXMLGrid:SetProperty("LevelWidth",2,96)
		oXMLGrid:HideSelection := 1/*exHideAlways*/
		oXMLGrid:VisualAppearance():Add(1,"gBFLBCJwBAEHhEJAAChABdcGACAADACAxRDQNABQKAAzQFAYaBmGqGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziYBYJhGBQxAJCI4DBCIZBwGKQBjASQpUhqHYDTbIMByBIUIxMGiYIRoGAxTiAMo8RrSEZTdD8ExTAZ/XzfMAKRpOFo/ULEUw0NR8aRABiNQbkWjYDp1f5nVRaFTxYKoSxbNqIRpGCzoJrKdI1SBEMTWBAddSdBKzX7tHArLgSQJdSrLMrzDIka4cACcZxkCioXozBpZVjRMaZJC2KAbMaBQgsQALGqjAaVUJQEgZTTmHS/BLPYDsLQdDyXAqnYTkFwWZa4ATtOK5b6jK6dQgmfAAaJGWzYHpGL4QGCYZKGapMgsKaVmwYp8j2RoCCWB4VHQIQjD6FIjF2RpumyewRj6XYrjoMpdk4Pgbm4DZXmmSpRnWeJ9hiN4zAkSRCECBAkFAGhGDGUB1ByBhVGUCxAkQIQ2AsRZRFQDAoEIXoXCU" +;
		"IQGBSNg9BoYBNjMbJ/DGTBznyQAwCIKISCOCRigiHgqgmIhIgCfw3k2dgFn6DAihiMg1g2Yo4mINoNBCEwMkOCgPDOTgyhCZBJBYRIQTGmYOGQaQ2E6EQjhkLg2hOZRJDoURAmSSRWFqEJlHAAhZhaZgJHYX4YCWKYKFOGQljmGgohoJoYloUoambTxqgmZwZkoboWCYeZWFaHaOBDRIkCmahDhIIh5nmfoHGOKgmDmIpjGiHoIEIVQjnyXA3A+cwgkiIooloZgoiWD5zgCYIMhCFAEIC")
		oXMLGrid:SetProperty("Background",19/*exShowFocusRect*/,0x1000000)
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
16:
How do I enable the scrollbar-extension, as thumb to be shown outside of the control's client area

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:BeginUpdate()
		oNode := oXMLGrid:Nodes():Add("Parent <font ;6><off 4>1")
			oNodes := oNode:Nodes()
				oNode1 := oNodes:Add("Child 1")
					oNode1:Value := "<sha ;;0>Event <b><font ;6><off -6>2<off 4>3<off 4>1"
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNodes1 := oXMLGrid:Nodes():Add("Parent <font ;6><off 4>2"):Nodes()
			oNodes1:Add("Child 1")
			oNodes1:Add("Child 2")
		oXMLGrid:ScrollBars := 3/*exBoth*/
		oXMLGrid:SetProperty("ScrollPartVisible",0/*exVScroll*/,65536/*exExtentThumbPart*/,.T.)
		oXMLGrid:SetProperty("ScrollPartVisible",1/*exHScroll*/,65536/*exExtentThumbPart*/,.T.)
		oXMLGrid:SetProperty("ScrollPartVisible",2/*0x2+*/,65536/*exExtentThumbPart*/,.T.)
		oXMLGrid:ScrollWidth := 4
		oXMLGrid:SetProperty("Background",276/*exVSBack*/,AutomationTranslateColor( GraMakeRGBColor  ( { 240,240,240 } )  , .F. ))
		oXMLGrid:SetProperty("Background",260/*exVSThumb*/,AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
		oXMLGrid:ScrollHeight := 4
		oXMLGrid:SetProperty("Background",404/*exHSBack*/,oXMLGrid:Background(276/*exVSBack*/))
		oXMLGrid:SetProperty("Background",388/*exHSThumb*/,oXMLGrid:Background(260/*exVSThumb*/))
		oXMLGrid:SetProperty("Background",511/*exScrollSizeGrip*/,oXMLGrid:Background(276/*exVSBack*/))
		oXMLGrid:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
15:
Does your control support Fit-To-Page, Print and Print-Preview

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPrint
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent <b>1")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1"):Selected := .T.
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNode1 := oXMLGrid:Nodes():Add("Parent <b>2")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child 1")
				oNodes1:Add("Child 2")
		oPrint := CreateObject("Exontrol.Print")
			oPrint:Options := "FitToPage = 1x1"
			oPrint:PrintExt := oXMLGrid
			oPrint:Preview()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
14:
How do I print the control
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPrint
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent <b>1")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1"):Selected := .T.
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNode1 := oXMLGrid:Nodes():Add("Parent <b>2")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child 1")
				oNodes1:Add("Child 2")
		oPrint := CreateObject("Exontrol.Print")
			oPrint:PrintExt := oXMLGrid
			oPrint:Preview()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
13:
How can we can customize a context menu based on the node type

PROCEDURE OnMouseUp(oXMLGrid,Button,Shift,X,Y)
	LOCAL oExContextMenu
	DevOut( "Node:" )
	DevOut( Transform(oXMLGrid:NodeFromPoint(X,Y),"") )
	oExContextMenu := CreateObject("Exontrol.ContextMenu")
		oExContextMenu:Items():ToString := "Calendar[id=20][img=0],MSChart[id=30],Record[id=40],Slider[id=50],Radio 1[id=100][typ=2][edit=],Radio 2[id=101][typ=2][edit=],Radio 3[id=102][typ=2][edit=],ComboBox[id=90]"
		DevOut( Transform(oExContextMenu:Select(),"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:MouseUp := {|Button,Shift,X,Y| OnMouseUp(oXMLGrid,Button,Shift,X,Y)} /*Occurs when the user releases a mouse button.*/

		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1")
				oNodes:Add("Child 2")
			oNode:Expanded := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
12:
How we can attach a customized editor, for example, a date-time picker dialog for a date-time attribute using eXMLGrid

PROCEDURE OnUserEditorClose(oXMLGrid,Object,Node)
	/*Node.Value = Object.Value*/
RETURN

PROCEDURE OnUserEditorOpen(oXMLGrid,Object,Node)
	/*Object.Value = Node.Value*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oCalendarCombo
	LOCAL oEditor
	LOCAL oEditors
	LOCAL oNode
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:UserEditorClose := {|Object,Node| OnUserEditorClose(oXMLGrid,Object,Node)} /*Fired the user editor is about to be opened.*/
		oXMLGrid:UserEditorOpen := {|Object,Node| OnUserEditorOpen(oXMLGrid,Object,Node)} /*Occurs when an user editor is about to be opened.*/

		oXMLGrid:NodeHeight := 24
		oEditors := oXMLGrid:Editors()
			oEditor := oEditors:Add("ExCalendarUserEditor",16/*UserEditorType*/)
				oEditor:UserEditor("ExCalendar.CalendarCombo","")
				oCalendarCombo := oEditor:UserEditorObject()
		oNode := oXMLGrid:Nodes():Add("Date")
			oNode:Editor := "ExCalendarUserEditor"
			oNode:Value := "01/01/2001"

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
11:
How can change the visual appearance of the expand/collapse buttons

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:Images("gBJJgBAIDAAGAAEAAQhYAf8Pf4hh0QihCJo2AEZjQAjEZFEaIEaEEaAIAkcbk0olUrlktl0vmExmUzmk1m03nE5nU7nk9n0/oFBoVDolFo1HpFJpVLplNp1PqFRqVTqlVq1XrFZrVbrldr1fsFhsVjslls1ntFptVrtltt1vuFxuVzul1u13vF5vV7vl9v1/wGBwWDwmFw2HxGJxWLxmNx0xiFdyOTh8Tf9ZymXx+QytcyNgz8r0OblWjyWds+m0ka1Vf1ta1+r1mos2xrG2xeZ0+a0W0qOx3GO4NV3WeyvD2XJ5XL5nN51aiw+lfSj0gkUkAEllHanHI5j/cHg8EZf7w8vl8j4f/qfEZeB09/vjLAB30+kZQAP/P5/H6/yNAOAEAwCjMBwFAEDwJBMDwLBYAP2/8Hv8/gAGAD8LQs9w/nhDY/oygIA=")
		oXMLGrid:VisualAppearance():Add(1,"c:\exontrol\images\normal.ebn")
		oXMLGrid:VisualAppearance():Add(2,"c:\exontrol\images\pushed.ebn")
		oNode := oXMLGrid:Nodes():Add("Parent <b>1")
			oNodes := oNode:Nodes()
				oNode1 := oNodes:Add("Child 1")
					oNode1:Value := "<sha ;;0>Event <b><font ;6><off -6>2<off 4>3<off 4>1"
					oNode1:Selected := .T.
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNode2 := oXMLGrid:Nodes():Add("Parent <b>2")
			oNodes1 := oNode2:Nodes()
				oNodes1:Add("Child 1")
				oNodes1:Add("Child 2")
		oXMLGrid:ExpandBarVisible := .T.
		oXMLGrid:ExpandButtons := 3/*exCustom*/
		oXMLGrid:SetProperty("ExpandButtonsCustom",.F.,1)
		oXMLGrid:SetProperty("ExpandButtonsCustom",.T.,2)
		oXMLGrid:SetProperty("Background",1/*exExpandButtonDown*/,0x1808080)
		oXMLGrid:SetProperty("Background",0/*exExpandButtonUp*/,0x1000000)
		oXMLGrid:SetProperty("Background",3/*exExpandBarButtonDown*/,0x2808080)
		oXMLGrid:SetProperty("Background",2/*exExpandBarButtonUp*/,0x2000000)
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:SetProperty("SelBackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 0,0,0 } )  , .F. ))
		oXMLGrid:SetProperty("SelBackColorChild",oXMLGrid:SelBackColor())
		oXMLGrid:SetProperty("SelForeColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oXMLGrid:SetProperty("SelForeColorChild",oXMLGrid:SelForeColor())

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
10:
How can change the visual appearance of the selected node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1,oNode2
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent <b>1")
			oNodes := oNode:Nodes()
				oNode1 := oNodes:Add("Child 1")
					oNode1:Value := "<sha ;;0>Event <b><font ;6><off -6>2<off 4>3<off 4>1"
					oNode1:Selected := .T.
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNode2 := oXMLGrid:Nodes():Add("Parent <b>2")
			oNodes1 := oNode2:Nodes()
				oNodes1:Add("Child 1")
				oNodes1:Add("Child 2")
		oXMLGrid:ShowFocusRect := .F.
		oXMLGrid:SetProperty("SelBackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 0,0,0 } )  , .F. ))
		oXMLGrid:SetProperty("SelBackColorChild",oXMLGrid:SelBackColor())
		oXMLGrid:SetProperty("SelForeColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oXMLGrid:SetProperty("SelForeColorChild",oXMLGrid:SelForeColor())

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
9:
How can I select programatically a node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent <b>1")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1"):Selected := .T.
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNode1 := oXMLGrid:Nodes():Add("Parent <b>2")
			oNodes1 := oNode1:Nodes()
				oNodes1:Add("Child 1")
				oNodes1:Add("Child 2")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
8:
How can I expand all nodes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1")
				oNodes:Add("Child 2")
			oNode:ExpandAll()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
7:
Does your control support subscript or superscript

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode,oNode1
	LOCAL oNodes,oNodes1
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent <font ;6><off 4>1")
			oNodes := oNode:Nodes()
				oNode1 := oNodes:Add("Child 1")
					oNode1:Value := "<sha ;;0>Event <b><font ;6><off -6>2<off 4>3<off 4>1"
				oNodes:Add("Child 2")
			oNode:ExpandAll()
		oNodes1 := oXMLGrid:Nodes():Add("Parent <font ;6><off 4>2"):Nodes()
			oNodes1:Add("Child 1")
			oNodes1:Add("Child 2")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
6:
How can I add a UserType editor ( ActiveX )

PROCEDURE OnUserEditorClose(oXMLGrid,Object,Node)
	/*Node.Value = Object.Value*/
RETURN

PROCEDURE OnUserEditorOpen(oXMLGrid,Object,Node)
	/*Object.Value = Node.Value*/
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oColumn,oColumn1
	LOCAL oColumns
	LOCAL oComboBox
	LOCAL oEditor
	LOCAL oEditors
	LOCAL oItems
	LOCAL oNode
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:UserEditorClose := {|Object,Node| OnUserEditorClose(oXMLGrid,Object,Node)} /*Fired the user editor is about to be opened.*/
		oXMLGrid:UserEditorOpen := {|Object,Node| OnUserEditorOpen(oXMLGrid,Object,Node)} /*Occurs when an user editor is about to be opened.*/

		oXMLGrid:NodeHeight := 24
		oEditors := oXMLGrid:Editors()
			oEditor := oEditors:Add("ExComboUserEditor",16/*UserEditorType*/)
				oEditor:UserEditor("Exontrol.ComboBox","")
				oComboBox := oEditor:UserEditorObject()
					oComboBox:MinHeightList := 164
					oComboBox:MinWidthList := 264
					oComboBox:AllowSizeGrip := .T.
					oComboBox:IntegralHeight := .T.
					oComboBox:Alignment := 0/*LeftAlignment*/
					oComboBox:ColumnAutoResize := .T.
					oComboBox:BeginUpdate()
					oComboBox:MarkSearchColumn := .F.
					oColumns := oComboBox:Columns()
						oColumn := oColumns:Add("Car")
							oColumn:Width := 32
							oColumn:DisplayFilterButton := .T.
						oColumn1 := oColumns:Add("Equipment")
							oColumn1:DisplayFilterButton := .T.
							oColumn1:DisplayFilterPattern := .F.
							oColumn1:CustomFilter := "Air Bag||*Air Bag*|||Air condition||*Air condition*|||ABS||*ABS*|||ESP||*ESP*"
							oColumn1:FilterType := 3/*exPattern*/
					oItems := oComboBox:Items()
						oItems:SetProperty("CellCaption",oItems:AddItem("Mazda"),1,"Air Bag")
						oItems:SetProperty("CellCaption",oItems:AddItem("Toyota"),1,"Air Bag,Air condition")
						oItems:SetProperty("CellCaption",oItems:AddItem("Ford"),1,"Air condition")
						oItems:SetProperty("CellCaption",oItems:AddItem("Nissan"),1,"Air Bag,ABS,ESP")
					oComboBox:EndUpdate()
		oNode := oXMLGrid:Nodes():Add("Car")
			oNode:Editor := "ExComboUserEditor"
			oNode:Value := "Mazda"

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
5:
How can I load a XML file

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oXMLGrid:LoadXML("C:\Windows\Ultimate.xml")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
4:
How can I assign a tooltip to a node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Title")
			oNode:Value := "value"
			oNode:ToolTip := "This is a bit of <b>HTML</b> text to be shown when the cursor hovers the node."

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
3:
How can I edit the node using a DateType editor

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oEditor
	LOCAL oEditors
	LOCAL oNode
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oEditors := oXMLGrid:Editors()
			oEditor := oEditors:Add("DateEditor",7/*DateType*/)
				oEditor:SetProperty("Option",34/*exDateMarkToday*/,.T.)
		oNode := oXMLGrid:Nodes():Add("Date")
			oNode:Editor := "DateEditor"
			oNode:Value := "01/01/2001"

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
2:
How can I expand a node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNode
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNode := oXMLGrid:Nodes():Add("Parent")
			oNodes := oNode:Nodes()
				oNodes:Add("Child 1")
				oNodes:Add("Child 2")
			oNode:Expanded := .T.

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
1:
How can I add a node

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oNodes
	LOCAL oXMLGrid

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oXMLGrid := XbpActiveXControl():new( oForm:drawingArea )
	oXMLGrid:CLSID  := "Exontrol.XMLGrid.1" /*{AC7F976E-48C3-4B0B-B952-45D92DFE7F3E}*/
	oXMLGrid:create(,, {10,60},{610,370} )

		oNodes := oXMLGrid:Nodes():Add("Parent"):Nodes()
			oNodes:Add("Child 1")
			oNodes:Add("Child 2")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN