Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, VirtualTrees;
- const
- MergedNodeCount = 3;
- type
- TNodeType = (
- ntClassic,
- ntMerged
- );
- TViewStyle = (
- tvsClassic,
- tvsMerged
- );
- PNodeData = ^TNodeData;
- TNodeData = record
- NodeType: TNodeType;
- case Integer of
- 0: (
- Value1: string[25];
- Value2: Integer;
- Value3: TDateTime);
- 1: (
- MergedNodes: array[0..MergedNodeCount - 1] of PNodeData);
- end;
- type
- TForm1 = class(TForm)
- VirtualTree: TVirtualStringTree;
- RadioGroup1: TRadioGroup;
- procedure FormCreate(Sender: TObject);
- procedure VirtualTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
- procedure RadioGroup1Click(Sender: TObject);
- private
- FViewStyle: TViewStyle;
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- procedure TForm1.FormCreate(Sender: TObject);
- var
- I, J: Integer;
- ChildData: PNodeData;
- ChildNode: PVirtualNode;
- MergedData: PNodeData;
- MergedNode: PVirtualNode;
- ParentData: PNodeData;
- ParentNode: PVirtualNode;
- begin
- VirtualTree.DefaultText := '';
- VirtualTree.NodeDataSize := SizeOf(TNodeData);
- VirtualTree.BeginUpdate;
- try
- for I := 1 to 5 do
- begin
- ParentNode := VirtualTree.AddChild(nil);
- ParentData := VirtualTree.GetNodeData(ParentNode);
- ParentData.NodeType := ntClassic;
- ParentData.Value1 := Format('Parent %d', [I]);
- // ParentData.Value2 := ...;
- // ParentData.Value3 := ...;
- MergedNode := VirtualTree.AddChild(ParentNode);
- MergedData := VirtualTree.GetNodeData(MergedNode);
- MergedData.NodeType := ntMerged;
- VirtualTree.IsVisible[MergedNode] := False;
- for J := Low(MergedData.MergedNodes) to High(MergedData.MergedNodes) do
- begin
- ChildNode := VirtualTree.AddChild(ParentNode);
- ChildData := VirtualTree.GetNodeData(ChildNode);
- ChildData.NodeType := ntClassic;
- ChildData.Value1 := Format('Child %d', [J]);
- // ChildData.Value2 := ...;
- // ChildData.Value3 := ...;
- MergedData.MergedNodes[J] := ChildData;
- end;
- end;
- finally
- VirtualTree.EndUpdate;
- end;
- end;
- procedure TForm1.VirtualTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
- var
- Data: PNodeData;
- begin
- case FViewStyle of
- tvsClassic:
- begin
- if Column = 0 then
- begin
- Data := Sender.GetNodeData(Node);
- CellText := Data.Value1;
- end;
- end;
- tvsMerged:
- begin
- Data := Sender.GetNodeData(Node);
- if Sender.GetNodeLevel(Node) = 0 then
- begin
- if Column = 0 then
- CellText := Data.Value1;
- end
- else
- begin
- if Data.NodeType = ntMerged then
- CellText := Data.MergedNodes[Column].Value1;
- end;
- end;
- end;
- end;
- procedure TForm1.RadioGroup1Click(Sender: TObject);
- var
- ChildData: PNodeData;
- ChildNode: PVirtualNode;
- ParentNode: PVirtualNode;
- begin
- FViewStyle := TViewStyle(RadioGroup1.ItemIndex);
- VirtualTree.BeginUpdate;
- try
- ParentNode := VirtualTree.GetFirstLevel(0);
- while Assigned(ParentNode) do
- begin
- ChildNode := VirtualTree.GetLastChild(ParentNode);
- while Assigned(ChildNode) do
- begin
- ChildData := VirtualTree.GetNodeData(ChildNode);
- VirtualTree.IsVisible[ChildNode] := not (FViewStyle = tvsClassic) xor (ChildData.NodeType = ntClassic);
- ChildNode := VirtualTree.GetPreviousSibling(ChildNode);
- end;
- ParentNode := VirtualTree.GetNextLevel(ParentNode, 0);
- end;
- finally
- VirtualTree.EndUpdate;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement