CustNodesForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit CustNodesForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ComCtrls, StdCtrls;
  6. type
  7.   TForm1 = class(TForm)
  8.     TreeView1: TTreeView;
  9.     Button1: TButton;
  10.     Label1: TLabel;
  11.     procedure TreeView1CreateNodeClass(Sender: TCustomTreeView;
  12.       var NodeClass: TTreeNodeClass);
  13.     procedure Button1Click(Sender: TObject);
  14.     procedure TreeView1Click(Sender: TObject);
  15.   private
  16.     CurrentNodeClass: TTreeNodeClass;
  17.   public
  18.     procedure AddChildNodes(BaseNode: TTreeNode; nItems: Integer);
  19.   end;
  20. var
  21.   Form1: TForm1;
  22. implementation
  23. {$R *.dfm}
  24. type
  25.   TMyNode = class (TTreeNode)
  26.   private
  27.     FExtraCode: Integer;
  28.   protected
  29.     procedure SetExtraCode(const Value: Integer); virtual;
  30.     function GetExtraCode: Integer; virtual;
  31.   public
  32.     property ExtraCode: Integer read
  33.       GetExtraCode write SetExtraCode;
  34.   end;
  35.   TMySubNode = class (TMyNode)
  36.   protected
  37.     function GetExtraCode: Integer; override;
  38.   end;
  39. procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
  40.   var NodeClass: TTreeNodeClass);
  41. begin
  42.   NodeClass := CurrentNodeClass;
  43. end;
  44. { TMyNode }
  45. function TMyNode.GetExtraCode: Integer;
  46. begin
  47.   Result := FExtraCode;
  48. end;
  49. procedure TMyNode.SetExtraCode(const Value: Integer);
  50. begin
  51.   FExtraCode := Value;
  52. end;
  53. procedure TForm1.AddChildNodes (BaseNode: TTreeNode; nItems: Integer);
  54. var
  55.   MyNode: TMyNode;
  56.   j: Integer;
  57. begin
  58.   for j := 1 to nItems do
  59.   begin
  60.     CurrentNodeClass := TMySubNode;
  61.     MyNode := TreeView1.Items.AddChild (BaseNode,
  62.       'value' + IntToStr (j)) as TMyNode;
  63.     MyNode.ExtraCode := j;
  64.     // recursively add more nodes, up to a given level
  65.     if MyNode.Level <= 5 then
  66.       AddChildNodes(MyNode, Random (5));
  67.   end;
  68.   // let the system update the form
  69.   Application.ProcessMessages;
  70. end;
  71. procedure TForm1.Button1Click(Sender: TObject);
  72. var
  73.   MyNode: TMyNode;
  74.   i: Integer;
  75. begin
  76.   Randomize;
  77.   for i := 1 to 5 do
  78.   begin
  79.     CurrentNodeClass := TMyNode;
  80.     MyNode := TreeView1.Items.AddChild (nil,
  81.       'item' + IntToStr (i)) as TMyNode;
  82.     MyNode.ExtraCode := i;
  83.     AddChildNodes(MyNode, Random (5));
  84.   end;
  85. end;
  86. procedure TForm1.TreeView1Click(Sender: TObject);
  87. var
  88.   MyNode: TMyNode;
  89. begin
  90.   MyNode := TreeView1.Selected as TMyNode;
  91.   Label1.Caption := MyNode.Text + ' [' + MyNode.ClassName + '] = ' +
  92.     IntToStr (MyNode.ExtraCode);
  93. end;
  94. { TMySubNode }
  95. function TMySubNode.GetExtraCode: Integer;
  96. begin
  97.   Result := fExtraCode * (Parent as TMyNode).ExtraCode;
  98. end;
  99. end.