In this example:
Unit unit1; interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, classes, comctrls; Type tform1 = Class (tform) treeview1: ttreeview; button1: tbutton; button2: tbutton; Procedure alert (Sender: tobject); Procedure button1click (Sender: tobject); Procedure alert (Sender: tobject; shift: tshiftstate; X, Y: integer); end; var form1: tform1; implementation {$ R *. DFM} {I randomly used different methods to dynamically add data} procedure tform1.formcreate (Sender: tobject); var stream: tmemorystream; begin treeview1.align: = alleft; stream: = tmemorystream. create; with tstringlist. create do begin add ('one-line-extension'); add (#9 + 'one-line extension'); add (#9 + #9 + 'one-class ban '); add (#9 + #9 + #9 + 'warrior 1'); add (#9 + #9 + #9 + 'warrior 2 '); add (#9 + #9 + #9 + 'warrior 3'); add (#9 + #9 + #9 + 'warrior 4 '); add (#9 + #9 + 'second banle'); add (#9 + #9 + 'third banle'); add (#9 + 'second platoon Post '); add (#9 + 'three length'); add ('two connections extension'); add ('Three connections length'); savetostream (Stream); free; end; stream. position: = 0; treeview1.loadfromstream (Stream); stream. free; end; Procedure tform1.button1click (Sender: tobject); begin treeview1.fullexpand; (sender as tbutton ). caption: = 'expand all '; end; Procedure tform1.button2click (Sender: tobject); begin treeview1.fullcollapse; (sender as tbutton ). caption: = 'close all '; end; Procedure tform1.treeview1mousemove (Sender: tobject; shift: tshiftstate; X, Y: integer); var node: ttreenode; begin if Boolean (treeview1.getnodeat (x, y) then begin node: = treeview1.getnodeat (x, y); text: = node. text; end.