TTreeView的使用

先说一下我要达到的目的,一个Form分成两个Panel,左边放置TTreeView,右边根据TTreeView的不同选择切换不同的Frame或Form。

首先定义一个数据结构来保存每一个TTreeNode的数据,可以根据需要放更多的数据进去:

unit TreeNodeDataUnit;

interface

uses
  Classes;

type
  TreeNodeData = Record
    id: Int64;
    InstanceClass: TComponentClass;
  end;

implementation

end.

其中InstanceClass字段用来保存每个TTreeNode所对应的Frame或Form。

以如下定义为例:

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

开始创建TTreeView,在Form的OnCreate中创建:

procedure TForm1.FormCreate(Sender: TObject);
var
  items: TTreeNodes;
  mainNode, subNode: TTreeNode;
  nodeData: ^TreeNodeData;
begin

  items := TreeView1.Items;

  mainNode := items.Add(nil, 'Root');
  New(nodeData);
  nodeData^.id := 100;
  mainNode.Data := nodeData;

  subNode := items.AddChild(mainNode, 'Node1');
  New(nodeData);
  nodeData^.id := 100100;
  nodeData^.InstanceClass := TFrame1;
  subNode.Data := nodeData;

  subNode := items.AddChild(mainNode, 'Node2');
  New(nodeData);
  nodeData^.id := 100200;
  nodeData^.InstanceClass := TFrame2;
  subNode.Data := nodeData;

  TreeView1.FullExpand;
end;

响应TTreeView的OnChange事件,根据每个TTreeNode的Data定义显示不同的Frame或Form:

var
  currFrame: TForm;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  nodeData: ^TreeNodeData;

begin
  nodeData := Node.Data;
  //ShowMessage(intToStr(nodeData^.id));

  if (nodeData^.InstanceClass <> nil) then begin
    if (currFrame <> nil) and not (currFrame is nodeData^.InstanceClass) then begin
      currFrame.Free();
      currFrame := nil;
    end;
    if (currFrame = nil) then begin
      Application.CreateForm(nodeData^.InstanceClass, currFrame);
      currFrame.Parent := Panel2;
      currFrame.Align := alClient;
      currFrame.Show;
    end;
  end;

end;

这样当需要添加新的Node时只需要更改很少的代码。

PS:相比于在Design视图上点来点去,还是更喜欢自己写代码来实现……

17fav 收藏本文
标签:, ,

相关日志 随机文章

Comments

Leave a Reply




请输入验证码

Use "<coolcode></coolcode>" to publish your code.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.

京ICP备05059555号

收藏 & 分享

Powered by 17fav.com