unit FCaPolicyList; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, VirtualTrees, Vcl.Buttons; type PCapEnt = ^TCapEnt; TCapEnt = record sName, sCaNames, sTaskNames: String; end; TFrmCaPolicyList = class(TFrame) vtList: TVirtualStringTree; pnTop: TPanel; btnAdd: TSpeedButton; SpeedButton1: TSpeedButton; procedure btnAddClick(Sender: TObject); procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); private { Private declarations } public { Public declarations } end; implementation uses DCaPolicyInfo, Tocsg.Safe, Tocsg.VirtualTreeViewUtil; {$R *.dfm} procedure TFrmCaPolicyList.btnAddClick(Sender: TObject); var dlg: TDlgCaPolicyInfo; pData: PCapEnt; begin Guard(dlg, TDlgCaPolicyInfo.Create(Self)); if dlg.ShowModal = mrOk then begin vtList.BeginUpdate; try pData := VT_AddChildData(vtList); pData.sName := dlg.CName; pData.sCaNames := dlg.CaNames; pData.sTaskNames := dlg.TaskNames; finally vtList.EndUpdate; end; end; end; procedure TFrmCaPolicyList.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PCapEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TFrmCaPolicyList.vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TCapEnt); end; procedure TFrmCaPolicyList.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PCapEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := pData.sName; 2 : CellText := pData.sCaNames; 3 : CellText := pData.sTaskNames; end; end; end.