做一个TREEVIEW的控件,能够根据数据表中的
字段自动生成根节点跟子节点,双击每个子节点
可以将该子节点的FORM SHOW出来,关键就是怎么
搜索到这个FORM是否存在,如存在怎么将它SHOW
出来呢?通过DLL吗?DELPHI中是否还有其他方法?
谢谢!!!!
字段自动生成根节点跟子节点,双击每个子节点
可以将该子节点的FORM SHOW出来,关键就是怎么
搜索到这个FORM是否存在,如存在怎么将它SHOW
出来呢?通过DLL吗?DELPHI中是否还有其他方法?
谢谢!!!!
解决方案 »
- 那位大哥能帮我把C#转成delphi语法,小弟万分跪谢!
- vclskin控件求解决方法(分不够再加)
- 请看此贴,是关于软件学院的,在另一个帖子中,该贴及本帖来者有分。
- 如何限制子表单的可移动范围。
- 关于把一个文件文件读入数据表中的问题.
- UP有分!急!!ClientDataset连接一张一万条记录的表,为什么我的记录却保存不了??
- 求助
- 我需要要开发一个单机版的数据库管理系统,请问是用Delphi5好还是用Delphi6好,数据库用paradox7可以吗?还是用Acesses好?来者有分。
- MSDE安装后,如何生成和管理数据库? …………在线等待
- Delphi 根据窗体名称 创建窗体并显示
- 如何实现系统托盘的动态图标
- 在DELPHI 中如何指定数据的格式,如小数位数等
需要动态的查看该模块是否存在,然后在把他显示出来,就是SHOW出来啊!
fmFinanceMan := TfmFinanceMan.Create(nil);
fmFinanceMan.Parent := pnlMain;
fmFinanceMan.Show;
弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要
在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击
它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按
钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
procedure TForm1.Btn1Click(Sender: TObject);
Const
MyDocDir = 'C:\My Documents';
PersonDir = '3hSoft';
Var
Var
I : Word;
SubNodeName : array [1..5] of ShortString;
RootNode, SubNode : TTreeNode;
P : PString;
begin
SubNodeName[1] := '便笺';
SubNodeName[2] := '发件箱';
SubNodeName[3] := '联系人';
SubNodeName[4] := '任务';
SubNodeName[5] := '日记';
TV1.Items.Clear;
TV1.Items.BeginUpdate;
New(P);
P^ := MyDocDir + '\' + PersonDir;
RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
// 此 Node 的图标已对 Images 属性中取第 0 个了。
For I := 1 to 5 do
begin
New(P);
P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)
;
;
// 如果不想使用图标的话请删除以下两行
SubNode.ImageIndex := I;
SubNode.SelectedIndex := I;
end;
TV1.Items.EndUpdate;
end; 二.在TreeView中如何设置选中结点
var
i:integer; {i为设置的选中结点的索引值}
begin
if i>treeview1.items.count then
treeview1.items[i].selected:=true; 或
treeview1.selected:=treeview1.items[i]; 三。设置TreeView结点的图形
1. 设置TreeView的images属性为已存在的images对象 treeview1.images:=imagelist1;
2. 在加入结点后执行: var
anode:TTreeNode;
begein
anode:=Treeview1.add(nil,'item1');
anode.imageindex:=0; {结点未选中时显示的图标}
anode.selectedindex:=1; {结点选中时显示的图标}
end
3. 如果结点图形在改变后未发生变化,可以执行:
treeview1.refresh; 四。如何批量处理TreeView结点
使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
TreeView1.items.BeginUpdate;
for i:=0 to TreeView1.items.count-1 do
begin
//将每个结点的文字改成为小写字母
TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
end;
TreeView1.items.EndUpdate; 五。实现TreeView结点拖拽的实例
下面的程序片段演示了如何实现拖拽treeview构件结点的例子 {鼠标按下时执行的语句}
procedure TForm1.Treeview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin {判断左键按下并且鼠标点在一个结点上开始实现拖拽}
if ( Button = mbLeft ) and
( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
begin
Treeview1.BeginDrag( False );
end;
end; {鼠标拖动执行语句}
procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node : TTreeNode;
begin
if Source = Treeview1 then
begin
Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}
if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true} Accept := true;
end;
end; {鼠标释放时执行的语句}
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit; AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 } Treeview1.Items.BeginUpdate;
try
TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
'Temp' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview1.Items.EndUpdate;
end;
end;
祝:身体健康,分数和答案同样重要:)Treeview用于显示按照树形结构进行组织的数据。Treeview控件中一个树形图由节点(TreeNode)和连接线组成
TtreeNode是TTreeview的基本组成单元。
一个树的节点又包含文本(Text)和数据(Data)。Text为String类,Data则为无定形指针(Untyped Pointer),
可以指向一个与节点相联系的数据结构。
每一个节点下子节点形成这一节点的Items属性,当前节点有一个唯一的Index(TreeNode的Index属性),
用于说明子节点在Items中的位置,每一个节点下的子节点是顺序编号的,第一个是0,第二个是1,依次类推。
用IndexOf方法获得子节点的顺序,绝对顺序(AbsoluteIndex)则是指从Treeview第一个项开始的顺序值,
第一个是0,如此推下去。Item属性则根据Index的值返回当前节点的第Index个子节点。Count则表明属于
此项的所有子节点的数量。用MoveTo方法将Item由一个位置移到另一个位置。Expanded属性表明是否所有的子项都全部展开(包括子项的子项),为True表示全部展开。
IsVisible属性表明一个项是否在树中能被看到,如果树全部展开那么这个Item是肯定可以
被看到。HasChildren属性表明一个项是否有子项。 GetFirstChild, GetLastChild, GetPrevChild,
and GetNextChild分别返回当前项子项的第一个、最后一个和前一个、后一个项。GetNextSibling and GetPrevSibling则返回在同一Level下的下一个和上一个项。
GetNextVisible and GetPrevVisible则返回能看得到的下一个和上一个项。如果一个节点
有Parent,则HasAsParent方法返回True. Parent为当前项的父项。Focused属性确定焦点是
否落在此节点上,被Focus时会一个标准的方框围住。很显然,只有一个节点会被聚焦。 Selected属性表明一个节点是否被选中,同样只有一个节点会被选中。DropTarget属性表明节点在拖动操作中是源还是目标。.1.添加、删除、修改节点:
静态的方法可以在设计时通过Items的编辑器设置各节点的内容。
在添加和删除前必须保证有节点被选中(Treeview.Selected = nil)
用AddFirst, AddFirstChild, AddChild等先添加根节点,如Treeview.Items.AddFirst( nil, 'Root');
然后以此为基础,添加此项的子节点。删除节点
Treeview.Selected.Delete编辑节点内容
Treeview.Selected.EditText注意:由于根节点没有父节点 (TTreeNode.Parent= nil)
此外,在大批量添加数据到Treeview中时最好使用
TreeView.Items.BeginUpdate;
添加节点
TreeView.Items.EndUpdate
这样能加快显示速度。2.在节点上添加图象
Treeview中几个与图象相关的属性:
SelectedIndex:当节点被选中时在TimageList 中选什么样的图象
OverlayIndex:选那副图象作为掩图(一幅图象透明地显示在另一幅图象的前面),
比如一个节点不可用时加一副X图象在其前面。
ImageIndex:在常态时选用的图的序号
StateIndex: 在StateImages这个ImageList中对应的序号,-1时不显示图象
比较典型的,象在文件管理器中的所显示的一样,Treeview控件在节点之前也可以
显示图象。在Form中放置一ImageList控件,加入几个图片,分别被Index为0,1,…
在Treeview的Image属性项填入你所加入的ImageList的控件名称。TreeNode的ImageIndex
表示节点未被选中时(Selected=nil)的图片序号,SelectedIndex表示节点被选中时图片序号。3.关于Level
Level的概念可以用下图表示:
Level0 Level1 Level24.排序
SortType决定什么时候进行排序;
TreeView.AlphaSort对节点进行排序,如果不能满足要求,你可以定义自己的CustomSort方法。5.Drag&Drop操作,与标准的拖放操作使用方法一样
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
node:ttreenode;
list:tstringlist;
s:ansistring;
begin
query1.Close;
query1.sql.Clear;
query1.sql.Add('select distinct country from customer');
query1.open;
list:=tstringlist.Create;
while not query1.Eof do
begin
list.Append(query1.fieldbyname('country').asstring);
query1.next;
end;
for i:=0 to list.count-1 do
begin
s:=list.strings[i];
node:=treeview1.Items.Add(treeview1.selected,s);
treeview1.Items.addchild(node,'temp');
end;
treeview1.Items[1].Selected :=true;
end;procedure TForm1.deletetemp(node:ttreenode);
var
tempnode:ttreenode;
begin
if (node.count=1) then
begin
tempnode:=node.getFirstChild;
if(tempnode.text='temp') then
tempnode.delete;
end;
end;procedure tform1.addcity(node:ttreenode);
var
j:integer;
s:string;
tempnode,childnode:ttreenode;
begin
s:=node.text;
deletetemp(node);
query1.close ;
query1.sql.clear;
query1.sql.add('select distinct city from customer where country ='''+s+'''');
query1.open;
while not query1.eof do
begin
tempnode:=treeview1.items.addchild(node,query1.fieldbyname('city').asstring);
treeview1.items.addchild(tempnode,'temp');
query1.next;
end;
end;procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
begin
case (node.Level) of
0:if (node.count<=1) then addcity(node);
1: if (node.count<=1) then addcompany(node);
end;
end;procedure tform1.addcompany(node:ttreenode);
var
j:integer;
s:string;
pars:string;
tempnode,childnode:ttreenode;
list:tstringlist;
begin
s:=node.text;
pars:=node.Parent.Text;
query1.close ;
query1.sql.clear;
query1.sql.add('select company from customer where country ='''+pars+''' and city ='''+s+'''');
query1.open;
deletetemp(node);
while not query1.eof do
begin
treeview1.items.addchild(node,query1.fieldbyname('company').asstring);
query1.next;
end;
end;
我的意思是FORM是动态加载的,一般的情况是要SHOW一个FORM,必须
应该先要申明 Uses UnitFORM,对吧?但我现在的情况是做一个控件啊,
该控件只需要一个数据源感知接口,然后生成树,树的动态生成已经搞定,
关键的问题是,双击树的某节点,该节点在数据表中的FORM名称已经取得,
需要做的工作是:在该目录下查找是否该FORM已经存在,如果存在,则
将它显示出来,否则提示:“该模块未完成!”不是那么简单吧/??