TreeView的用法基本用法.docx
《TreeView的用法基本用法.docx》由会员分享,可在线阅读,更多相关《TreeView的用法基本用法.docx(15页珍藏版)》请在冰豆网上搜索。
![TreeView的用法基本用法.docx](https://file1.bdocx.com/fileroot1/2022-11/25/5eea56c4-6d7e-4345-93cf-32e5a64e0ff9/5eea56c4-6d7e-4345-93cf-32e5a64e0ff91.gif)
TreeView的用法基本用法
TreeView的用法开始(挺全的)
//************* TreeView 的用法开始******************//
一:
TreeView.Items[0].Expanded :
= True; // 展开第一个节点
二:
TreeView.Items[0].Item[0].Selected :
= True; // 移动到第一个节点的第一个子节点
找当前节点的下一个节点,按序号找如下:
if treeview1.Selected.GetNext<>nil then
treeview1.Selected.GetNext.Selected:
=true;
TreeView1.SetFocus;
找当前节点的下一个同层兄弟如下:
if treeview1.Selected.getNextSibling<>nil then
treeview1.Selected.getNextSibling.Selected:
=true;
TreeView1.SetFocus;
TreeView.Selected.getPrevSibling //当前选中节点的上一个兄弟节点
TreeView.Selected.Parent // 当前选中节点的父节点
getfirstchild是跳到该节点子结点中的第一个
getlastchild是跳到该节点子结点中的最后一个
如果你是想跳到同层兄弟结点的第一个
if treeview1.selected.parent<>nil then
treeview1.selected.parent.getfirstchild.selected:
=true
else
treeview1.items.item[0].selected:
=true;
如果你是想跳到同层兄弟结点的最后一个
if treeview1.selected.parent<>nil then
treeview1.selected.parent.getlastchild.selected:
=true
else
treeview1.Items.Item[treeview1.Items.Count-1].Selected:
=true;
TreeView的使用方法
基本信息:
TreeView 是一个显示树型结构的控件,每一个节点都是一个新类,
使用具有代表性每个节点都有四个值:
TEXT:
显示文字 Image Index:
显示图形序号
Selected Index:
State Index:
(1)建立目录项(本例中使用的TREEVIEW名称为:
TvwTips)
增加根目录下的节点:
(节点)
var
CatNode :
TTreeNode; //先建立一个TREEVIEW使用的子对象
begin
TvwTips.SetFocus; //将焦点置到这个TREEVIEW控件上
{ 在根标题下建立一个新的子标题 }
CatNode :
= TvwTips.Items.AddChild(
TvwTips.Items.GetFirstNode,'New Category' );
CatNode.ImageIndex :
= 1;
CatNode.SelectedIndex :
= 2;
CatNode.EditText; { 允许用户改变这个标题 }
end; 增加下一级目录(内容):
var
ParentNode, TipNode :
TTreeNode; //先建立TREEVIEW使用
的子对象
VersionNum :
Integer;
begin
TvwTips.SetFocus; //将焦点置到这个TREEVIEW控件上
VersionNum :
= TMenuItem( Sender ).Tag; { Ver num of new tip }
ParentNode :
= TvwTips.Selected; { 取出当前的选中节点 }
if ParentNode.Level = nlTip then{ Parent cannot be a tip node }
ParentNode :
= TvwTips.Selected.Parent;
TipNode :
= TvwTips.Items.AddChildObject( ParentNode,'New
Subject',Pointer( VersionNum ) );
TipNode.ImageIndex :
= 3; { Normal tip bitmap }
TipNode.SelectedIndex :
= 4; { Highlighted tip bitmap }
TipNode.MakeVisible; { Move new tip node into view }
TipNode.EditText; { Immediately allow user to edit subject }
EnableTreeViewFunctions( TipNode.Level );
RtfTip.Clear;
RtfTip.Modified :
= False;
end;
(2)说明 TvwTips.Items.GetFirstNode 返回TREEVIEW的第一个节点,函数类型为:
TTreeNode
TvwTips.Items.Count 返回当前TreeView的全部节点数,整数
TvwTips.Selected.Level 返回当前选中节点的在目录树中的级别,
根目录为0
TvwTips.Selected.Parent 返回当前选中节点上级节点,函数类型为
:
TTreeNode
三、下面这段程序是用TREEVIEW连数据库及一些操作:
unit bmzd;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, Db, DBTables, ImgList, Buttons, ExtCtrls, Grids,
DBGrids;
type
Tfrmbmzd = class(TForm)
Panel1:
TPanel;
cmd_new:
TBitBtn;
cmd_delete:
TBitBtn;
cmd_exit:
TBitBtn;
tvwcode:
TTreeView;
ScrollBox1:
TScrollBox;
GroupBox2:
TGroupBox;
Label3:
TLabel; Label2:
TLabel; Label1:
TLabel; Label4:
TLabel
Label5:
TLabel; Edit2:
TEdit; Edit3:
TEdit; Edit4:
TEdit; Edit5:
TEdit;
ImageList1:
TImageList;Edit1:
TEdit;
cmd_save:
TBitBtn; cmd_update:
TBitBtn;
procedure FormShow(Sender:
TObject);
procedure FormClose(Sender:
TObject; var Action:
TCloseAction);
procedure cmd_newClick(Sender:
TObject);
procedure cmd_deleteClick(Sender:
TObject);
procedure Edit2KeyPress(Sender:
TObject; var Key:
Char);
procedure tvwcodeChange(Sender:
TObject; Node:
TTreeNode);
procedure cmd_updateClick(Sender:
TObject);
procedure BitBtn2Click(Sender:
TObject);
procedure tvwcodeClick(Sender:
TObject);
private
{ Private declarations }
function LoadCode(crTbl:
TDBDataSet):
Integer;
function GetLevel(sFormat,sCode:
String):
Integer;
public
{ Public declarations }
end;
var
frmbmzd:
Tfrmbmzd;
ii:
integer;
tv:
ttreenode;
const
SCodeFormat = '222222'; //科目代码结构
SFirstNodeTxt = '部门分类';
implementation
uses dm;
{$R *.DFM}
function tfrmbmzd.LoadCode(crTbl:
TDBDataSet):
Integer;
var NowID,sName,ShowTxt:
String;
i,Level:
Integer;
MyNode:
array[0..6]of TTreeNode;
//保存各级节点,最长支持6级(重点)
begin
Screen.Cursor:
=crHourGlass;
Level:
=0;
With frmdm.tabbm do
begin
try
if not Active then Open;
First;
tvwCode.Items.Clear;
//以下是增加第一项
MyNode[Level]:
=tvwCode.Items.Add
(tvwCode.TopItem,SFirstNodeTxt);
MyNode[Level].ImageIndex:
=0;
MyNode[Level].SelectedIndex:
=0;
//以上是增加第一项
While Not Eof do
begin
NowID:
=Trim(FieldByName('bumeng_id').AsString);
ShowTxt:
=FieldByName('bumeng_name').AsString;
Level:
=GetLevel(SCodeFormat,NowID);
//返回代码的级数
//以下是增加子项
//以下用上一级节点为父节点添加子节点
if Level>0 then//确保代码符合标准
begin
MyNode[Level]:
=tvwCode.Items.AddChild
(MyNode[Level-1],NowID+' '+ShowTxt);
MyNode[Level].ImageIndex:
=1;
MyNode[Level].SelectedIndex:
=2;
end; //以上是增加子项
Next;
end;
finally
Close;
end;
end;
MyNode[0].Expand(False);//将首节点展开
Screen.Cursor:
=crDefault;
end;
//以上函数将Code.db表中的科目代码和科目代码名称显示出来
//下面函数的功能是返回一代码的级数,
//参数sFormat传递科目代码结构;
//参数sCode传递某一科目代码
function tfrmbmzd.GetLevel
(sFormat,sCode:
String):
Integer;
var i,Level,iLen:
Integer;
begin
Level:
=-1;//如果代码不符合标准,则返回-1
iLen:
=0;
if (sFormat<>'')and(sCode<>'')then
for i:
=1 to Length(sFormat) do
begin
iLen:
=iLen+StrToInt(sFormat[i]);
if Length(sCode)=iLen then
begin
Level:
=i;
Break;
end;
end;
Result:
=Level;
end;
procedure Tfrmbmzd.FormShow(Sender:
TObject);
begin
if not frmdm.tabbm.active then frmdm.tabbm.Open;
frmdm.tabbm.IndexFieldNames:
='BUMENG_ID';
//按字段aCode排序(不要漏掉)
LoadCode(frmdm.tabbm);
end;
procedure Tfrmbmzd.FormClose(Sender:
TObject; var Action:
TCloseAction);
begin
Action :
= caFree;
end;
procedure Tfrmbmzd.cmd_newClick(Sender:
TObject);
begin
tvwcode.SetFocus ;
if tvwcode.selected.AbsoluteIndex<>0 then
begin
cmd_delete.Enabled:
=true;
cmd_update.Enabled:
=true;
cmd_save.Enabled :
=true;
if not frmdm.tabbm.Active then frmdm.tabbm.Open;
edit1.text:
=frmdm.tabbm.Fields[0].asstring;
end;
tvwcode.SetFocus ;
tvwcode.Items.AddChild(tvwcode.selected,'新建部门');
if tvwcode.Selected.HasChildren then
begin
if tvwcode.Selected.GetLastChild.index+1>9 then
edit2.text:
=inttostr(tvwcode.Selected.GetLastChild.index+1)
else
edit2.text:
='0'+inttostr(tvwcode.Selected.GetLastChild.index+1);
edit3.text:
='新建部门';
edit2.Enabled:
=true;
edit3.Enabled:
=true;
end
else
begin
edit2.text:
='01';
edit3.text:
='新建部门';
edit2.Enabled:
=true;
edit3.Enabled:
=true;
end;
if not frmdm.tabbm.Active then frmdm.tabbm.Open;
frmdm.tabbm.edit;
frmdm.tabbm.Append;
cmd_new.Enabled :
=false;
cmd_delete.Enabled :
=false;
cmd_update.Enabled :
=false;
cmd_save.Enabled :
=true; //新建下级部门
tvwcode.Selected.GetLastChild.Selected:
=true;//设选择
tv:
=tvwcode.Selected ;
tvwcode.autoExpand:
=true;
tvwcode.SetFocus ;
end;
procedure Tfrmbmzd.cmd_deleteClick(Sender:
TObject);
var
I:
integer;
seno,setext:
string;
begin
if tvwcode.Selected.HasChildren=true then
begin
application.messagebox('该部门包含下级,不能删除','提示',MB_OKCANCEL+mb_iconquestion ) ;
end
else
begin
if application.messagebox('你确实要删除当前部门吗','提示',MB_OKCANCEL+mb_iconquestion )
=IDOK then
begin
setext:
=tvwcode.selected.text;
i:
=0;
while setext[i] <> ' ' do
begin
I :
= I + 1;
seno:
=seno+setext[i];
end;
if not frmdm.tabbm.Active then frmdm.tabbm.Open;
frmdm.tabbm.setkey;
frmdm.tabbm.Fields[0].asstring:
=seno;
if frmdm.tabbm.GotoKey then
begin
frmdm.tabbm.edit;
frmdm.tabbm.Delete;
end;
tvwcode.Selected.Delete ;
cmd_new.Enabled :
=true;
tvwcode.autoExpand:
=true;
tvwcode.SetFocus ;
end;
end;
end;
procedure Tfrmbmzd.Edit2KeyPress(Sender:
TObject; var Key:
Char);
begin
if key in ['0'..'9',Chr(vk_Back)] then
else
begin
key:
=#0;
application.messagebox('','',mb_ok);
end;
end;
procedure Tfrmbmzd.tvwcodeChange(Sender:
TObject; Node:
TTreeNode);
var
i,lev:
integer ;
strr,seno,setext:
string;
begin
if cmd_new.Enabled =true then
begin
if tvwcode.selected.AbsoluteIndex<>0 then
begin
cmd_delete.Enabled:
=true;
cmd_update.Enabled:
=true;
cmd_save.Enabled :
=true;
setext:
=tvwcode.selected.text;
i:
=0;
while setext[i] <> ' ' do
begin
I :
= I + 1;
seno:
=seno+setext[i];
end;
if not frmdm.tabbm.Active then frmdm.tabbm.Open;
frmdm.tabbm.setkey;
frmdm.tabbm.Fields[0].asstring:
=seno;
frmdm.tabbm.GotoKey;
strr:
='';
case tvwcode.Selected.Level of
2:
strr:
=copy(frmdm.tabbm.fields[0].asstring,1,2);
3:
strr:
=copy(frmdm.tabbm.fields[0].asstring,1,4);
end;
edit1.text:
=strr;
//加上级编码
edit3.text:
=frmdm.tabbm.Fields[1].asstring;
//本级编码
edit2.text:
=copy(frmdm.tabbm.fields[0].asstring,length(frmdm.tabbm.fields[0].asstring)-1,2);
end
else
begin
edit1.text :
='';
edit2.text :
='';
edit3.text :
='部门分类';
cmd_delete.Enabled :
=false;
cmd_update.Enabled :
=false;
end;
end;
end;
procedure Tfrmbmzd.cmd_updateClick(Sender:
TObject);
var
i:
integer;
begin
for i:
=0 to ComponentCount-1 do
begin
if (Components[I] is tedit ) then
(Components[I] as tedit).enabled:
=false;
end;
for i:
=0 to ComponentCount-1 do
begin
if (Components[I] is tbitbtn ) then
(Components[I] as tbitbtn).enabled:
=true;
end;
if tvwcode.Selected.AbsoluteIndex<>0 then
begin
if not frmdm.tabbm.Active then frmdm.tabbm.Open;
frmdm.tabbm.Edit;
frmdm.tabbm.Fields[0].asstring:
=edit1.text+edit2.text;
frmdm.tabbm.Fields[1].asstring:
=edit3.text;
try
frmdm.tabbm.Post;
//表的保存
except
on edbengineerror do
begin
edit2.Enabled :
=true;
application.messagebox('编号不能重复,请重新输入','提示',MB_OK+mb_iconquestion ) ;
exit;
end;
end;
tvwcode.Selected.Text:
=edit1.text+edit2.text+' '+edit3.text;
tvwcode.SetFocus ; //修改树
end;
cmd_new.Enabled :
=true;
edit2.Enabled :
=false;
end;
procedure Tfrmbmzd.BitBtn2Click(Sender:
TObject);
begin
cmd_new.Enabled :
=false;
cmd_delete.Enabled :
=false;
edit2.enabled:
=true;
edit3.Enabled :
=true;
end;
procedure Tfrmbmzd.tvwcodeClick(Sender:
TObject);
var
i:
integer;
begin
if cmd_new.Enabled =false then
begin
application.MessageBox('当前是修改状态,请单击保存按钮','提示',mb_ok);
tv.Selected :
=true;
end;
if tvwcode.selected.AbsoluteIndex=0 then
begin
for