是这样的:我程序中有treeview,它是由主菜单的菜单项构成的,现在我想实现这个功能:改变treeview中的内容让这些改变信息反馈到主菜单,也就是主菜单跟着treeview改动!这个功能有办法实现吗?请个位大哥帮帮忙看看!

解决方案 »

  1.   

    treeview樹根據菜單的內容而變化,你的數據是不是從數據庫中來的?如果是,可以進行關聯update...
      

  2.   

    在node的data中保留对应菜单的指针,当修改node值时,同时更新TMenuItem(node.data)的相关信息
      

  3.   

    是的。可以根据treeview的node去更新MenuItem的data菜单内容
      

  4.   


    --比如 我对node进行了拖动,拖动到另一个父几点下,那更新menu应该怎么写呢?
      

  5.   

    Quote=引用 6 楼 cuit_xiong 的回复:]
    引用 3 楼 bdmh 的回复:
    在node的data中保留对应菜单的指针,当修改node值时,同时更新TMenuItem(node.data)的相关信息
    --比如 我对node进行了拖动,拖动到另一个父几点下,那更新menu应该怎么写呢?
    [/Quote]TMenuItem(node.data)[
      

  6.   

    TMenuItem(node.data).parent := TMenuItem(node.parent.data);
      

  7.   

    当然能够实现:)
    实际的需求是:1.各树节点与菜单项一一对应,就需要记录它们的ID(唯一标识)和他们的ParentID(父节点),树的不用多说,菜单项的就是上一级菜单的ID,两者相一致。2.无论哪一项发生变更,要得到它的父节点ParentID,以此来确定其关联项的位置。(在树上操作,树的元素已经发生了改变)
    接下来就谈实现了:如上边几位所说的,Record样式把两个属性值附加到树节点和每个菜单项(MenuItem没测过有没有AddObject之类的方法),当然可以,访问起来毕竟烦琐,还要考虑它的资源释放,说实话,我比较讨厌这个方法:)。既然不愿意麻烦,就捡偷懒的方法来罢。我喜欢组件的Hint属性,把showHint设为False,将ID,ParentID以上述格式存到每一项的Hint中,处理完树后,就去根据ID,ParentID找对应菜单项,然后在新位置上生成一个新的,把老的删除掉就达到你的基本要求了。
      

  8.   

    procedure TfrmMain.TreeView1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    var TargetNode, SourceNode: TTreeNode;
    begin
      TargetNode := TreeView1.DropTarget;
      SourceNode := TreeView1.Selected;
      if MessageBox(handle, '您确认要移动目录吗?', '提示', MB_ICONQUESTION
        + MB_YESNO) = IDYES then
        if TreeUtil.ModifyNodePID(PNodeData(TargetNode.Data)^.Index, SourceNode) then
          TreeUtil.FillTree;
    end;