我在树型控件中显示各种类别。如何设计类中有类的数据表,使得点击一个类,显示子类。
解决方案 »
- 一个看似简单的问题
- TListBox,如何最方便的实现每一个ITEM项有一个键值?
- 救命啊~ 那位大哥大姐帮帮忙!!!
- Delphi 截取被遮挡窗口图片
- 如何用命令显式的触发一个事件?要触发ADO中的OnRecordChangComplete事件。
- 再讨论delphi和sql server 结合开发的性能问题
- 怎样使用tree view
- 这样条件的删除语句怎样写?
- 最近要去一个软件公司面试,他们能问我什么技术问题!大家把自己面试的经历都讲讲!
- 为什么收不到自己发送的消息?
- SNMP通信中的TRAP接收问题?
- 我想在DateTimePicker插入个NULL值,并保存到数据库,IF语句进行判断,则出错,为什么呢
2.用TreeView生成,还要在前面生成结构体!
1.
数据库结构
NODE_ID PARENT_ID DllName ChnNodeTitle
2.程序
因为FcTreeView中为每个结点集成了2个属性,StringData与StringData2,这样使得我们不再需要用声明结构体与结构体指针,从而挂到每个结点上。以下是一个事例!
第一步,首先构造一棵树干
var
sNode:TfcTreeNode; //声明临时树结点,用于临时存放结点信息
begin
with qrySlct do
begin
close;
CommandText:='Select * From ADMINIXTREE where parent_id is null'; //扫描数据库中的根结点
open;
while not eof do
begin
sNode:=fcTreeView1.Items.Add(nil,qrySlct.FieldByName('ChnNodeTitle').AsString);//将中文名称生成结点
sNode.StringData := qrySlct.FieldByName('NODE_ID').AsString;//将其结点号存入Node中,以备以后使用
sNode.StringData2 := qrySlct.FieldByName('DllName').AsString;//将其结点的Dll文件存入,以备以后使用
Next;
end;
end;
////////////////////////////
就这样一个树干就做完了
第二步 动态生成树枝
动态生成树枝放在FcTreeview的Click事件中,当然也可以放入Onchange中,个人建议放在Click
这里有个问题,在生成树干后,怎样在点击树时返回我点的结点名称呢?
有两种方法
1.在MouseDown中获得
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pNode:TTreeNode;
begin
pNode:=TreeView1.GetNodeAt(x,y);
end;
2.在单元中声明一个全局FctreeView结点,在Fctreeview的Onchange中将Node赋值于该全局变量
而后在Click中写生成树枝的程序
procedure TForm1.fcTreeView1Click(Sender: TObject);
var
sNode:TfcTreeNode;
begin
if ddNode.Count=0 then //如果该结点已生成,而放弃再次生成!
begin
with qrySlct do
begin
close;
CommandText:='Select * From ADMINIXTREE where parent_id ='+ddNode.StringData;//注意,这是根据当前某点,生成其分枝的语句
open;
while not eof do
begin
sNode:=fcTreeView1.Items.AddChild(ddNode,qrySlct.FieldByName('ChnNodeTitle').AsString);
sNode.StringData := qrySlct.FieldByName('NODE_ID').AsString;
Next;
end;
end;
end;
end;
1.先建造结构体,并用结构体指针指向该结构体
2.建树干
3.动态生成结点下的Child
TNodeInfoEx = Packed Record
NodeID : Integer;
ParentID : Integer;
NodeType : SmallInt;
NodeLevel : SmallInt;
ChnNodeTitle : String;
EngNodeTitle : String;
dllFileName : String;
ImageIndex: SmallInt;
SelectedIndex: SmallInt;
end;
PNodeInfoEx = ^TNodeInfoEx;
procedure TForm1.BuildTree(Treeview:Ttreeview);
var
AddNodeInfo : TNodeInfoEx;
begin
with qrySlct do
begin
close;
CommandText:='Select * From ADMINIXTREE where parent_id is null';
open;
while not eof do
begin
AddNodeInfo.NodeID := qrySlct.FieldByName('NODE_ID').AsInteger;
AddNodeInfo.ParentID := qrySlct.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo.NodeType := qrySlct.FieldByName('NodeType').AsInteger;
AddNodeInfo.ChnNodeTitle := qrySlct.FieldByName('ChnNodeTitle').AsString;
AddTreeItem(Treeview1,AddNodeInfo);
Next;
end;
end;
end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
tmpNode:=Node;
end;procedure TForm1.TreeView1Click(Sender: TObject);
var
AddNodeInfo : TNodeInfoEx;
ParentNode: TTreeNode;
FuncNodeInfo: PNodeInfoEx;
begin
if tmpNode.Count=0 then
begin
with qrySlct do
begin
close;
CommandText:='Select * From ADMINIXTREE where parent_id ='+Inttostr(PNodeInfoEx(tmpNode.Data).NodeID);
open;
while not eof do
begin
AddNodeInfo.NodeID := qrySlct.FieldByName('NODE_ID').AsInteger;
AddNodeInfo.ParentID := qrySlct.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo.NodeType := qrySlct.FieldByName('NodeType').AsInteger;
AddNodeInfo.ChnNodeTitle := qrySlct.FieldByName('ChnNodeTitle').AsString;
New(FuncNodeInfo);
FuncNodeInfo^.NodeID := AddNodeInfo.NodeID;
FuncNodeInfo^.ParentID := AddNodeInfo.ParentID;
FuncNodeInfo^.NodeType := AddNodeInfo.NodeType;
FuncNodeInfo^.ChnNodeTitle:= AddNodeInfo.ChnNodeTitle;
Treeview1.Items.AddChildObject(Tmpnode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(FuncNodeInfo));
Next;
end;
end;
end;
http://topic.csdn.net/u/20120425/10/504676a0-ef94-4fea-8c6f-810cf72eaae9.html
http://topic.csdn.net/u/20120425/10/87c929d4-cbfd-426c-a2bf-386e4f528a67.html