TreeView使用笔记

TreeView使用笔记 

TreeView由节点构成,建树通过对TreeView.items属性进行操作。Items是一个TTreeNodes对象,这是一个TTreeNode集。

一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:
1、count,节点个数。
2、item[index]  ,通过index得到节点。

二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:
AddFirst添加第一个根节点。由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,则后添加的节点将排在前面。该函数返回新添加的节点。
AddChildFirst添加第一个子节点,要求有父节点作为其参数。返回新添加的节点。
AddChild添加一个子节点,要求有父节点作为其参数。返回新添加的节点。
Add添加一个兄弟节点,要求有兄弟节点作为其参数。返回新添加的节点。

三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:
GetFirstNode() 得到根节点。
然后配合TTreeNode.GetNext(),就可以访问所有的节点。

四、建树举例:

var
  root_node,cur_node:TTreeNode;
begin
  root_node:=AddFirst(nil,'根节点1');
  cur_node:=addChildfirst(root_node,nil,'根节点1_child1');
  add(cur_node,'根节点1_child2');
  root_node:=Add(nil,'根节点2');
  AddChildFirst(root_node,''根节点2_child1'); 
end;

 

五、事件触发:
当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。该事件中,将传递node,即当前被选中的节点。

当修改一个节点的text时,会触发TTreeView.onEdit事件。


六、将节点和节点所对应的数据联系起来
对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。
1.我们先定义一个数据结构,作为记录我们要记录的数据。如:
type
  PMyData=^TMyData;
  TMyData=Record
    sFName:string;
    sLName:String;
    nIndex:integer;
  end;

2.然后,创建数时,将节点和节点数据联系起来:
procedure TForm1.Button1Click(Sender: TObject);
var
  myshuju: PMyData
  cur_node:TTreeNode;
begin
  New(MyRecPtr);  //记住,一定要先分配内存。有几个节点,就要分配几次内存。
  myshuju^.FName:=Edit1.Text;
  Myshuju^.LName := Edit2.Text;
  TreeViewIndex := StrToInt(Edit3.Text);
  with TreeView1 do
  begin
    cur_node:=items.AddFirst(nil,'first');
    cur_node.data:=myshuju;
  end;
end;

3.当我们选中一个节点时,就可以使用我们的数据了。
procedure  TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);
begin
   if node.data<>nil then
    self.label1.caption:=pmyData(node.data)^.Fname+pmyData(node.data)^.Lname
end;


七、一般使用流程:
1、添加全局变量:
   b_first:boolean;  //记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触发OnChange事件,在此事件处理函数中也许会出错。
2、在FormCreate中,
  a、设置b_first:=true;
  b. 创建数并将节点与数据联系。
3、在FormShow中
  设置b_first:=false;
4.在事件OnChange中处理节点被选中事件。
5.在Edit中处理节点被修改Text事件。
  并调用OnChange.
6.在 TreeView.Destory中
  释放Data 中指向的内存空间。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, DB, ADODB, Grids, DBGrids;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    TreeView1: TTreeView;
    ADOQuery2: TADOQuery;
    ADOQuery3: TADOQuery;
    ADOQuery4: TADOQuery;
    ADOQuery5: TADOQuery;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure treeCreate;
    procedure treeCreate_Wl(Node:TTreeNode;bancpin:string;sl:integer);
  end;

var
  Form1: TForm1;
  //root_node:TTreeNode;
implementation

{$R *.dfm}
procedure TForm1.treeCreate;
var
  cur_node,t_node,root_node:TTreeNode;
  cp_Arr,wl_Arr:array of ^string;  //产品数组,物料数组
  j,n,t,m,i:integer;
  str,str1:string;
begin
  adoquery1.close;
  adoquery1.SQL.Clear;
  adoquery1.SQL.Add('select distinct(cpbh) from zbom');
  adoquery1.Open;
  adoquery1.First;
  j:=adoquery1.RecordCount;   //获得产品接点个数
  setlength(cp_Arr,j);     //定义数组大小

  root_node:=TreeView1.Items.addfirst(nil,'all'); //根接点

  for i:=0 to j-1 do      //循环各产品
  begin
  new(cp_Arr[i]);      //申请空间
  cp_Arr[i]^:= adoquery1.fieldbyname('cpbh').value;

  cur_node:=TreeView1.Items.addchild(root_node,cp_Arr[i]^); //产品生成树
  cur_node.data:=cp_Arr[i];  //指针赋值,便于释放;

  adoquery2.close;
  adoquery2.SQL.Clear;
  adoquery2.SQL.Add('select * from zbom where cpbh='''+cp_Arr[i]^+'''');
  adoquery2.Open;
  adoquery2.First;
  n:=adoquery2.RecordCount;   //获得物料接点个数
  setlength(wl_Arr,n);     //定义数组大小

  for t:= 0 to n-1 do
  begin
  new(wl_Arr[t]);    //申请空间
  wl_Arr[t]^:= adoquery2.fieldbyname('wlbh').Value;

  str:= wl_Arr[t]^;
  m:=adoquery2.fieldbyname('sl').value;  //数量
  str:= str + '  数量:' + inttostr(m); // 物料编号 +  数量

  str1:= copy(str,1,2);    //获取物料编号前两个字符


 { adoquery5.close;
  adoquery5.SQL.Clear;
  adoquery5.SQL.Add('select * from zbom where cpbh='''+cp_Arr[i]^+'''');
  adoquery5.Open;
  if adoquery5.RecordCount<>0 then}
 if str1 = 'cp' then
  begin
   t_node:= TreeView1.Items.addchild(cur_node,str);
   t_node.data:=wl_Arr[t];  //指针赋值

   treeCreate_Wl(t_node,wl_Arr[t]^,m);  // 递归
  end
  else  begin
   t_node:= TreeView1.Items.addchild(cur_node,str);
   t_node.data:=wl_Arr[t];  //指针赋值
  end;
  adoquery2.Next;
  end;
  adoquery1.Next;
  end;
end;

procedure TForm1.treeCreate_Wl(Node:TTreeNode;bancpin:string;sl:integer);
var
  t_node:TTreeNode;
  bancpin_Arr:array of ^string;
  n,t,m:integer;
  str1,str:string;
begin
  adoquery3.close;
  adoquery3.SQL.Clear;
  adoquery3.SQL.Add('select * from zbom where cpbh='''+bancpin+'''');
  adoquery3.Open;
  adoquery3.First;
  n:=adoquery3.RecordCount;   //获得物料接点个数
  setlength(bancpin_Arr,n);    //定义数组大小

  for t:= 0 to n-1 do
  begin
  new(bancpin_Arr[t]);    //申请空间

  bancpin_Arr[t]^:= adoquery3.fieldbyname('wlbh').Value;

  str:= bancpin_Arr[t]^;
  m:=adoquery3.fieldbyname('sl').value;  //数量
  m:= m * sl;
  str:= str + '  数量:' + inttostr(m); //物料编号 +  数量

  str1:= copy(str,1,2);    //获取物料编号前两个字符


  adoquery5.close;
  adoquery5.SQL.Clear;
  adoquery5.SQL.Add('select * from zbom where cpbh='''+bancpin_Arr[t]^+'''');
  adoquery5.Open;

  if adoquery5.RecordCount<>0 then
  //if str1 = 'cp' then
  begin
   t_node:= TreeView1.Items.addchild(Node,str);
   t_node.data:= bancpin_Arr[t];  //指针赋值

   treeCreate_Wl(t_node,bancpin_Arr[t]^,m);
  end
  else  begin
   t_node:= TreeView1.Items.addchild(Node,str);
   t_node.data:= bancpin_Arr[t];  //指针赋值
  end;
  adoquery3.Next;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  //root_node:=nil;
  treeCreate;
 
  datasource1.DataSet:= adoquery4;
  adoquery4.close;
  adoquery4.SQL.Clear;
  adoquery4.SQL.Add('select cpbh,wlbh,sl from zbom');
  adoquery4.Open;
  datasource1.DataSet:= adoquery4;

  for i:=0 to 2 do
  dbgrid1.Columns[i].Width:=50;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TreeView1.Free;    //释放指针内存
end;

end.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值