181
exUndo, An Undo operation is performed (CTR + Z), exRedo, A Redo operation is performed (CTR + Y). exUndoRedoUpdate, The Undo/Redo queue is updated
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value case (default:value;32:`exUndoRedoUpdate`;33:`exUndo`;34:`exRedo`)',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value case (default:value;32:`exUndoRedoUpdate`;33:`exUndo`;34:`exRedo`)',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Press CTRL+Z to Undo, CTRL+Y to Redo' );
end
180
exLinkObjects, the user creates an element on the surface. The AllowLinkObjects property specifies the keys combination to allow user to link elements on the surface
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 9 ? `exLinkObjects` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 9 ? `exLinkObjects` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	EndUpdate();
	OutputDebugString( 'Hold SHIFT, click an element, and drag to another element to create a link between them' );
end
179
exEditObject, the user edits the element's caption
// Click event - Occurs when the user presses and then releases the left mouse button over the control.
procedure TWinForm1.AxSurface1_ClickEvent(sender: System.Object; e: System.EventArgs);
begin
	// ElementFromPoint(-1,-1).Edit(0)
end;

// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 8 ? `exEditObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 8 ? `exEditObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Click an element to edit its caption' );
end
178
exCreateObject, the user creates an element on the surface. The AllowCreateObject property specifies the keys combination to allow user to create elements on the surface
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 7 ? `exCreateObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 7 ? `exCreateObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil).Selected := True;
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Double-click on the surface and immediately drag to a new position to create an element' );
end
177
exSelectNothing, the user clicks an empty zone of the surface. The AllowSelectNothing property specifies the keys combination to allow user to select nothing on the surface
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 6 ? `exSelectNothing` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 6 ? `exSelectNothing` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowSelectNothing := True;
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil).Selected := True;
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Select an element, and then click outside to select nothing' );
end
176
exSelectObject, the user clicks the object to get it selected. The AllowSelectObject property specifies the keys combination to allow user to select the object
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 5 ? `exSelectObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 5 ? `exSelectObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Hold ALT and click, then drag to select elements within the drawn rectangle. Click an element to select it. CTRL + CLick to unse' + 
	'lect it' );
end
175
exMoveObject, the user moves the object. The AllowMoveObject property specifies the keys combination to allow user to move the object
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 4 ? `exMoveObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 4 ? `exMoveObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Move an element' );
end
174
exResizeObject, the user resizes the object. The AllowResizeObject property specifies the keys combination to allow user to resize the object
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 3 ? `exResizeObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 3 ? `exResizeObject` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64)).AutoSize := False;
		Add('Node <b>2',Nil,Nil).AutoSize := False;
		Add('Node <b>3',TObject(64),TObject(-64)).AutoSize := False;
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Resize an element' );
end
173
exSurfaceHome, the user clicks the Home button on the control's toolbar, so the surface is restored to original position. The Home method has the same effect
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 2 ? `exSurfaceHome` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 2 ? `exSurfaceHome` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Click the Home button' );
end
172
exSurfaceZoom, the user magnifies or shrinks the surface. The AllowZoomSurface property specifies the keys combination to allow user to zoom the surface
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 1 ? `exSurfaceZoom` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 1 ? `exSurfaceZoom` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Click and drag the surface to reposition it' );
end
171
exSurfaceMove, the user scrolls or moves the surface. The AllowMoveSurface property specifies the keys combination to allow user to move / scroll the surface
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( FormatABC('value = 0 ? `exSurfaceMove` : value',TObject(e.operation),Nil,Nil) );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( FormatABC('value = 0 ? `exSurfaceMove` : value',TObject(e.operation),Nil,Nil) );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
	OutputDebugString( 'Click and drag the surface to reposition it' );
end
170
FormatABC method formats the A,B,C values based on the giving expression and returns the result

with AxSurface1 do
begin
	OutputDebugString( FormatABC('value format ``',TObject(1000),Nil,Nil) );
end
169
FreezeEvents(Freeze) method prevents firing any event. For instance, FreezeEvents(True) freezes the control's events, no no event is fired, until the FreezeEvents(False) is called
// Event event - Notifies the application once the control fires an event.
procedure TWinForm1.AxSurface1_Event(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_EventEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( get_EventParam(-2) );
	end
end;

with AxSurface1 do
begin
	FreezeEvents(True);
	OutputDebugString( 'No event is fired after FreezeEvents(True) call' );
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
end
168
The exAllowChangeFrom(0x20)/exAllowChangeTo(0x40) flag of LinkControlPointEnum type allows the user to adjust the link's from/to element by dragging and dropping the start control point (requires the exStartControlPoint/exEndControlPoint flag)
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( e.operation );
		OutputDebugString( FocusLink.ID );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( e.operation );
		OutputDebugString( FocusLink.ID );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
		Add('Node <b>3',TObject(64),TObject(-64));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	FocusLink := 'L1';
	EndUpdate();
end
167
The LayoutStartChanging(exFocusLink)/LayoutEndChanging(exFocusLink) event notifies your application when the user focuses on a new link
// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( e.operation );
		OutputDebugString( FocusLink );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( e.operation );
		OutputDebugString( FocusLink );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	EndUpdate();
end
166
Focus a link

// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( e.operation );
	end
end;

// LayoutStartChanging event - Occurs when the control's layout is about to be changed.
procedure TWinForm1.AxSurface1_LayoutStartChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutStartChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutStartChanging' );
		OutputDebugString( e.operation );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Node <b>1',TObject(-64),TObject(-64));
		Add('Node <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],'L1');
	FocusLink := 'L1';
	EndUpdate();
end
165
The caption is displayed on the back, so the picture overrides it. How can I place the caption on the foreground

with AxSurface1 do
begin
	BeginUpdate();
	DrawPartsOrder := 'extracaption,extrapicture,picture,check,caption,client';
	set_HTMLPicture('pic1','c:\exontrol\images\sun.png');
	with Elements.Add('<b>Element',Nil,Nil) do
	begin
		PicturesAlign := EXSURFACELib.ContentAlignmentEnum.exMiddleCenter;
		CaptionAlign := EXSURFACELib.ContentAlignmentEnum.exMiddleCenter;
		Pictures := 'pic1';
	end;
	EndUpdate();
end
164
Draws a frame arround the link's arrow

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			ArrowSize := 8;
			ArrowColor := $ffffff;
			ArrowFrameColor := $0;
		end;
	end;
	FitToClient();
	EndUpdate();
end
163
Draws a frame arround the arrow for all links

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	LinksArrowSize := 8;
	LinksArrowColor := Color.FromArgb(255,255,255);
	LinksArrowFrameColor := Color.FromArgb(0,0,0);
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
		end;
	end;
	FitToClient();
	EndUpdate();
end
162
Change the size to display the arrow of the link

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			ArrowSize := 8;
		end;
	end;
	FitToClient();
	EndUpdate();
end
161
Change the size to display the arrows for all links

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	LinksArrowSize := 8;
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
		end;
	end;
	FitToClient();
	EndUpdate();
end
160
Extends the caption on the element's width
with AxSurface1 do
begin
	with Elements.Add('<solidline> <c><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;e64=gA8ABzABvABsABpABkg8JABuABlAAgAA4AAwisXjMYH0TAECMY' + 
	'AjsCMwAM4AkMGhEGOUei0Yl8bkQAOAAlsGmsSlp0h0SgkCF8DgsNhUMhEKiESkYAoMlk8phssmcCltLMNTAFOlFDlc2l0amMxjomAAjAA5AA2tMaHcfplZk1blVDqtuo' + 
	'NXjoAAEBA=>▲</a><br><solidline>+ balance: Currency = 0</solidline><br>+ deposit(amount: Currency)<r><a 2;e64=gA8ABjAA+AECM' + 
	'wAM8DABvABshoAOQAEAAHAAGEWjEajMGNoAMoAOgANERMgAOcHAAvAEJhcEh0Qh0Tg0CmkqMMFlUuhkxiMTisXjNCjk6EwAEYAHIAG1MjY7lUsnkwh8/nUClk5gwAAEB' + 
	'A==>▲</a><br>+ withdraw(amount: Currency)',Nil,Nil) do
	begin
		ID := 'Account';
		X := -128;
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
		AutoSize := False;
		Width := 256;
		Height := AutoHeight;
		CaptionAlign := EXSURFACELib.ContentAlignmentEnum($4);
	end;
end
159
Gets the width/height of the element to fit its content ( as if the AutoSize property is True )

// AnchorClick event - Occurs when an anchor element is clicked.
procedure TWinForm1.AxSurface1_AnchorClick(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AnchorClickEvent);
begin
	with AxSurface1 do
	begin
		with Elements.Item['Account'] do
		begin
			Height := AutoHeight;
		end;
	end
end;

with AxSurface1 do
begin
	with Elements.Add('<solidline> <c><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;e64=gA8ABzABvABsABpABkg8JABuABlAAgAA4AAwisXjMYH0TAECMY' + 
	'AjsCMwAM4AkMGhEGOUei0Yl8bkQAOAAlsGmsSlp0h0SgkCF8DgsNhUMhEKiESkYAoMlk8phssmcCltLMNTAFOlFDlc2l0amMxjomAAjAA5AA2tMaHcfplZk1blVDqtuo' + 
	'NXjoAAEBA=>▲</a><br><solidline>+ balance: Currency = 0</solidline><br>+ deposit(amount: Currency)<r><a 2;e64=gA8ABjAA+AECM' + 
	'wAM8DABvABshoAOQAEAAHAAGEWjEajMGNoAMoAOgANERMgAOcHAAvAEJhcEh0Qh0Tg0CmkqMMFlUuhkxiMTisXjNCjk6EwAEYAHIAG1MjY7lUsnkwh8/nUClk5gwAAEB' + 
	'A==>▲</a><br>+ withdraw(amount: Currency)',Nil,Nil) do
	begin
		ID := 'Account';
		X := -128;
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
		AutoSize := False;
		Width := 256;
		Height := AutoHeight;
		CaptionAlign := EXSURFACELib.ContentAlignmentEnum($4);
	end;
end
158
Expandable-caption

// AnchorClick event - Occurs when an anchor element is clicked.
procedure TWinForm1.AxSurface1_AnchorClick(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AnchorClickEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( e.anchorID );
	end
end;

with AxSurface1 do
begin
	with Elements.Add('<solidline> <c><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;e64=gA8ABzABvABsABpABkg8JABuABlAAgAA4AAwisXjMYH0TAECMY' + 
	'AjsCMwAM4AkMGhEGOUei0Yl8bkQAOAAlsGmsSlp0h0SgkCF8DgsNhUMhEKiESkYAoMlk8phssmcCltLMNTAFOlFDlc2l0amMxjomAAjAA5AA2tMaHcfplZk1blVDqtuo' + 
	'NXjoAAEBA=>▲</a><br><solidline>+ balance: Currency = 0</solidline><br>+ deposit(amount: Currency)<r><a 2;e64=gA8ABjAA+AECM' + 
	'wAM8DABvABshoAOQAEAAHAAGEWjEajMGNoAMoAOgANERMgAOcHAAvAEJhcEh0Qh0Tg0CmkqMMFlUuhkxiMTisXjNCjk6EwAEYAHIAG1MjY7lUsnkwh8/nUClk5gwAAEB' + 
	'A==>▲</a><br>+ withdraw(amount: Currency)',Nil,Nil) do
	begin
		ID := 'Account';
		X := -256;
		Y := -164;
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
		CaptionAlign := EXSURFACELib.ContentAlignmentEnum($4);
	end;
	with Elements.Add('<solidline> <c><b>Person</b></solidline><br>+ name: String <r><a 1;e64=gA8ABzABvABsABpABkg8JABuABlAAgAA4AAwisXjMYH0TAECMYAjsCMwA' + 
	'M4AkMGhEGOUei0Yl8bkQAOAAlsGmsSlp0h0SgkCF8DgsNhUMhEKiESkYAoMlk8phssmcCltLMNTAFOlFDlc2l0amMxjomAAjAA5AA2tMaHcfplZk1blVDqtuoNXjoAAE' + 
	'BA=>▲</a><br><solidline># birth: Date</solidline><br>+ getCurrentAge(): int<r><a 2;e64=gA8ABjAA+AECMwAM8DABvABshoAOQAEAAHA' + 
	'AGEWjEajMGNoAMoAOgANERMgAOcHAAvAEJhcEh0Qh0Tg0CmkqMMFlUuhkxiMTisXjNCjk6EwAEYAHIAG1MjY7lUsnkwh8/nUClk5gwAAEBA==>▲</a>',Nil,Nil) do
	begin
		ID := 'Person';
		Y := -164;
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
	end;
	with Elements.Add('<solidline> <c><b>Student</b></solidline><br><solidline>+ classes: List<Course> <r><a 1;e64=gA8ABzABvABsABpABkg8JABuABlAA+AAgAEC' + 
	'McTi4AMwAM4AjMGhEGOUVAA4AAwk8plcqihwAElg0wiUlOkOiUEgQvgcFhsKhkIhUQiUUnccj0gn0jmMagUlowAMNOpEfkMNkkmlEqrctjQmAAjAA5AA2sssHcbnkdq1' + 
	'Ln1QtVSjQAAEBA==>▲</a></solidline><br>- attend(class: Course)<r><a 2;e64=gA8ABjAA+AECMwAM8DABvABshoAOQAEAAHAAGEWjEajMGNoAM' + 
	'oAOgANERMgAOcHAAvAEJhcEh0Qh0Tg0CmkqMMFlUuhkxiMTisXjNCjk6EwAEYAHIAG1MjY7lUsnkwh8/nUClk5gwAAEBA==>▲</a><br>- sleep()',Nil,Nil) do
	begin
		ID := 'Student';
		Y := -64;
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
	end;
	with Links.Add(AxSurface1.Elements.Item['Account'],AxSurface1.Elements.Item['Student'],Nil) do
	begin
		Caption := '<fgcolor A0A0A0><solidline 808080> <c><b>Link</b></solidline><br># count: number <r><a ;exp=12992>➤</a>';
	end;
end
157
Expandable-caption

with AxSurface1 do
begin
	with Elements.Add('<solidline><b>Header</b></solidline><br>Line1<r><a ;exp=show lines>+</a><br>Line2<br>Line3',Nil,Nil) do
	begin
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
	end;
end
156
Fullfit the caption on the element's width

with AxSurface1 do
begin
	with Elements.Add('<solidline><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;properties>+</a><br><solidline>+ balance: Currency = 0</so' + 
	'lidline><br>+ deposit(amount: Currency)<r><a 2;methods>+</a><br>+ withdraw(amount: Currency)',Nil,Nil) do
	begin
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
		BackColor := $f8f8f8;
		AutoSize := False;
		Width := 194;
		Height := 76;
		CaptionAlign := EXSURFACELib.ContentAlignmentEnum($4);
	end;
end
155
Wrap the caption by <br> or "\r\n" sequence only

with AxSurface1 do
begin
	with Elements.Add('<solidline><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;properties>+</a><br><solidline>+ balance: Currency = 0</so' + 
	'lidline><br>+ deposit(amount: Currency)<r><a 2;methods>+</a><br>+ withdraw(amount: Currency)',Nil,Nil) do
	begin
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionBreakWrap;
		BackColor := $f8f8f8;
	end;
end
154
Display a custom tooltip
// MouseMove event - Occurs when the user moves the mouse.
procedure TWinForm1.AxSurface1_MouseMoveEvent(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_MouseMoveEvent);
begin
	with AxSurface1 do
	begin
		ShowToolTip('new content','',Nil,'+8','+8');
	end
end;


153
Shows the tooltip of the object moved relative to its default position
// MouseMove event - Occurs when the user moves the mouse.
procedure TWinForm1.AxSurface1_MouseMoveEvent(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_MouseMoveEvent);
begin
	with AxSurface1 do
	begin
		ShowToolTip('<null>','<null>',Nil,'+8','+8');
	end
end;

with AxSurface1 do
begin
	Elements.Add('Element with a Tooltip',Nil,Nil).ToolTip := 'This is a bit of text that should be displayed when cursor hovers the element.';
end
152
Rename Undo/Redo commands into the control's toolbar

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	ToolBarFormat := '-1,100,101,|,103,104';
	set_ToolBarCaption(100,'<img>1</img>Acasa');
	set_ToolBarCaption(103,'Anuleaza <img>3</img>');
	set_ToolBarCaption(104,'<img>4</img>Reface');
	set_ToolBarToolTip(100,'Restabileste vizualizarea la origine.');
	set_ToolBarToolTip(101,'Mareste vizualizarea.');
	set_ToolBarToolTip(103,'Anuleaza ultima actiune UI. Pentru a anula o actiune apasati Ctrl+Z.');
	set_ToolBarToolTip(104,'Inverseaza cea mai recenta operatie de anulare. Pentru a reface o actiune apasati Ctrl+Y.');
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-48));
		Add('Item <b>2',TObject(32),TObject(32));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	EndUpdate();
end
151
Add Undo/Redo commands to control's toolbar

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	ToolBarFormat := '-1,100,101,|,103,104';
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-48));
		Add('Item <b>2',TObject(32),TObject(32));
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	EndUpdate();
end
150
Clear Undo/Redo queue (method 2)
with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	c := UndoRedoQueueLength;
	UndoRedoQueueLength := 0;
	UndoRedoQueueLength := c;
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
149
Clear Undo/Redo queue (method 1)
with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	AllowUndoRedo := True;
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
148
Removes Redo operations
with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	Undo();
	RedoRemoveAction(TObject(10),Nil);
	OutputDebugString( get_RedoListAction(Nil,Nil) );
	EndUpdate();
end
147
Removes Undo operations
with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	UndoRemoveAction(TObject(10),Nil);
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
146
Record the UI operations as a block of undo/redo operations

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	StartBlockUndoRedo();
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	EndBlockUndoRedo();
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
145
Groups the next to current Undo/Redo Actions in a single block

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	GroupUndoRedoActions(3);
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
144
Limits the number of entries within the Undo/Redo queue

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	UndoRedoQueueLength := 1;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
143
Lists the Redo actions that can be performed on the surface

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	Undo();
	OutputDebugString( get_RedoListAction(Nil,Nil) );
	EndUpdate();
end
142
Lists the Undo actions that can be performed on the surface

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	OutputDebugString( get_UndoListAction(Nil,Nil) );
	EndUpdate();
end
141
Checks whether the Undo operation is possible

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	Undo();
	OutputDebugString( 'CanRedo' );
	OutputDebugString( CanRedo );
	EndUpdate();
end
140
Call Redo by code

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	Undo();
	Redo();
	EndUpdate();
end
139
Checks whether the Undo operation is possible

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	OutputDebugString( 'CanUndo' );
	OutputDebugString( CanUndo );
	EndUpdate();
end
138
Call Undo by code

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	Undo();
	EndUpdate();
end
137
Save the element's properties for Undo/Redo operations, by code

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Item <b>1',TObject(-64),TObject(-64));
		Add('Item <b>2',Nil,Nil);
	end;
	StartBlockUndoRedo();
	with Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
	begin
		h := StartUpdateLink;
		Color := $ff;
		Width := 2;
		ShowDir := False;
		ShowLinkType := EXSURFACELib.ShowLinkTypeEnum.exLinkStraight;
		EndUpdateLink(h);
	end;
	EndBlockUndoRedo();
	EndUpdate();
end
136
No color is restored for the link when Undo/Redo operation is executed

// AddElement event - A new element has been added to the surface.
procedure TWinForm1.AxSurface1_AddElement(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddElementEvent);
begin
	// Element.ShowCheckBox = True
	// Element.CheckBoxAlign = 2
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Check <b>1',TObject(-64),TObject(-64));
		Add('Check <b>2',Nil,Nil).Checked := EXSURFACELib.CheckStateEnum.exChecked;
	end;
	StartBlockUndoRedo();
	with Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
	begin
		h := StartUpdateLink;
		Color := $ff;
		Width := 2;
		ShowDir := False;
		ShowLinkType := EXSURFACELib.ShowLinkTypeEnum.exLinkStraight;
		EndUpdateLink(h);
	end;
	EndBlockUndoRedo();
	EndUpdate();
end
135
Save the element's properties for Undo/Redo operations, by code

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	Elements.Add('Item <b>1',TObject(-64),TObject(-64));
	StartBlockUndoRedo();
	with Elements.Add('Item <b>2',Nil,Nil) do
	begin
		h := StartUpdateElement;
		BackColor := $0;
		ForeColor := $ffffff;
		BorderColor := $ff;
		EndUpdateElement(h);
	end;
	EndBlockUndoRedo();
	EndUpdate();
end
134
No color is restored for the element when Undo/Redo operation is executed

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	Elements.Add('Item <b>1',TObject(-64),TObject(-64));
	StartBlockUndoRedo();
	with Elements.Add('Item <b>2',Nil,Nil) do
	begin
		h := StartUpdateElement;
		BackColor := $0;
		ForeColor := $ffffff;
		BorderColor := $ff;
		EndUpdateElement(h);
	end;
	EndBlockUndoRedo();
	EndUpdate();
end
133
How can I ensure that a specified element fits the surface's visible area

with AxSurface1 do
begin
	with Elements do
	begin
		with Add('Element A',TObject(-100),Nil).Pattern do
		begin
			Type := EXSURFACELib.PatternEnum.exPatternBDiagonal;
			Color := $e0e0e0;
		end;
		Add('Element B',TObject(2000),Nil).EnsureVisible();
	end;
end
132
LayoutEndChanging(exUndo), LayoutEndChanging(exRedo) or LayoutEndChanging(exUndoRedoUpdate) notifiy your application once a Undo/Redo operation is executed (CTRL+Z, CTRL+Y) or updated

// AddElement event - A new element has been added to the surface.
procedure TWinForm1.AxSurface1_AddElement(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddElementEvent);
begin
	// Element.ShowCheckBox = True
	// Element.CheckBoxAlign = 2
end;

// LayoutEndChanging event - Notifies your application once the control's layout has been changed.
procedure TWinForm1.AxSurface1_LayoutEndChanging(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_LayoutEndChangingEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'LayoutEndChanging' );
		OutputDebugString( e.operation );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Check <b>1',TObject(-64),TObject(-64));
		Add('Check <b>2',Nil,Nil).Checked := EXSURFACELib.CheckStateEnum.exChecked;
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	EndUpdate();
end
131
Turn on the Undo/Redo feature

// AddElement event - A new element has been added to the surface.
procedure TWinForm1.AxSurface1_AddElement(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddElementEvent);
begin
	// Element.ShowCheckBox = True
	// Element.CheckBoxAlign = 2
end;

with AxSurface1 do
begin
	BeginUpdate();
	AllowUndoRedo := True;
	with Elements do
	begin
		Add('Check <b>1',TObject(-64),TObject(-64));
		Add('Check <b>2',Nil,Nil).Checked := EXSURFACELib.CheckStateEnum.exChecked;
	end;
	Links.Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	EndUpdate();
end
130
ImageSize property on 32 (specifies the size of control' icons/images/check-boxes/radio-buttons)

// AddElement event - A new element has been added to the surface.
procedure TWinForm1.AxSurface1_AddElement(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddElementEvent);
begin
	// Element.ShowCheckBox = True
end;

with AxSurface1 do
begin
	BeginUpdate();
	ImageSize := 32;
	Font.Size := 16;
	Images('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');
	with VisualAppearance do
	begin
		Add(1,'gBFLBCJwBAEHhEJAAEhABfICg6AADACAxRDgMQBQKAAzQFAYbhkGCGAAGMZxRgmFgAQhFcZQSKUOQTDKMIziaQAGgkNQwCSLIwjNIsBxPFKVQChEYxSjKA40SJNUgyj6' + 
	'CCY+QLIE5PfQgAL9I6eJABCCSQKkYx0HScRiwPBIbAZAYhCZqaKhWgkKI/WBQIABRDVLx5ESiLRtKy7Mq2bpvXBcNxXHalaztO68LxvKyqHb5fJ/PpgL4YHgmC4NQ7EM' + 
	'RwF6rfbyfZ7Xg/ORPTijZ4sdzMHTzJyscx3HqfaBoOaZU5eMLceTUMofHIndxCcasPbsOatVqjG5sYjcGC3La9cz3Pq/bpuDCbMxuaK1TrYXr1TTrcofBDldAxXRKDxR' + 
	'DWVhLnYOw9i6XxzjuXprCaOoKB6EwbiCZZCGOdZYlcT4xHmbhMnwNxtn+G5bmqdZ7n4Pw/i+X5zm+dQ9g4CAFjsfAJheOI8HsDoWDWTB/lwSAQkmA5PEgRYoDyDwYFYF' + 
	'oFmGCBmBqBphDgRJ0gOTIYBGRB/lyRh0iSCZbjYWJzgWDwIjYLoLmMCJGDKDJjBgWgqG6YhyhGHRzA2aJ1mCABOAiOJvhCZBJBYRoRmSCQmEqEQimkAZgg8TZnDCV4Uk' + 
	'mCUmBKZYJGYWoWCUUhiFMNZckNUh2GENoaGaGZmgmJhqhqZpGGIEx2GYIxSGGGJdggWJth2Z4JmYeoemeSZ2H6H4hGmQhihyTRHGYLg7CiCgmgqIpokoNoOiOaJ4jqAo' + 
	'chqaZGgaCxpAoZoaiaaJqEmWIcGgShcnCJwqEqFoR3YOoFlgchflqNouiuawHmWSYqGkWZQhcatzmaOoumuSp2j6L5bBaKo0GQKRnGGCxqiyCwmkqMpsksNpOGUGI7A0' + 
	'ew1G0Rxlg0PptgsZuDG2Sx2l6N5tnYNZZjUDRXDCVo5l2FoymqOpukuNpujubwLjmWY5k0ZwxkaFxYlWdp6j6b5Lnafo/nABQdg2FxcUsY5BkmXAkmeQpckwNRrkKTh8' + 
	'CSHZBk4NwyC4KxxgMDwakOMZDn8GgwnGAo2C4cwthMcwmCcMoHBMHRehwTIghySYNksZwcH4HBMEsHx5hyPItiweYxnwSZEH4Mozn0fR+DMAo7EYJ50gkdZelKdNql2U' + 
	'gJn0GIukwH4HicQRai2GI4mSVpNl0dZGledgNgcYpYDWUx3FsOQi5YV5anaTY3G6W53A2RxylydxFjiaxEFCCgBBAQ==');
		Add(2,'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' + 
	'RBCCQAgQEA==');
		Add(3,'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');
	end;
	set_Background(EXSURFACELib.BackgroundPartEnum.exCheckBoxState0,$1000000);
	set_Background(EXSURFACELib.BackgroundPartEnum.exCheckBoxState1,$2000000);
	set_Background(EXSURFACELib.BackgroundPartEnum.exCheckBoxState2,$3000000);
	with Elements do
	begin
		var_Element := AxSurface1.Elements.Add('Element Check 1',TObject(-64),TObject(-64));
		Add('Child',Nil,Nil).Parent := (var_Element as EXSURFACELib.Element);
		with var_Element do
		begin
			Pictures := '1/2';
			Expanded := False;
		end;
		with Add('Element Check 2',TObject(32),TObject(96)) do
		begin
			Checked := EXSURFACELib.CheckStateEnum.exChecked;
			Pictures := '1,2';
		end;
	end;
	Home();
	EndUpdate();
end
129
ImageSize property on 16 (default) (specifies the size of control' icons)

// AddElement event - A new element has been added to the surface.
procedure TWinForm1.AxSurface1_AddElement(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddElementEvent);
begin
	// Element.ShowCheckBox = True
end;

with AxSurface1 do
begin
	BeginUpdate();
	ImageSize := 16;
	Images('gBJJgBAIDAAEg4ACEKAD/hz/EMNh8TIRNGwAjEZAEXjAojJAjMLjABAAgjUYkUnlUrlktl0vmExmUzmk1m03nE5nU7nkrQCAntBoVDolFo1HoM/ADAplLptImdMYFOqd' + 
	'SqlXq1QrVbrlGpVWsFNrNdnNjsk7pQAtNroFnt0sh8Yr9iulTuNxs1Eu8OiT/vsnsNVutXlk/oGGtVKxGLxWNtsZtN8iUYuNvy0Zvd+xNYwdwvl4p870GCqc8vOeuVtt' + 
	'mp1knyOayWVy+WzN/ze1wOElenm+12WUz/Bv2/3UyyWrzeutux2GSyGP2dQ33C1ur3GD3M4zUNzHdlWjq/E3nGzVpjWv4HA7fRy/Tv2IrN8rPW6nZ3ve7mUlfu20Z8ac' + 
	'vQyb+vY9jasYoDwMm+LytVBDqKG3z8O3Cb8P+mkAuY9cCQ2uL4KaxDKvkp8RNLEjqugnrwQo/UWPzFyeQw5sNLZFENrI4kOqU66pw8uzmOKvTqNqjULJvGL1JO48GtTG' + 
	'sbLdEL3scxLlyiw8dQeoUVxdLTtyKmUjwGlslRPJsnK1HbAKbKCrsQo8uQk/CeP44iaR/ATnTNPLvyxPU+z9P9AUDQVBowiofJXQ6Oo+kKMpIkjztE4TKn4P6JowfgPn' + 
	'wD5/nAjB8AOeAPo0eAA1IAFH07UhAIMpYAVIYFHqBUhwVjV1S1EtQAHxW65V0AZwAeuQAnwB5gAPYViEDVhwAHTQBkCjB4gOhwDmCyhH0sACAg==');
	with Elements do
	begin
		var_Element := AxSurface1.Elements.Add('Element Check 1',TObject(-64),TObject(-64));
		Add('Child',Nil,Nil).Parent := (var_Element as EXSURFACELib.Element);
		with var_Element do
		begin
			Pictures := '1/2';
			Expanded := False;
		end;
		with Add('Element Check 2',TObject(0),TObject(32)) do
		begin
			Checked := EXSURFACELib.CheckStateEnum.exChecked;
			Pictures := '1,2';
		end;
	end;
	Home();
	EndUpdate();
end
128
We want to have option to start/end connectors at the middle of each side of the elements

with AxSurface1 do
begin
	BeginUpdate();
	ShowLinks := EXSURFACELib.ShowExtendedLinksEnum.exShowLinks;
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
	end;
	FitToClient();
	EndUpdate();
end
127
How can I determine the position the user clicks within the element's boundaries (Click event)

// Click event - Occurs when the user presses and then releases the left mouse button over the control.
procedure TWinForm1.AxSurface1_ClickEvent(sender: System.Object; e: System.EventArgs);
begin
	with AxSurface1 do
	begin
		e := (get_ElementFromPoint(-1,-1) as Object);
		X := -1;
		Y := -1;
		PointToPosition(X,Y);
			OutputDebugString( e );
		OutputDebugString( X );
		OutputDebugString( Y );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		Add('Element 1',Nil,Nil);
		Add('Element 2',TObject(128),TObject(64));
	end;
	FitToClient();
	EndUpdate();
end
126
How can I determine the position the user clicks within the element's boundaries (MouseMove event)

// MouseMove event - Occurs when the user moves the mouse.
procedure TWinForm1.AxSurface1_MouseMoveEvent(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_MouseMoveEvent);
begin
	with AxSurface1 do
	begin
		e := (get_ElementFromPoint(e.x,e.y) as Object);
		PointToPosition(e.x,e.y);
			OutputDebugString( e );
		OutputDebugString( e.x );
		OutputDebugString( e.y );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		Add('Element 1',Nil,Nil);
		Add('Element 2',TObject(128),TObject(64));
	end;
	FitToClient();
	EndUpdate();
end
125
How can I convert the screen position (mouse) to surface position

// MouseMove event - Occurs when the user moves the mouse.
procedure TWinForm1.AxSurface1_MouseMoveEvent(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_MouseMoveEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( 'Point ' );
		OutputDebugString( e.x );
		OutputDebugString( e.y );
		PointToPosition(e.x,e.y);
		OutputDebugString( 'Position ' );
		OutputDebugString( e.x );
		OutputDebugString( e.y );
	end
end;

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil);
	end;
	FitToClient();
	AxisStyle := EXSURFACELib.LinesStyleEnum($c0);
	AxisColor := Color.FromArgb(128,128,128);
	EndUpdate();
end
124
Is is possible to show just the positive coordinates

with AxSurface1 do
begin
	BeginUpdate();
	Coord := Integer(EXSURFACELib.CoordEnum.exAllowPositiveOnly) Or Integer(EXSURFACELib.CoordEnum.exCartesian);
	AxisColor := Color.FromArgb(128,128,128);
	AxisStyle := Integer(EXSURFACELib.LinesStyleEnum.exLinesThick) Or Integer(EXSURFACELib.LinesStyleEnum.exLinesDot4);
	ShowLinks := EXSURFACELib.ShowExtendedLinksEnum.exShowLinks;
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
	end;
	FitToClient();
	EndUpdate();
end
123
Cartesian coordinates (positive coordinates are shown top-right to the origin)

with AxSurface1 do
begin
	BeginUpdate();
	Coord := EXSURFACELib.CoordEnum.exCartesian;
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil);
	end;
	FitToClient();
	EndUpdate();
end
122
Default coordinates (positive coordinates are shown bottom-right to the origin)

with AxSurface1 do
begin
	BeginUpdate();
	Coord := EXSURFACELib.CoordEnum.exDefCoord;
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil);
	end;
	FitToClient();
	EndUpdate();
end
121
Is it possible to customize the path of the links orthogonally similar with Microsoft Visio tool

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint);
	with Elements do
	begin
		Add('Element <sha ;;0>1',Nil,Nil);
		Add('Element <sha ;;0>2',TObject(164),TObject(64));
		Add('Element <sha ;;0>3',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil);
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil);
	end;
	Zoom := 200;
	FitToClient();
	EndUpdate();
end
120
Does your control supports OLE Drag and Drop
// OLEDragDrop event - Occurs when a source component is dropped onto a target component when the source component determines that a drop can occur.
procedure TWinForm1.AxSurface1_OLEDragDrop(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_OLEDragDropEvent);
begin
	with AxSurface1 do
	begin
		OutputDebugString( e.data );
	end
end;

// OLEStartDrag event - Occurs when the OLEDrag method is called.
procedure TWinForm1.AxSurface1_OLEStartDrag(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_OLEStartDragEvent);
begin
	// Data.SetData("some data to drag")
end;

with AxSurface1 do
begin
	OLEDropMode := EXSURFACELib.exOLEDropModeEnum.exOLEDropManual;
	with Elements.Add('Click the Element wait for .5 second until + cursor is shown, to start <b>OLE Drag and Drop</b>',Nil,Nil) do
	begin
		CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionWordWrap;
		AutoSize := False;
		Width := 256;
		Height := 56;
	end;
end
119
Is it possible to disable customizing the path of a specified link

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			Color := $808080;
			AllowControlPoint := EXSURFACELib.LinkControlPointEnum.exNoControlPoint;
		end;
	end;
	Zoom := 200;
	FitToClient();
	EndUpdate();
end
118
How do I let user customizes the link's path

with AxSurface1 do
begin
	BeginUpdate();
	AllowLinkControlPoint := EXSURFACELib.LinkControlPointEnum($ffffff80 Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeTo) Or Integer(EXSURFACELib.LinkControlPointEnum.exAllowChangeFrom) Or Integer(EXSURFACELib.LinkControlPointEnum.exOrthoArrange) Or Integer(EXSURFACELib.LinkControlPointEnum.exMiddleControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exEndControlPoint) Or Integer(EXSURFACELib.LinkControlPointEnum.exStartControlPoint));
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(164),TObject(64));
		Add('Element <sha ;;0>B',TObject(0),TObject(132));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(2)],Nil).CustomPath := '0.5,0.25,0.5,.75';
		with Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			ShowLinkType := Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkStraight) Or Integer(EXSURFACELib.ShowLinkTypeEnum.exLinkDirect);
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
		end;
	end;
	Zoom := 200;
	FitToClient();
	EndUpdate();
end
117
How can I generate a picture/image/graph from my diagram
with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',Nil,Nil).ID := 'B';
		Add('Element C',Nil,Nil).ID := 'C';
		Add('Element D',Nil,Nil).ID := 'D';
		Add('Element E',Nil,Nil).ID := 'E';
		Add('Element E',Nil,Nil).ID := 'F';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['D'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['E'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['F'],Nil);
	end;
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeCompact,TObject(False));
	Arrange(Nil);
	var_CopyTo := get_CopyTo('c:/temp/xtest.jpg');
	OutputDebugString( '!!!check the file c:/temp/xtest.jpg!!!' );
end
116
How can I generate a picture/image/graph from my diagram
with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',Nil,Nil).ID := 'B';
		Add('Element C',Nil,Nil).ID := 'C';
		Add('Element D',Nil,Nil).ID := 'D';
		Add('Element E',Nil,Nil).ID := 'E';
		Add('Element E',Nil,Nil).ID := 'F';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['D'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['E'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['F'],Nil);
	end;
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeCompact,TObject(False));
	Arrange(Nil);
	with (ComObj.CreateComObject(ComObj.ProgIDToClassID('Exontrol.Print')) as EXPRINTLib.Print) do
	begin
		PrintExt := (AxSurface1.GetOcx() as EXSURFACELib.Surface).DefaultDispatch;
		CopyTo('c:/temp/xtest.jpg');
	end;
	OutputDebugString( '!!!check the file c:/temp/xtest.jpg!!!' );
end
115
How can I print the component
with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(0),TObject(76));
		with Add('Element <sha ;;0>C',TObject(-76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
		with Add('Element <sha ;;0>D',TObject(76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
	end;
	with Links do
	begin
		with Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		with Add(AxSurface1.Elements.Item[TObject(2)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(4)],Nil);
		with Add(AxSurface1.Elements.Item[TObject(4)],AxSurface1.Elements.Item[TObject(3)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.RightAlignment;
		end;
	end;
	with (ComObj.CreateComObject(ComObj.ProgIDToClassID('Exontrol.Print')) as EXPRINTLib.Print) do
	begin
		PrintExt := (AxSurface1.GetOcx() as EXSURFACELib.Surface).DefaultDispatch;
		Preview();
	end;
end
114
How can I show direct-links

with AxSurface1 do
begin
	ShowLinksType := EXSURFACELib.ShowLinkTypeEnum.exLinkDirect;
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',TObject(128),TObject(64)).ID := 'B';
		Add('Element C',TObject(128),TObject(-64)).ID := 'C';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
	end;
end
113
How can I show straight-links

with AxSurface1 do
begin
	ShowLinksType := EXSURFACELib.ShowLinkTypeEnum.exLinkStraight;
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',TObject(128),TObject(64)).ID := 'B';
		Add('Element C',TObject(128),TObject(-64)).ID := 'C';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
	end;
end
112
How can I show round-links

with AxSurface1 do
begin
	ShowLinksType := EXSURFACELib.ShowLinkTypeEnum.exLinkRound;
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',TObject(128),TObject(64)).ID := 'B';
		Add('Element C',TObject(128),TObject(-64)).ID := 'C';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
	end;
end
111
I've tried to insert a "<br>" in the Caption property text and it just ignores it

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		with Add('caption',Nil,Nil) do
		begin
			CaptionSingleLine := EXSURFACELib.CaptionSingleLineEnum.exCaptionWordWrap;
			Caption := 'first caption<br>second caption<br>third caption';
		end;
	end;
	EndUpdate();
end
110
How do I align the extra-caption

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		with Add('caption',Nil,Nil) do
		begin
			AutoSize := False;
			Width := 128;
			Height := 64;
			ExtraCaption := 'extra-caption';
			ExtraCaptionAlign := EXSURFACELib.ContentAlignmentEnum.exBottomRight;
		end;
	end;
	EndUpdate();
end
109
How can I add an extra caption

with AxSurface1 do
begin
	BeginUpdate();
	with Elements do
	begin
		Add('caption',Nil,Nil).ExtraCaption := 'extra-caption';
	end;
	EndUpdate();
end
108
I am using the reserve-neighbors feature, the question is how to shift left/right the neighbors instead of up/down
with AxSurface1 do
begin
	BeginUpdate();
	AllowMoveNeighbors := EXSURFACELib.MoveNeighborsEnum.exMoveNeighborsHorizontally;
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeDir,TObject(1));
	AllowInsertObject := False;
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B ( move it )',TObject(16),TObject(32));
		Add('Element <sha ;;0>C',TObject(128),TObject(0));
	end;
	EndUpdate();
end
107
I am using the reserve-neighbors feature, the question is if possible to specify the distance between neighbors
with AxSurface1 do
begin
	BeginUpdate();
	AllowMoveNeighbors := EXSURFACELib.MoveNeighborsEnum.exMoveNeighborsVertically;
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeDX,TObject(0));
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeDY,TObject(0));
	AllowInsertObject := False;
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B ( move it )',TObject(0),TObject(32));
		Add('Element <sha ;;0>C',TObject(0),TObject(64));
	end;
	EndUpdate();
end
106
How do I enable the reserve-neighbors feature
with AxSurface1 do
begin
	BeginUpdate();
	AllowMoveNeighbors := EXSURFACELib.MoveNeighborsEnum.exMoveNeighborsVertically;
	AllowInsertObject := False;
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B ( move it )',TObject(0),TObject(32));
		Add('Element <sha ;;0>C',TObject(0),TObject(64));
	end;
	EndUpdate();
end
105
I've noticed that recently, the elements get compacted once the Arrange method is performed. How can I prevent that

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element A',Nil,Nil).ID := 'A';
		Add('Element B',Nil,Nil).ID := 'B';
		Add('Element C',Nil,Nil).ID := 'C';
		Add('Element D',Nil,Nil).ID := 'D';
		Add('Element E',Nil,Nil).ID := 'E';
		Add('Element E',Nil,Nil).ID := 'F';
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['B'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['D'],Nil);
		Add(AxSurface1.Elements.Item['B'],AxSurface1.Elements.Item['C'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['E'],Nil);
		Add(AxSurface1.Elements.Item['A'],AxSurface1.Elements.Item['F'],Nil);
	end;
	set_DefArrange(EXSURFACELib.DefArrangeEnum.exDefArrangeCompact,TObject(False));
	Arrange(Nil);
end
104
Is it possible to add a link to show from bottom/down to top/up, rather that right to left (method-2)

// AddLink event - A new link has been added to the links collection.
procedure TWinForm1.AxSurface1_AddLink(sender: System.Object; e: AxEXSURFACELib._ISurfaceEvents_AddLinkEvent);
begin
	with AxSurface1 do
	begin
		with e.link do
		begin
		end;
	end
end;

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(48),TObject(48));
	end;
	with Links do
	begin
		Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil);
	end;
end
103
Is it possible to add a link to show from bottom/down to top/up, rather that right to left (method-1)

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(48),TObject(48));
	end;
	with Links do
	begin
		with Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.DownAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.UpAlignment;
		end;
	end;
end
102
How do I enable the cross link support ( mixed )

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(0),TObject(76));
		with Add('Element <sha ;;0>C',TObject(-76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
		with Add('Element <sha ;;0>D',TObject(76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
	end;
	with Links do
	begin
		with Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		with Add(AxSurface1.Elements.Item[TObject(2)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(4)],Nil);
		with Add(AxSurface1.Elements.Item[TObject(4)],AxSurface1.Elements.Item[TObject(3)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.RightAlignment;
		end;
	end;
	ShowLinks := Integer(EXSURFACELib.ShowExtendedLinksEnum.exShowCrossLinksMixt) Or Integer(EXSURFACELib.ShowExtendedLinksEnum.exShowExtendedLinks);
end
101
How do I enable the cross link support ( triangular )

with AxSurface1 do
begin
	with Elements do
	begin
		Add('Element <sha ;;0>A',Nil,Nil);
		Add('Element <sha ;;0>B',TObject(0),TObject(76));
		with Add('Element <sha ;;0>C',TObject(-76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
		with Add('Element <sha ;;0>D',TObject(76),TObject(32)) do
		begin
			AutoSize := False;
			Height := 32;
		end;
	end;
	with Links do
	begin
		with Add(AxSurface1.Elements.Item[TObject(1)],AxSurface1.Elements.Item[TObject(2)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		with Add(AxSurface1.Elements.Item[TObject(2)],AxSurface1.Elements.Item[TObject(1)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.CenterAlignment;
		end;
		Add(AxSurface1.Elements.Item[TObject(3)],AxSurface1.Elements.Item[TObject(4)],Nil);
		with Add(AxSurface1.Elements.Item[TObject(4)],AxSurface1.Elements.Item[TObject(3)],Nil) do
		begin
			StartPos := EXSURFACELib.AlignmentEnum.LeftAlignment;
			EndPos := EXSURFACELib.AlignmentEnum.RightAlignment;
		end;
	end;
	ShowLinks := Integer(EXSURFACELib.ShowExtendedLinksEnum.exShowCrossLinksTriangle) Or Integer(EXSURFACELib.ShowExtendedLinksEnum.exShowExtendedLinks);
end