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.