哈哈,老千真好
偶有一段程序,别人的例子,不只能否看懂
界面如下
   用户管理  
       超级用户
           普通用户1
           普通用户2
           ……代码:
procedure Tf_szkl.qx_newClick(Sender: TObject);
var newName : string;
    index : integer;  //权限树索引
    namecount,succ : integer;  //姓名树、姓名不重复标志
begin  //新建操作员
  //展开权限树
  qxtree.Items[0].Expand(False);
  qxtree.Items[1].Expand(False);  //打开权限内容数据库
  ds_data.Qu_qxcount.Close;
  ds_data.Qu_qxcount.Open;  //操作员总数+1
  pcount:=pcount+1;  //新建操作员的权限和管理员一样
  qxx:=f_gbv.pass_qxx.Caption;  //姓名初始化判断
  namecount:=1;
  succ:=0;
  while (succ=0) do
  begin
       //姓名初始化
       newName:='新建操作员'+IntToStr(namecount);
       succ:=1;       //判断操作员姓名是否重复
       for i:=0 to pcount-1 do
       begin  //判断管理员和每一个操作员
            if i=0 then
               index:=1//管理员索引
            else
               index:=(i-1)*(qxcount+3)+3;//操作员索引
            if newName=qxtree.Items[index].Text then
               succ:=0;  //姓名重复
       end;
       if succ=0 then namecount:=namecount+1;
  end;  //添加操作员姓名
  newNode:=qxtree.Items.AddChild(qxtree.Items[1],newName);
  newNode.StateIndex:=5;
  //添加操作员口令
  qxNode1:=qxtree.Items.AddChild(newNode,'设置口令');
  qxNode1.StateIndex:=4;
  qxtree.Items.AddChild(qxNode1,'jfos');  //添加操作员权限
  for j:=1 to qxcount do
  begin  //添加操作员权限
       qxNode1:=qxtree.Items.AddChild(newNode,ds_data.Qu_qxcount.FieldByName('name').AsString);
       ds_data.Qu_qxcount.Next;  //下一个权限内容
       //更新权限
       if qxx[j]='1' then
          qxNode1.StateIndex:=1
       else
          qxNode1.StateIndex:=3;
  end;  //关闭权限内容数据库
  ds_data.Qu_qxcount.Close;  //手动修改姓名
  newNode.Selected:=True;
  newNode.EditText;
end;            
其中,这一段偶不明白,       //判断操作员姓名是否重复
       for i:=0 to pcount-1 do
       begin  //判断管理员和每一个操作员
            if i=0 then
               index:=1//管理员索引
            else
               index:=(i-1)*(qxcount+3)+3;//操作员索引##################### 1
            if newName=qxtree.Items[index].Text then
               succ:=0;  //姓名重复
       end;
       if succ=0 then namecount:=namecount+1;
  end;尤其 1 处,拜托告知

解决方案 »

  1.   

    呵呵~~不好意思~~俺不懂TreeView~~
      

  2.   

    这没什么花头,就是循环检索新的操作员名字是否存在于已有的TreeNode中。
    对了qxcount是哪里来的?
      

  3.   

    qxcount是多少啊?是不是每个操作员下面的子Node的个数?
      

  4.   

    哇,我怎么现在才来,
    chechy师父,你猜对了,好厉害,
    qxcount是query出来的,query的是程序模块
    每个子node代表一个模块,
    双击子节点,就可选择该模块是否可用
    这段程序实现了,偶上午所说的,
    即可用 新用户1,2,3……
    又可自行更改 新用户
    而且每次 新建 都是自动续上次的 新用户X
    老鱼也帮偶看看
      

  5.   

    偶标注的地方是偶看不懂的
    即:index:=(i-1)*(qxcount+3)+3;//操作员索引##################### 1
    另外,偶对index的用法也不太明了
      

  6.   

    这个式子就是求出每个普通用户的节点的Index。我觉得写这个程序的人,真是舍近求远。如果他去Locate生成这个TreeView的Query,那么就简单多了。
      

  7.   

    偶写错了,index:=(i-1)*(qxcount+3)+2; 偶不明白意义,是公式吗
    它的query是select * from table  
      

  8.   

    +2是因为普通用户1前大概有2个节点。
    qxcount+3大概是因为,每个普通用户下有qxcount+3个节点。
    i-1是因为i从1开始。
    因此,这个公式将算出每个普通用户在整个TreeView.Items重的Index。
    再不懂,我要晕了。
      

  9.   

    师父莫晕,弟子愚钝
    普通用户前确有2个节点
    但普通用户下 节点=qxcount
    因此+3 偶不明白
      

  10.   

    不对,普通用户下,除了qxcount外,应该还有额外两个节点,另外算上自己,才是+3。
      

  11.   

    偶漏数一个,加上子节点与节点自己,all is qxcount+3
    师父真高,偶什么时候才能出师呢?
    拜谢,3拜,
    师父刚才说locate是什么呢?是否比此简单呢?
    望赐教
      

  12.   

    生成这个TreeView,总是需要从数据库中读出吧。
      

  13.   

    在失去焦点的事件中加上一句:
                thenode.selected:=true;
    //thenode 为你所要选的节点
      

  14.   

    启动时候,每次都要读的 
    //打开权限内容数据库
      ds_data.Qu_qxcount.Close;
      ds_data.Qu_qxcount.Open;
    Qu_qxcount.sql=select from table
    table里面是模块,即普通用户下的子节点
      

  15.   

    师父莫诓我,偶的设计也可能用到的
    读的,
    下面是treeview的int过程
    procedure Tf_szkl.InitQxtree();
    begin  //初始化权限树
      //删除旧管理员
      qxtree.Items.Delete(qxtree.Items[1]);  //新建、修改管理员类型和姓名
      if qx='0' then
         qxtree.Items[0].Text:='用户管理员'
      else
         qxtree.Items[0].Text:='设备管理员';
      qxNode:=qxtree.Items.AddChild(qxtree.Items[0],f_gbv.pass_name.Caption);
      qxNode.StateIndex:=6;  //得到权限总数
      with ds_data.Qu_qxcount do
      begin
           Close;
           Open;
           qxcount:=RecordCount;
      end;  //打开权限数据库
      with ds_data.Qu_chqx do
      begin
           //参数设置
           Close;
           ParamByName('qx').value:=IntToStr(StrToInt(qx)+1);
           Open;
           pcount:=RecordCount;  //得到操作员总数       //添加操作员
           for i:=1 to pcount do
           begin
                ds_data.Qu_qxcount.First;
                qxx:=FieldByName('qxx').AsString;  //得到权限内容            //添加操作员姓名
                qxNode:=qxtree.Items.AddChild(qxtree.Items[1],FieldByName('name').AsString);
                qxNode.StateIndex:=5;
                //添加操作员口令
                qxNode1:=qxtree.Items.AddChild(qxNode,'设置口令');
                qxNode1.StateIndex:=4;
                qxtree.Items.AddChild(qxNode1,FieldByName('passwd').AsString);            //添加操作员权限
                for j:=1 to qxcount do
                begin  //添加操作员权限
                     qxNode1:=qxtree.Items.AddChild(qxNode,ds_data.Qu_qxcount.FieldByName('name').AsString);
                     ds_data.Qu_qxcount.Next;  //下一个权限内容
                     //更新权限
                     if qxx[j]='1' then
                        qxNode1.StateIndex:=1
                     else
                        if qxg[j]='1' then
                           qxNode1.StateIndex:=2
                        else
                           qxNode1.StateIndex:=3;
                end;
                Next;  //下一个操作员
           end;
           Close;  //关闭权限数据库
      end;
      ds_data.Qu_qxcount.Close;  //关闭权限内容数据库  //展开权限树
      qxtree.Items[0].Expand(False);
      qxtree.Items[1].Expand(False);
    end;
      

  16.   

    呵呵,你怕我诓你代码吗?
    看了你的代码,我觉得,刚才那个检索,可以用下列代码代替Qu_chqx.Locate('name', newname, []);
      

  17.   

    哪里哪里,师父要全部送上,师父留地址,以后偶再有疑问,就好问了
    一时还不明白,偶先把treeview的节点设置好了
      

  18.   

    唉~~
    TO:chechy(chechy) ~~他是chris2019(牛虻---牛角挂书版) ~~呵呵~~