VirtualTreeView - como adicionar nós e subnós a partir de um TMenu e seus itens |
Top Previous Next |
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, VirtualTrees, ImgList, Menus, DB, DBClient, Grids, DBGrids, ExtCtrls;
type TForm1 = class(TForm) Tree: TVirtualStringTree; Menu: TMainMenu; {...} Panel1: TPanel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); procedure TreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); procedure Button1Click(Sender: TObject); private end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses ARotinasUnit;
var CaptionMenu, Nomemenu : string; No_criado : PVirtualNode;
type PDado = ^TDado; TDado = record Descricao : WideString; Nome : String; Level : Integer; end;
procedure TForm1.FormCreate(Sender: TObject); begin Tree.NodeDataSize := SizeOf(TDado); end;
procedure TForm1.TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Dado: PDado; begin Dado := Sender.GetNodeData(Node); if Assigned(Dado) then CellText := Dado.Descricao + ' - Name: ' + Dado.Nome; end;
procedure TForm1.TreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Dado: PDado; begin Dado := Sender.GetNodeData(Node);
with Dado^ do begin Include(InitialStates, ivsExpanded); Level := Sender.GetNodeLevel(Node); Descricao := CaptionMenu; Nome := NomeMenu; Node.CheckType := ctTriStateCheckBox; Sender.CheckState[Node] := csUncheckedNormal; Tree.Expanded[Node] := True; end; No_criado := Node; end;
procedure TForm1.Button1Click(Sender: TObject);
procedure ProcuraFilhos(const ItemMenu : TMenuItem; const NoPai:PVirtualNode); var i : integer; No : TMenuItem; NoAtual : pVirtualNode; Dado : PDado;
begin for I := 0 to Pred(ItemMenu.Count) do begin if ItemMenu.Items[I].Caption = '-' then continue;
NoAtual := No_Criado; CaptionMenu := ItemMenu.Items[I].Caption; NomeMenu := PChar(ItemMenu.Items[I].Name); No_Criado := Tree.AddChild(NoPai);
Dado := Tree.GetNodeData(No_Criado); with Dado^ do begin Level := Tree.GetNodeLevel(No_Criado); Descricao := ItemMenu.Items[I].Caption; Nome := ItemMenu.Items[I].Name; No_Criado.CheckType := ctTriStateCheckBox; Tree.CheckState[No_Criado] := csUncheckedNormal; tree.Expanded[No_Criado] := True; end;
if ItemMenu.Items[I].Count > 0 then ProcuraFilhos(ItemMenu.Items[I],No_Criado); No_Criado := NoAtual; end; end;
var i : integer; Dado: PDado; begin for I := 0 to Pred(Menu.Items.Count) do begin CaptionMenu := Menu.Items[I].Caption; NomeMenu := Pchar(Menu.Items[I].Name); Tree.RootNodeCount := Tree.RootNodeCount + 1; Dado := Tree.GetNodeData(Tree.FocusedNode); ProcuraFilhos(Menu.Items[I],No_Criado); end; end;
end. |