Add an icon to a treeview

How do I add an Icon to a TAdvTreeview? Any Icon would be ok right now. In the documentation it gives this example:
procedure TForm1.AdvTreeView1GetNodeIcon(Sender: TObject;
ANode: TAdvTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean;
var AIcon: TGraphic);
begin
AIcon :=
PictureContainer1.Items[Random(PictureContainer1.Items.Count)].Bitmap;
end

However The version I have declares the procedure differently

procedure TfrmDashboard.tvTerritoriesGetNodeIcon(Sender: TObject; ANode:
TAdvTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean; var AIcon:
TAdvBitmap);

AIcon is now a TADVBitmap.
the example line
PictureContainer1.Items[Random(PictureContainer1.Items.Count)].Bitmap;
will not even compile

I have added the treeview nodes tag with either 0 or 1 and just want to load an image based on that value

I was hoping it would be as simple as this:

procedure TfrmDashboard.tvTerritoriesGetNodeIcon(Sender: TObject; ANode:
TAdvTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean; var AIcon:
TAdvBitmap);
begin
AIcon := SomeImageContainer.Items[ANode.DataInteger];
end;

PictureContainer returns a TGraphic class for Items[].Picture.
You need a TBitmap though.
A sample project is attached showing how this can be done.
Project1.zip (54.0 KB)

Bruno,
Thank you so much, that's exactly what I was looking for. You should consider updating the documentation.

Now here is a challenge for you.

I am using the Treeview as a navigation tool. I have a master-Detail relationship that the tree is constructed from, but the Icon selection is based on the record count of the third level master detail, just an Icon for an empty set or a different one for Dataset with record count over 0.
The tree loads fine however, after setting the Node.DataInteger to the record count of the dataset, subsequent calls to GetNodeIcon show the Node.DataInteger as 0, so the same Icon is loaded. Also there are an incredible number of calls to GetNodeIcon after loading the tree. It is not interactive, and I have not even coded a refresh of the Tree yet, so nothing else is calling it.

Notice the first logs show the text and DataInteger properties set correctly, the first 2 Territories have addresses, the next 4 do not, so no problem with the Master-Detail issue.

I use CodeInsight to log events. Here is my code to load the Tree:

procedure TfrmDashboard.LoadTree;
var
TV: TAdvTreeView;
C: TAdvTreeViewColumn;
NType, NFirstTerritory, N: TAdvTreeViewNode;
TypeID: Integer;
DST, DSN, DSA: TDataSet;
begin
// CodeSite.EnterMethod( Self, 'LoadTree' );
DST := dsTypes.DataSet;
DSN := dsTerritoryNames.DataSet;
DSA := dsTreeAddresses.DataSet;
DST.Open;
DST.Refresh;
DSN.Open;
DSA.Open;
NType := nil;
NFirstTerritory := nil;
if DST.RecordCount < 0 then
begin
DSN.Close;
DST.Close;
DSA.Close;
exit;
end;
TV := tvTerritories;
TypeID := -1;
TV.BeginUpdate;
TV.Clear;

// Setup Columns
C := TV.Columns.Add;
C.Width := 100;

DST.First;
while not DST.Eof do
begin
if DST.Fields[TYPE_ID].AsInteger <> TypeID then
begin
NType := TV.AddNode(nil);
NType.Expanded := True; // (DST.RecNo = 1);
NType.Enabled := True;
NType.Extended := True;
NType.Text[0] := DST.Fields[TYPE_NAME].AsString;
TypeID := DST.Fields[TYPE_ID].AsInteger;
end;
while not DSN.Eof do
begin
N := TV.AddNode(NType);
// used to scroll to after loading
if NFirstTerritory = nil then
NFirstTerritory := N;
N.Text[0] := DSN.Fields[TERRITORY_NAME].AsString;
N.DataInteger := DSA.RecordCount;
CodeSite.Send
(Format('TfrmDashboard.LoadTree Node.Text : %s Node.DataInteger: %d',
[N.Text[0], N.DataInteger]));
CodeSite.Send(Format('TfrmDashboard.LoadTree Node recordCount: %d',
[DSA.RecordCount]));
DSN.Next
end;
DST.Next;
end;
DST.First;

//if our database is not empty goto first territory
if Assigned(NFirstTerritory) then
begin
TV.FindNodeByTextAndColumn(NFirstTerritory.Text[0], 0);
FViewModel.SelectTerritory(NFirstTerritory.Text[0]);
SetAddressLabel(NFirstTerritory.Text[0]);
TV.ScrollToNode(NFirstTerritory);
TV.SelectNode(NFirstTerritory);
end;

TV.EndUpdate;
end;

Code to set Icon:

procedure TfrmDashboard.tvTerritoriesGetNodeIcon(Sender: TObject;
ANode: TAdvTreeViewVirtualNode; AColumn: Integer; ALarge: Boolean;
var AIcon: TAdvBitmap);
begin
if ANode.Level = 1 then
begin
CodeSite.Send
(Format('TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: %d Node.Text: %s',
[ANode.DataInteger, ANode.Text[0]]));
if ANode.DataInteger = 0 then
AIcon := TAdvBitmap(pcTree.FindBitmap('LOCATIONEMPTY'))
else
AIcon := TAdvBitmap(pcTree.FindBitmap('LOCATIONFILLED'))
end;
end;

and the log file:

TfrmDashboard.LoadTree Node.Text : B-1 Node.DataInteger: 20
TfrmDashboard.LoadTree Node recordCount: 20
TfrmDashboard.LoadTree Node.Text : C-1 Node.DataInteger: 7
TfrmDashboard.LoadTree Node recordCount: 7
TfrmDashboard.LoadTree Node.Text : C-2 Node.DataInteger: 0
TfrmDashboard.LoadTree Node recordCount: 0
TfrmDashboard.LoadTree Node.Text : C-3 Node.DataInteger: 0
TfrmDashboard.LoadTree Node recordCount: 0
TfrmDashboard.LoadTree Node.Text : C-4 Node.DataInteger: 0
TfrmDashboard.LoadTree Node recordCount: 0
TfrmDashboard.LoadTree Node.Text : C-5 Node.DataInteger: 0
TfrmDashboard.LoadTree Node recordCount: 0
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: B-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-1
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-2
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-3
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-4
TfrmDashboard.tvTerritoriesGetNodeIcon Node.DataInteger: 0 Node.Text: C-5

any ideas on why the node losses it's integer value?

Can you please prepare a sample source project that allows us to reproduce this.
It is absolutely not efficient that we try with trial & error to reconstruct what you have based on these bits & pieces.