method Elements.Insert ([Caption as Variant], [Parent as Variant], [Position as Variant])
Inserts a child Element object to the collection and returns a reference to the newly created object.

TypeDescription
Caption as Variant A String expression that specifies the caption to be displayed on the element. The Caption property specifies the value of the Caption parameter. Use the CaptionAlign property to align the element's caption.
Parent as Variant A Long, String or Numeric expression that specifies the identifier of the parent element, or a reference to the parent element. The Parent property specifies the element's parent. The ID property indicates the element's identifier.
Position as Variant A Long expression that specifies the position of the element in the parent's children collection. If missing, the element is added at the end of the parent's children list
ReturnDescription
ElementA Reference to the newly inserted element.
Use the Insert method to insert programmatically a child element. The Add method adds programmatically a new element to the surface. Use the InsertControl method to insert programmatically a child element that hosts an inner ActiveX control. The control fires the AddElement event once a new element is added to the Elements collection. The AutoSize property specifies whether the element's size if computed automatically based on its content. While the AutoSize property is True, the element is not resizable. Use the Width / Height property to specify the size of the element. The Expanded property expands or collapse the parent element. Use the IndentX / IndentY property to specify the indentation between child and parent elements.

The following samples show how you can programmatically add a child element, or create a hierarchy:

VBA (MS Access, Excell...)

With Surface1
	With .Elements
		.Add("Root").ID = "rootID"
		.Insert "Child 1","rootID"
		.Insert("Child 2","rootID").ID = "childID"
		.Insert "Child 3","rootID"
		.Insert "Sub-Child 1.2","childID"
		.Insert "Sub-Child 2.2","childID"
	End With
End With

VB6

With Surface1
	With .Elements
		.Add("Root").ID = "rootID"
		.Insert "Child 1","rootID"
		.Insert("Child 2","rootID").ID = "childID"
		.Insert "Child 3","rootID"
		.Insert "Sub-Child 1.2","childID"
		.Insert "Sub-Child 2.2","childID"
	End With
End With

VB.NET

With Exsurface1
	With .Elements
		.Add("Root").ID = "rootID"
		.Insert("Child 1","rootID")
		.Insert("Child 2","rootID").ID = "childID"
		.Insert("Child 3","rootID")
		.Insert("Sub-Child 1.2","childID")
		.Insert("Sub-Child 2.2","childID")
	End With
End With

VB.NET for /COM

With AxSurface1
	With .Elements
		.Add("Root").ID = "rootID"
		.Insert("Child 1","rootID")
		.Insert("Child 2","rootID").ID = "childID"
		.Insert("Child 3","rootID")
		.Insert("Sub-Child 1.2","childID")
		.Insert("Sub-Child 2.2","childID")
	End With
End With

C++

/*
	Copy and paste the following directives to your header file as
	it defines the namespace 'EXSURFACELib' for the library: 'ExSurface 1.0 Control Library'

	#import <ExSurface.dll>
	using namespace EXSURFACELib;
*/
EXSURFACELib::ISurfacePtr spSurface1 = GetDlgItem(IDC_SURFACE1)->GetControlUnknown();
EXSURFACELib::IElementsPtr var_Elements = spSurface1->GetElements();
	var_Elements->Add("Root",vtMissing,vtMissing)->PutID("rootID");
	var_Elements->Insert("Child 1","rootID",vtMissing);
	var_Elements->Insert("Child 2","rootID",vtMissing)->PutID("childID");
	var_Elements->Insert("Child 3","rootID",vtMissing);
	var_Elements->Insert("Sub-Child 1.2","childID",vtMissing);
	var_Elements->Insert("Sub-Child 2.2","childID",vtMissing);

C++ Builder

Exsurfacelib_tlb::IElementsPtr var_Elements = Surface1->Elements;
	var_Elements->Add(TVariant("Root"),TNoParam(),TNoParam())->set_ID(TVariant("rootID"));
	var_Elements->Insert(TVariant("Child 1"),TVariant("rootID"),TNoParam());
	var_Elements->Insert(TVariant("Child 2"),TVariant("rootID"),TNoParam())->set_ID(TVariant("childID"));
	var_Elements->Insert(TVariant("Child 3"),TVariant("rootID"),TNoParam());
	var_Elements->Insert(TVariant("Sub-Child 1.2"),TVariant("childID"),TNoParam());
	var_Elements->Insert(TVariant("Sub-Child 2.2"),TVariant("childID"),TNoParam());

C#

exontrol.EXSURFACELib.Elements var_Elements = exsurface1.Elements;
	var_Elements.Add("Root",null,null).ID = "rootID";
	var_Elements.Insert("Child 1","rootID",null);
	var_Elements.Insert("Child 2","rootID",null).ID = "childID";
	var_Elements.Insert("Child 3","rootID",null);
	var_Elements.Insert("Sub-Child 1.2","childID",null);
	var_Elements.Insert("Sub-Child 2.2","childID",null);

JavaScript

<OBJECT classid="clsid:AC1DF7F4-0919-4364-8167-2F9B5155EA4B" id="Surface1"></OBJECT>

<SCRIPT LANGUAGE="JScript">
	var var_Elements = Surface1.Elements;
		var_Elements.Add("Root",null,null).ID = "rootID";
		var_Elements.Insert("Child 1","rootID",null);
		var_Elements.Insert("Child 2","rootID",null).ID = "childID";
		var_Elements.Insert("Child 3","rootID",null);
		var_Elements.Insert("Sub-Child 1.2","childID",null);
		var_Elements.Insert("Sub-Child 2.2","childID",null);
</SCRIPT>

C# for /COM

EXSURFACELib.Elements var_Elements = axSurface1.Elements;
	var_Elements.Add("Root",null,null).ID = "rootID";
	var_Elements.Insert("Child 1","rootID",null);
	var_Elements.Insert("Child 2","rootID",null).ID = "childID";
	var_Elements.Insert("Child 3","rootID",null);
	var_Elements.Insert("Sub-Child 1.2","childID",null);
	var_Elements.Insert("Sub-Child 2.2","childID",null);

X++ (Dynamics Ax 2009)

public void init()
{
	COM com_Element,com_Elements;
	anytype var_Element,var_Elements;
	;

	super();

	var_Elements = exsurface1.Elements(); com_Elements = var_Elements;
		var_Element = COM::createFromObject(com_Elements.Add("Root")); com_Element = var_Element;
		com_Element.ID("rootID");
		com_Elements.Insert("Child 1","rootID");
		var_Element = COM::createFromObject(com_Elements.Insert("Child 2","rootID")); com_Element = var_Element;
		com_Element.ID("childID");
		com_Elements.Insert("Child 3","rootID");
		com_Elements.Insert("Sub-Child 1.2","childID");
		com_Elements.Insert("Sub-Child 2.2","childID");
}

Delphi 8 (.NET only)

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Root',Nil,Nil).ID := 'rootID';
		Insert('Child 1','rootID',Nil);
		Insert('Child 2','rootID',Nil).ID := 'childID';
		Insert('Child 3','rootID',Nil);
		Insert('Sub-Child 1.2','childID',Nil);
		Insert('Sub-Child 2.2','childID',Nil);
	end;
end

Delphi (standard)

with Surface1 do
begin
	with Elements do
	begin
		Add('Root',Null,Null).ID := 'rootID';
		Insert('Child 1','rootID',Null);
		Insert('Child 2','rootID',Null).ID := 'childID';
		Insert('Child 3','rootID',Null);
		Insert('Sub-Child 1.2','childID',Null);
		Insert('Sub-Child 2.2','childID',Null);
	end;
end

VFP

with thisform.Surface1
	with .Elements
		.Add("Root").ID = "rootID"
		.Insert("Child 1","rootID")
		.Insert("Child 2","rootID").ID = "childID"
		.Insert("Child 3","rootID")
		.Insert("Sub-Child 1.2","childID")
		.Insert("Sub-Child 2.2","childID")
	endwith
endwith

dBASE Plus

local oSurface,var_Element,var_Element1,var_Elements

oSurface = form.Activex1.nativeObject
var_Elements = oSurface.Elements
	// var_Elements.Add("Root").ID = "rootID"
	var_Element = var_Elements.Add("Root")
	with (oSurface)
		TemplateDef = [Dim var_Element]
		TemplateDef = var_Element
		Template = [var_Element.ID = "rootID"]
	endwith
	var_Elements.Insert("Child 1","rootID")
	// var_Elements.Insert("Child 2","rootID").ID = "childID"
	var_Element1 = var_Elements.Insert("Child 2","rootID")
	with (oSurface)
		TemplateDef = [Dim var_Element1]
		TemplateDef = var_Element1
		Template = [var_Element1.ID = "childID"]
	endwith
	var_Elements.Insert("Child 3","rootID")
	var_Elements.Insert("Sub-Child 1.2","childID")
	var_Elements.Insert("Sub-Child 2.2","childID")

XBasic (Alpha Five)

Dim oSurface as P
Dim var_Element as P
Dim var_Element1 as P
Dim var_Elements as P

oSurface = topparent:CONTROL_ACTIVEX1.activex
var_Elements = oSurface.Elements
	' var_Elements.Add("Root").ID = "rootID"
	var_Element = var_Elements.Add("Root")
	oSurface.TemplateDef = "Dim var_Element"
	oSurface.TemplateDef = var_Element
	oSurface.Template = "var_Element.ID = \"rootID\""

	var_Elements.Insert("Child 1","rootID")
	' var_Elements.Insert("Child 2","rootID").ID = "childID"
	var_Element1 = var_Elements.Insert("Child 2","rootID")
	oSurface.TemplateDef = "Dim var_Element1"
	oSurface.TemplateDef = var_Element1
	oSurface.Template = "var_Element1.ID = \"childID\""

	var_Elements.Insert("Child 3","rootID")
	var_Elements.Insert("Sub-Child 1.2","childID")
	var_Elements.Insert("Sub-Child 2.2","childID")

Visual Objects

local var_Elements as IElements

var_Elements := oDCOCX_Exontrol1:Elements
	var_Elements:Add("Root",nil,nil):ID := "rootID"
	var_Elements:Insert("Child 1","rootID",nil)
	var_Elements:Insert("Child 2","rootID",nil):ID := "childID"
	var_Elements:Insert("Child 3","rootID",nil)
	var_Elements:Insert("Sub-Child 1.2","childID",nil)
	var_Elements:Insert("Sub-Child 2.2","childID",nil)

PowerBuilder

OleObject oSurface,var_Elements

oSurface = ole_1.Object
var_Elements = oSurface.Elements
	var_Elements.Add("Root").ID = "rootID"
	var_Elements.Insert("Child 1","rootID")
	var_Elements.Insert("Child 2","rootID").ID = "childID"
	var_Elements.Insert("Child 3","rootID")
	var_Elements.Insert("Sub-Child 1.2","childID")
	var_Elements.Insert("Sub-Child 2.2","childID")

Visual DataFlex

Procedure OnCreate
	Forward Send OnCreate
	Variant voElements
	Get ComElements to voElements
	Handle hoElements
	Get Create (RefClass(cComElements)) to hoElements
	Set pvComObject of hoElements to voElements
		Variant voElement
		Get ComAdd of hoElements "Root" Nothing Nothing to voElement
		Handle hoElement
		Get Create (RefClass(cComElement)) to hoElement
		Set pvComObject of hoElement to voElement
			Set ComID of hoElement to "rootID"
		Send Destroy to hoElement
		Get ComInsert of hoElements "Child 1" "rootID" Nothing to Nothing
		Variant voElement1
		Get ComInsert of hoElements "Child 2" "rootID" Nothing to voElement1
		Handle hoElement1
		Get Create (RefClass(cComElement)) to hoElement1
		Set pvComObject of hoElement1 to voElement1
			Set ComID of hoElement1 to "childID"
		Send Destroy to hoElement1
		Get ComInsert of hoElements "Child 3" "rootID" Nothing to Nothing
		Get ComInsert of hoElements "Sub-Child 1.2" "childID" Nothing to Nothing
		Get ComInsert of hoElements "Sub-Child 2.2" "childID" Nothing to Nothing
	Send Destroy to hoElements
End_Procedure

XBase++

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

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

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

	oSurface := XbpActiveXControl():new( oForm:drawingArea )
	oSurface:CLSID  := "Exontrol.Surface.1" /*{AC1DF7F4-0919-4364-8167-2F9B5155EA4B}*/
	oSurface:create(,, {10,60},{610,370} )

		oElements := oSurface:Elements()
			oElements:Add("Root"):ID := "rootID"
			oElements:Insert("Child 1","rootID")
			oElements:Insert("Child 2","rootID"):ID := "childID"
			oElements:Insert("Child 3","rootID")
			oElements:Insert("Sub-Child 1.2","childID")
			oElements:Insert("Sub-Child 2.2","childID")

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