Description
This example shows how to create a TTreeView component dynamically,
with coloured nodes.
The default colors are contained in an array. In the final application,
the default colors could be changed via a color dialog. The two components in
this example TreeView1 and Button1, are created dynamically.
TreeViewColors.cpp
TreeViewColors.h
Copyright © 1997-2002 Rodolfo A. Frino. All rights reserved.
#include <vcl.h>
#pragma hdrstop
#include "TreeView.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TTreeView* TreeView1;
const int DIM_COLORS = 11;
TColor Colors[DIM_COLORS] = { clLime, clRed, clBlue,
clGreen, clPurple, (TColor)0xe4bc77,
clFuchsia, clMaroon, (TColor)0x995915,
(TColor)0x009977, clTeal };
enum NodeIndex
{
VEHICLE = 1,
AIR_VEHICLE,
LAND_VEHICLE,
WATER_VEHICLE,
AIR_VEHICLE_MAN,
AIR_VEHICLE_UNMAN,
LAND_VEHICLE_MAN,
LAND_VEHICLE_UNMAN,
WATER_VEHICLE_MAN,
WATER_VEHICLE_UNMAN,
TOTAL_NODES = WATER_VEHICLE_UNMAN,
};
TTreeNode* gNode[TOTAL_NODES];
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//Create a TTreeView Component: TreeView1
TreeView1 = new TTreeView( this );
TreeView1->Parent = this;
TreeView1->Left = 20;
TreeView1->Top = 10;
TreeView1->Width = 300;
TreeView1->Height = 450;
TreeView1->Color = clBlack;
TreeView1->OnCustomDrawItem = TreeView1CustomDrawItem;
//Create a TButton component: Button1
TButton* Button1 = new TButton( this );
Button1->Parent = this;
Button1->Left = TreeView1->Left + TreeView1->Width + 150;
Button1->Top = TreeView1->Top;
Button1->Width = 150;
Button1->Height = 50;
Button1->Caption = "Show Tree View";
Button1->OnClick = Button1Click;
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TreeView1->Items->Clear(); // remove any existing nodes
//Add the root
TreeView1->Items->Add(NULL, "Vehicle");
//Add node (gNode[1]) to the root: Vehicle
gNode[VEHICLE] = TreeView1->Items->Item[0];
//AIR -----------------------------------------------------------
TreeView1->Items->AddChild( gNode[VEHICLE],"Air Vehicle");
//Add node to Air Vehicle
gNode[AIR_VEHICLE] = TreeView1->Items->Item[1];
TreeView1->Items->AddChild( gNode[AIR_VEHICLE],"Air Manned" );
TreeView1->Items->AddChild( gNode[AIR_VEHICLE],"Air Unmanned" );
//Add node to Air Vehicle-Manned
gNode[AIR_VEHICLE_MAN] = TreeView1->Items->Item[2];
TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Airplane" );
TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Baloon" );
TreeView1->Items->AddChild( gNode[AIR_VEHICLE_MAN],"Helicopter" );
//Add node to Air Vehicle-Unmanned:
gNode[AIR_VEHICLE_UNMAN] = TreeView1->Items->Item[6];
TreeView1->Items->AddChild( gNode[AIR_VEHICLE_UNMAN],
"Remote Controlled airplane" );
//LAND ----------------------------------------------------------
TreeView1->Items->AddChild( gNode[VEHICLE],"Land Vehicle");
//Add node Land Vehicle
gNode[LAND_VEHICLE] = TreeView1->Items->Item[8];
TreeView1->Items->AddChild( gNode[LAND_VEHICLE],"Land Manned" );
TreeView1->Items->AddChild( gNode[LAND_VEHICLE],"Land Unmanned" );
//Add node to Land Vehicle-Manned
gNode[LAND_VEHICLE_MAN] = TreeView1->Items->Item[9];
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Automobile" );
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Bus" );
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Truck" );
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_MAN],"Train" );
//Add node to Land Vehicle-Unmanned:
gNode[LAND_VEHICLE_UNMAN] = TreeView1->Items->Item[14];
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_UNMAN],"Robot Lander" );
TreeView1->Items->AddChild( gNode[LAND_VEHICLE_UNMAN],"Remote controlled vehicle" );
//WATER ----------------------------------------------------------
TreeView1->Items->AddChild( gNode[VEHICLE],"Water Vehicle");
//Add node Water Vehicle
gNode[WATER_VEHICLE] = TreeView1->Items->Item[17];
TreeView1->Items->AddChild( gNode[WATER_VEHICLE],"Water Manned" );
TreeView1->Items->AddChild( gNode[WATER_VEHICLE],"Water Unmmaned" );
//Add node to Water Vehicle-Manned:
gNode[WATER_VEHICLE_MAN] = TreeView1->Items->Item[18];
TreeView1->Items->AddChild( gNode[WATER_VEHICLE_MAN],"Boat" );
TreeView1->Items->AddChild( gNode[WATER_VEHICLE_MAN],"Ship" );
//Add node to Water Vehicle-Unmanned:
gNode[WATER_VEHICLE_UNMAN] = TreeView1->Items->Item[21];
TreeView1->Items->AddChild( gNode[WATER_VEHICLE_UNMAN],"Remote controlled sub" );
TreeView1->Items->AddChild( gNode[WATER_VEHICLE_UNMAN],
"Remote controlled boat" );
}
//-------------------------------------------------------------
void __fastcall TForm1::TreeView1CustomDrawItem( TCustomTreeView *Sender,
TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw )
{
//
TCanvas *pCanvas = TreeView1->Canvas;
TreeView1->Canvas->Font->Color = clGray;
for ( int i=1; i <= TOTAL_NODES; i++ )
{
if ( Node == gNode[i] )
{
//It is one of the gNodes
TreeView1->Canvas->Font->Color = Colors[i];
}
else
{
//It is not a gNode
if ( State.Contains( cdsSelected ) )
{
TreeView1->Canvas->Font->Color = clWhite;
TreeView1->Canvas->Brush->Color = clBlue;
}
}
}
}
//-------------------------------------------------------------
#ifndef TreeViewH
#define TreeViewH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall Button1Click(TObject *Sender);
void __fastcall TreeView1CustomDrawItem(TCustomTreeView *Sender,
TTreeNode *Node,
TCustomDrawState State,
bool &DefaultDraw);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif