没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2004-03-16 09:25:00.000|阅读 1505 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下:
function
GetGlobeNumCode(inNode:TTreeNode):String;
功能:返回当前节点的编号,编号规则见源码内说明。
function
LocatOrGenerateNode(inNumCode:String):TTreeNode;
功能:以编号返回节点,假如节点的父节点和它的前继兄弟节点不存在,该方法会创建它们,名称为'Temp',当然假如已经存在,就不执行创建工作。
通过以上两个函数,这样我们就可以不加限制的创建和访问节点。该控件在我以前开发的,现在提供给大家做一个参考,希望能对你有帮助。
源码:
// ***********************************************
//
//
用于实现对TreeView控件的树结构的保存和重建
// 编写该控件主要用于实现对行政文件等具有树的层次结构的对象
//
实现保存和显示
//
节点编号规则:
//
+ *****
->1
//
+ *****
->1.1
//
+ *****
->1.1.1
//
+ ***** ->1.2
// 作者:Jack
//
最后修改日期:2002-12-24
//
//
**********************************************
unit CtrlTree;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,
ComCtrls;
type
TCtrlTree = class(TTreeView)
private
{ Private declarations }
function
GetPosAtBound(inString:String;inStart:Integer):Integer;
function GetTheLastPointPos(inString:String):Integer;
protected
{ Protected declarations }
public
{ Public declarations }
function GetNumInSameLevel(inNode:TTreeNode):Integer;
function GetGlobeNumCode(inNode:TTreeNode):String;
function GetParent(inNumCode:String):TTreeNode;
function
LocateNodeInLevel(parNode:TTReeNode;LevelCode:integer):TTReeNode;
published
{ Published declarations }
function LocatOrGenerateNode(inNumCode:String):TTreeNode;
function
InsertAsFinalChild(inString:String;inNode:TTreeNode):TTReeNode;
function
InsertAsPreviousSibling(inString:String;inNode:TTreeNode):TTReeNode;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard',
[TCtrlTree]);
end;
{ TCtrTree }
function TCtrlTree.GetNumInSameLevel(inNode: TTreeNode):
integer;
{功能:产生已存在节点在兄弟节点层中对应的编号,从1起编
入口参数:inCode:TTreeNode节点
返回:同层编号
}
var
i:integer;
tmp:TTreeNode;
begin
i:=0;
tmp:=inNode;
while tmp<>nil
do
begin
tmp:=tmp.getPrevSibling;
i:=i+1;
end;
Result:=i;
end;
function TCtrlTree.GetGlobeNumCode(inNode: TTreeNode):
string;
{功能:产生已存在节点对应的全局编号
入口参数:inCode:TTreeNode节点
返回:全局编号
}
var
nocode:string;
tmp:TTreeNode;
begin
tmp:=inNode;
nocode:=IntToStr(GetNumInSameLevel(tmp));
while
tmp.Level<>0 do
begin
tmp:=tmp.Parent;
nocode:=inttostr(GetNumInSameLevel(tmp))+'.'+nocode;
end;
Result:=nocode;
end;
function TCtrlTree.LocatOrGenerateNode(inNumCode: String):
TTreeNode;
{功能:根据提供的全局编号进行定位,如路径不全,则创建路径
在定位过程产生的节点的Text为Temp
最终返回对应于全局编号的子节点
入口参数:inNumCode:String为全局编号
返回:全局编号对应的字节点
}
var
i,j:Cardinal;
NumInLevel:integer;
tmp:TTreeNode;
par:TTreeNode;
begin
tmp:=nil;
i:=1;
while i<=StrLen(PChar(inNumCode))
do
begin
//得到下一个点号的开始位
j:=GetPosAtBound(inNumCode,i);
//得到在兄弟节点中的排行数
NumInLevel:=StrToInt(Copy(inNumCode,i,j-i+1));
//定位父节点
par:=GetParent(Copy(inNumCode,1,j));
//得到对应的节点
tmp:=LocateNodeInLevel(par,numInLevel);
i:=j+2;
end;
Result:=tmp;
end;
function TCtrlTree.GetParent(inNumCode: String):
TTreeNode;
{功能:根据提供的全局编号找到对应的父节点
如果是第一层的节点,则父节点为nil
入口参数:inNumCode:String为全局编号
返回:全局编号对应的父节点
}
var
GoStep:integer;
i:integer;
j:integer;
k:integer;
SearChInNode:TTReeNode;
ReturnNode:TTReeNode;
begin
//是第一层节点,返回nil;
k:=GetTheLastPointPos(inNumCode);
if k=0
then
begin
Result:=nil;
Exit;
end;
//是第二层或第二层以上节点
i:=1;
SearchInNode:=Items.GetFirstNode;
while i <
GetTheLastPointPos(inNumCode) do
begin
j:=GetPosAtBound(inNumCode,i);
GoStep:=StrToInt(Copy(inNumCode,i,j-i+1));
if i=1 then //在第一层节点中搜索
begin
ReturnNode:=SearchInNode;
for k:=1 to GoStep-1
do
ReturnNode:=ReturnNode.getNextSibling;
end
else
//在第二层或第二层以上节点中搜索
begin
GoStep:=StrToInt(Copy(inNumCode,i,j-i+1));
ReturnNode:=SearchInNode.Item[GoStep-1];
end;
SearchInNode:=ReturnNode;
i:=j+2
end;
Result:=SearchInNode;
end;
function TCtrlTree.LocateNodeInLevel(parNode: TTReeNode;LevelCode: integer):
TTReeNode;
{功能:根据父节点以及在兄弟节点中的编号找到对应的节点
如果要创建兄弟及自己,则新创建的节点的Text为Temp
入口参数:parNode:
TTReeNode为父节点
LevelCode:
integer为编号
返回:在parNode中编号为LevelCode的孩子节点
}
var
i:integer;
j:integer;
tmp:TTreeNode;
tmps:TTreeNode;
begin
//父节点为空,是第一层节点
tmp:=nil;
if
parNode=nil then
begin
i:=1;
tmps:=Items.GetFirstNode;
while
(tmps<>nil) and (i<=LevelCode)
do
begin
tmp:=tmps;
tmps:=tmps.getNextSibling;
i:=i+1;
end;
i:=i-1;
for j:=1 to LevelCode-i
do
tmp:=Items.AddChild(nil,'Temp');
Result:=tmp;
end
else
//父节点不为空,正常处理
begin
if
parNode.Count<LevelCode
then
for
i:= 1 to LevelCode-parNode.Count
do
Items.AddChild(parNode,'Temp');
Result:=parNode.Item[LevelCode-1];
end;
end;
function TCtrlTree.GetPosAtBound(inString: String;inStart:Integer):
Integer;
{功能:根据起始位置找到下一个'.'的前一个位置
入口参数:inString:
String节点编号
inStart:
Integer当前处理层次的起始位置
返回:当前处理层次的结束位置
}
var
tmp:Char;
pos:integer;
begin
pos:=inStart+1;
while pos <=
Integer(StrLen(PChar(inString))) do
begin
tmp:=inString[pos];
if
tmp='.'
then
Break
else
pos:=pos+1;
end;
Result:=pos-1;
end;
function TCtrlTree.GetTheLastPointPos(inString: String):
Integer;
{功能:找到编号中最后的'.'的位置
入口参数:inString:
String为节点编号
返回:节点编号中最后的'.'的位置
}
var
tmp:Char;
pos:integer;
begin
pos:=Integer(StrLen(PChar(inString)));
while
pos>=1 do
begin
tmp:=inString[pos];
if tmp='.'
then
Break
else
pos:=pos-1;
end;
Result:=pos;
end;
function TCtrlTree.InsertAsFinalChild(inString: String; inNode:
TTreeNode):TTReeNode;
{功能:为当前节点插入一个孩子节点,位置为最后
入口参数:inString:
String为节点编号为待插入节点的字符串
inNode: TTreeNode,当前节点
}
begin
Result:=Items.AddChild(inNode,inString);
end;
function TCtrlTree.InsertAsPreviousSibling(inString: String;
inNode: TTreeNode):TTReeNode;
{功能:为当前节点插入一个前导的兄弟节点
入口参数:inString:
String为节点编号为待插入节点的字符串
inNode: TTreeNode,当前节点
}
begin
Result:=Items.AddChildFirst(inNode,inString);
end;
end.
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号