做一个TREEVIEW的控件,能够根据数据表中的
字段自动生成根节点跟子节点,双击每个子节点
可以将该子节点的FORM SHOW出来,关键就是怎么
搜索到这个FORM是否存在,如存在怎么将它SHOW
出来呢?通过DLL吗?DELPHI中是否还有其他方法?
谢谢!!!!

解决方案 »

  1.   

    看不懂,什么叫做“该子节点的FORM SHOW出来”
      

  2.   

    每个子节点对应的是一个模块,就是一个FORM啊,
    需要动态的查看该模块是否存在,然后在把他显示出来,就是SHOW出来啊!
      

  3.   

    if not Assigned(fmFinanceMan) then 
      fmFinanceMan := TfmFinanceMan.Create(nil);
    fmFinanceMan.Parent := pnlMain;
    fmFinanceMan.Show;
      

  4.   

    一. 如何初始化一个TreeView? 
    弄一个窗口,放上一个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操作,与标准的拖放操作使用方法一样
      

  5.   

    利用Ttreeview浏览Delphi自带的数据库。
    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;
      

  6.   

    谢谢chenquan(嘉威王子) ,最后朋友们我都会给分的,
    我的意思是FORM是动态加载的,一般的情况是要SHOW一个FORM,必须
    应该先要申明 Uses UnitFORM,对吧?但我现在的情况是做一个控件啊,
    该控件只需要一个数据源感知接口,然后生成树,树的动态生成已经搞定,
    关键的问题是,双击树的某节点,该节点在数据表中的FORM名称已经取得,
    需要做的工作是:在该目录下查找是否该FORM已经存在,如果存在,则
    将它显示出来,否则提示:“该模块未完成!”不是那么简单吧/??