上帝,我只是想写个树,难道不行吗

jerehsofter 2005-09-16 03:36:21
我就是想写个树,A是父,B、C是A的叶子,E、F是B的叶子,先写A,然后是叶子B、C,这个时候节点在C上,如何跳到B上再写它的下级E、F,请大家支持
...全文
180 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
S.F. 2005-09-18
  • 打赏
  • 举报
回复
好象跑题了。
myy 2005-09-16
  • 打赏
  • 举报
回复
http://blog.csdn.net/myy/
jinjazz 2005-09-16
  • 打赏
  • 举报
回复
怎样根据数据库的内容动态部门树 *****
主要解答者: zswangII 提交人: dulei115
感谢: dulei115
审核者: l_xiaofeng 社区对应贴子: 查看
-----------------------------------
数据库结构:
部门ID 部门名称 上级部门ID
1 总部门 -1
2 部门1 1
3 部门2 1
4 部门3 1
5 分部门1 2
6 分部门2 2
7 分部门3 2
8 子部门1 5
9 子部门1 5
---------------------------------------------------------------
(*//
标题:数据集处理成可视树
说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构
设计:Zswang
日期:2002-05-20
支持:wjhu111@21cn.com
//*)
///////Begin Source
function DataSetToTreeNode(mDataSet: TDataSet;
mFieldNameParent: string; //父节点标识字段名
mFieldNameTreeText: string; //节点文本字段名
mFieldNameTreeId: string; //节点标识字段名
mTreeView: TTreeView; mTreeNode: TTreeNode;
mParentText: string): Boolean;
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).AsString);
vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
Result := True;
end;
///////End Source
///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
TreeView1.Items.Clear;
DataSetToTreeNode(Table1, 'ParentTreeId', 'TreeText', 'TreeId',
TreeView1, nil, 'NULL');
end;
///////End Source
//---------------------------------------------------------------------------
//Borland C++ Builder
//---------------------------------------------------------------------------
///////Begin Source
bool DataSetToTreeNode(TDataSet* mDataSet,
AnsiString mFieldNameParent, //父节点标识字段名
AnsiString mFieldNameTreeText, //节点文本字段名
AnsiString mFieldNameTreeId, //节点标识字段名
TTreeView* mTreeView, TTreeNode* mTreeNode,
AnsiString mParentText)
{
TTreeNode* vTreeNode;
Variant vFieldValues;
AnsiString vFieldNames;
if (mDataSet == NULL) return false;
if (mTreeView == NULL) return false;
if (!mDataSet->Active) return false;
vFieldNames = Format("%s;%s;%s",
ARRAYOFCONST((mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId)));
mDataSet->Filtered = false;
mDataSet->Filter = Format("%s=%s", ARRAYOFCONST((mFieldNameParent, QuotedStr(mParentText))));
mDataSet->Filtered = true;
if (mDataSet->IsEmpty()) return false;
mDataSet->First();
while (!mDataSet->Eof) {
vTreeNode = mTreeView->Items->AddChild(mTreeNode,
mDataSet->FieldByName(mFieldNameTreeText)->AsString);
vFieldValues = mDataSet->FieldValues[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet->FieldByName(mFieldNameTreeId)->AsString);
///////Begin 恢复位置
mDataSet->Filtered = false;
mDataSet->Filter = Format("%s=%s", ARRAYOFCONST((mFieldNameParent, QuotedStr(mParentText))));
mDataSet->Filtered = true;
mDataSet->Locate(vFieldNames, vFieldValues, TLocateOptions());
///////End 恢复位置
mDataSet->Next();
};
return true;
} /* DataSetToTreeNode */
///////End Source
///////Begin Demo
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TreeView1->Items->Clear();
DataSetToTreeNode(Table1, "UpperTreeId", "TreeName", "TreeId",
TreeView1, NULL, "NULL");
}
///////End Demo

//当前如下调用~~

begin
TreeView1.Items.Clear;
DataSetToTreeNode(ADOTable1, '上级部门ID', '部门名称', '部门ID',
TreeView1, nil, '-1');
ADOTable1.Filter := '';
end;


hunterht 2005-09-16
  • 打赏
  • 举报
回复
神啊,救救这孩子吧
chenylin 2005-09-16
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,tmpNode:TTreeNode;
i:integer;
begin
RootNode:=TreeView1.Items.Add(Nil,'测试树');
ADODataSet1.First;
While not ADODataSet1.Eof do
begin
for i:=0 to TreeView1.Items.Count-1 do
if TreeView1.Items.Item[i].Text=ADODataSet1.FieldByName('father').AsString then
begin
tmpNode:=TreeView1.Items.AddChild(TreeView1.Items.Item[i],ADODataSet1.FieldByName('son').AsString);
break;
end;
ADODataSet1.Next;
end;
end;
jerehsofter 2005-09-16
  • 打赏
  • 举报
回复
如果从数据库中动态的读,那么应该如何写代码呢

结构是:
FATHER SON
A B
A C
B E
B F
C D
D H
D I
chenylin 2005-09-16
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,TmpNode:TTreeNode;
i:integer;
begin
TreeView1.Items.Clear;
RootNode:=TreeView1.Items.Add(Nil,'A');
TmpNode:=TreeView1.Items.AddChild(RootNode,'B');
TmpNode:=TreeView1.Items.AddChild(RootNode,'C');
For i:=0 to TreeView1.Items.Count-1 do
if TreeView1.Items.Item[i].Text='B' then
begin
TmpNode:=TreeView1.Items.AddChild(TreeView1.Items.Item[i],'E');
TmpNode:=TreeView1.Items.AddChild(TreeView1.Items.Item[i],'F');
Break;
end;
end;
jerehsofter 2005-09-16
  • 打赏
  • 举报
回复
我知道原理,就是代码具体的函数不知道如何写,对TREEVIEW的控制不熟悉,哪位高手可以给我个代码。
一根老玉米 2005-09-16
  • 打赏
  • 举报
回复
树的遍历


数据结构多看看
hellolongbin 2005-09-16
  • 打赏
  • 举报
回复
呵呵,基础知识
cxj1976 2005-09-16
  • 打赏
  • 举报
回复
l_Node:= Treeview.topnode;
while l_Node<>nil do
begin
if l_Node=b then
begin
l_Nod.add.......
end;
end;
jasengod2003 2005-09-16
  • 打赏
  • 举报
回复
帮楼主顶上去!
fei19790920 2005-09-16
  • 打赏
  • 举报
回复
孩子,行的,只是你的技术不过关!
hanlin2004 2005-09-16
  • 打赏
  • 举报
回复
算法问题,树的遍历

5,378

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧