Thanks for that solution Pieter, it worked perfectly.
For anyone after the final code as an example its listed below.
Unit Browser;
Interface
Uses
AdvTreeView,
AdvTreeViewData,
Generics.Collections,
Generics.Defaults,
Classes;
Type
TMyNodes = Class(TList<TStringList>)
End;
TBrowser = Class(TAdvTreeView)
Private
FStrings: TMyNodes;
Procedure GetNumberOfNodes(aSender: TObject; aNode: TAdvTreeViewVirtualNode; Var aNumberOfNodes: Integer);
Procedure MyNodeCompare(Sender: TObject; Node1, Node2: TAdvTreeViewNode; AColumn: Integer; var ACompareResult: Integer);
Procedure MyGetNodeText(aSender: TObject; aNode: TAdvTreeViewVirtualNode; aColumn: Integer; aMode: TAdvTreeViewNodeTextMode; Var aText: String);
Procedure LoadData;
Protected
Procedure InitializeColumnSorting(AColumn: Integer; ASortMode: TAdvTreeViewNodesSortMode); Override;
Public
Constructor Create(aOwner: TComponent); Override;
Destructor Destroy; Override;
End;
Implementation
Uses
SysUtils;
{ TBrowser }
Constructor TBrowser.Create(aOwner: TComponent);
Begin
Inherited;
FStrings := TMyNodes.Create;
LoadData;
OnGetNumberOfNodes := GetNumberOfNodes;
OnGetNodeText := MyGetNodeText;
OnNodeCompare := MyNodeCompare;
BeginUpdate;
Columns.Clear;
Columns.Add.Text := 'Col 1';
Columns.Add.Text := 'Col 2';
Columns[0].Sorting := tcsNormal;
Columns[1].Sorting := tcsNormal;
EndUpdate;
End;
Procedure TBrowser.LoadData;
Var
i: Integer;
n: TStringList;
Begin
for i:=1 To 100 Do
Begin
n := TStringList.Create;
n.Add('xxx ' + IntToStr(Random(100)));
n.Add('yyy ' + IntToStr(Random(100)));
FStrings.Add(n);
End;
End;
Procedure TBrowser.GetNumberOfNodes(aSender: TObject; aNode: TAdvTreeViewVirtualNode; var aNumberOfNodes: Integer);
Begin
if aNode.Level = -1 then
aNumberOfNodes := FStrings.Count;
End;
Procedure TBrowser.InitializeColumnSorting(AColumn: Integer; ASortMode: TAdvTreeViewNodesSortMode);
Var
Comp: TComparison<TStringList>;
Begin
Inherited;
BeginUpdate;
case aSortMode Of
nsmAscending:
Begin
comp := function(const left,right: TStringList): Integer
Begin
if left[aColumn] < right[aColumn] then
result := -1
else if left[aColumn] > right[aColumn] then
result := 1
else
Result := 0;
End;
FStrings.Sort(TComparer<TStringList>.Construct(Comp));
End;
nsmDescending:
Begin
comp := function(const left,right: TStringList): Integer
Begin
if left[aColumn] < right[aColumn] then
result := 1
else if left[aColumn] > right[aColumn] then
result := -1
else
Result := 0;
End;
FStrings.Sort(TComparer<TStringList>.Construct(Comp));
End;
end;
EndUpdate;
End;
Procedure TBrowser.MyGetNodeText(aSender: TObject; aNode: TAdvTreeViewVirtualNode; aColumn: Integer; aMode: TAdvTreeViewNodeTextMode; var aText: String);
Begin
aText := FStrings[aNode.Row][aColumn];
End;
Procedure TBrowser.MyNodeCompare(Sender: TObject; Node1, Node2: TAdvTreeViewNode; AColumn: Integer; var ACompareResult: Integer);
Begin
if aColumn = 0 then
aCompareResult := 0;
End;
Destructor TBrowser.Destroy;
Begin
Inherited;
End;
End.