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?