Advertisement
TLama

Untitled

Jul 3rd, 2014
553
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.98 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, VirtualTrees;
  8.  
  9. const
  10.   MergedNodeCount = 3;
  11.  
  12. type
  13.   TNodeType = (
  14.     ntClassic,
  15.     ntMerged
  16.   );
  17.  
  18.   TViewStyle = (
  19.     tvsClassic,
  20.     tvsMerged
  21.   );
  22.  
  23.   PNodeData = ^TNodeData;
  24.   TNodeData = record
  25.     NodeType: TNodeType;
  26.     case Integer of
  27.       0: (
  28.         Value1: string[25];
  29.         Value2: Integer;
  30.         Value3: TDateTime);
  31.       1: (
  32.         MergedNodes: array[0..MergedNodeCount - 1] of PNodeData);
  33.   end;
  34.  
  35. type
  36.   TForm1 = class(TForm)
  37.     VirtualTree: TVirtualStringTree;
  38.     RadioGroup1: TRadioGroup;
  39.     procedure FormCreate(Sender: TObject);
  40.     procedure VirtualTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
  41.     procedure RadioGroup1Click(Sender: TObject);
  42.   private
  43.     FViewStyle: TViewStyle;
  44.   public
  45.     { Public declarations }
  46.   end;
  47.  
  48. var
  49.   Form1: TForm1;
  50.  
  51. implementation
  52.  
  53. {$R *.dfm}
  54.  
  55. procedure TForm1.FormCreate(Sender: TObject);
  56. var
  57.   I, J: Integer;
  58.   ChildData: PNodeData;
  59.   ChildNode: PVirtualNode;
  60.   MergedData: PNodeData;
  61.   MergedNode: PVirtualNode;
  62.   ParentData: PNodeData;
  63.   ParentNode: PVirtualNode;
  64. begin
  65.   VirtualTree.DefaultText := '';
  66.   VirtualTree.NodeDataSize := SizeOf(TNodeData);
  67.  
  68.   VirtualTree.BeginUpdate;
  69.   try
  70.     for I := 1 to 5 do
  71.     begin
  72.       ParentNode := VirtualTree.AddChild(nil);
  73.       ParentData := VirtualTree.GetNodeData(ParentNode);
  74.       ParentData.NodeType := ntClassic;
  75.       ParentData.Value1 := Format('Parent %d', [I]);
  76.       // ParentData.Value2 := ...;
  77.       // ParentData.Value3 := ...;
  78.  
  79.       MergedNode := VirtualTree.AddChild(ParentNode);
  80.       MergedData := VirtualTree.GetNodeData(MergedNode);
  81.       MergedData.NodeType := ntMerged;
  82.  
  83.       VirtualTree.IsVisible[MergedNode] := False;
  84.  
  85.       for J := Low(MergedData.MergedNodes) to High(MergedData.MergedNodes) do
  86.       begin
  87.         ChildNode := VirtualTree.AddChild(ParentNode);
  88.         ChildData := VirtualTree.GetNodeData(ChildNode);
  89.         ChildData.NodeType := ntClassic;
  90.         ChildData.Value1 := Format('Child %d', [J]);
  91.         // ChildData.Value2 := ...;
  92.         // ChildData.Value3 := ...;
  93.  
  94.         MergedData.MergedNodes[J] := ChildData;
  95.       end;
  96.     end;
  97.   finally
  98.     VirtualTree.EndUpdate;
  99.   end;
  100. end;
  101.  
  102. procedure TForm1.VirtualTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
  103. var
  104.   Data: PNodeData;
  105. begin
  106.   case FViewStyle of
  107.     tvsClassic:
  108.     begin
  109.       if Column = 0 then
  110.       begin
  111.         Data := Sender.GetNodeData(Node);
  112.         CellText := Data.Value1;
  113.       end;
  114.     end;
  115.     tvsMerged:
  116.     begin
  117.       Data := Sender.GetNodeData(Node);
  118.       if Sender.GetNodeLevel(Node) = 0 then
  119.       begin
  120.         if Column = 0 then
  121.           CellText := Data.Value1;
  122.       end
  123.       else
  124.       begin
  125.         if Data.NodeType = ntMerged then
  126.           CellText := Data.MergedNodes[Column].Value1;
  127.       end;
  128.     end;
  129.   end;
  130. end;
  131.  
  132. procedure TForm1.RadioGroup1Click(Sender: TObject);
  133. var
  134.   ChildData: PNodeData;
  135.   ChildNode: PVirtualNode;
  136.   ParentNode: PVirtualNode;
  137. begin
  138.   FViewStyle := TViewStyle(RadioGroup1.ItemIndex);
  139.  
  140.   VirtualTree.BeginUpdate;
  141.   try
  142.     ParentNode := VirtualTree.GetFirstLevel(0);
  143.     while Assigned(ParentNode) do
  144.     begin
  145.       ChildNode := VirtualTree.GetLastChild(ParentNode);
  146.       while Assigned(ChildNode) do
  147.       begin
  148.         ChildData := VirtualTree.GetNodeData(ChildNode);
  149.         VirtualTree.IsVisible[ChildNode] := not (FViewStyle = tvsClassic) xor (ChildData.NodeType = ntClassic);
  150.         ChildNode := VirtualTree.GetPreviousSibling(ChildNode);
  151.       end;
  152.       ParentNode := VirtualTree.GetNextLevel(ParentNode, 0);
  153.     end;
  154.   finally
  155.     VirtualTree.EndUpdate;
  156.   end;
  157. end;
  158.  
  159. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement