写的是权限分配,以前这么写,没问题,不知道为什么这次就说我的有错误,先上代码!
首先声明一个变量nodesel
  public
    { Public declarations }
    nodesel:TTreeNode;
在treeview的TreeView1MouseUp事件中获取当前选中
nodesel:=TreeView1.GetNodeAt(X,Y);
在添加角色组的按钮的ToolButton1Click事件中
  if nodesel<>nil then
  begin
    if DMJueseguanli.QueryCSelect(nodesel.Text)=true then  //判断是否为角色,的一个函数
    begin
      Application.MessageBox('角色下不能添加角色组',sysinfo,mb_ok+MB_ICONERROR);
      exit;
    end;
  end;
  issel:=false;
  try
    FrmJueseguanliedit:=TFrmJueseguanliedit.Create(Application);//创建添加角色的窗口暂时叫他编辑窗口吧    FrmJueseguanliedit.ShowModal;
  finally
    FrmJueseguanliedit.Free;
  end;
目前为止没有错误
在这个编辑窗口的FormShow事件中
  ComboBox1.Items.Add('0');
  if FrmJueseguanli.nodesel<>nil then //这里错误,调用上一个窗口的nodesel不准许  
  begin
    ComboBox1.Items.Add(trim(FrmJueseguanli.nodesel.Text    
    ComboBox1.ItemIndex:=1;
  end
  else
  ComboBox1.ItemIndex:=0;我以前用xe这么写,没问题,我把代码也一点点的对照过了,现在用的xe2,为什么我在其他窗口调用nodesel有错误呢?怎么解决!!TreeViewDelphi

解决方案 »

  1.   

    if FrmJueseguanli.TreeView1.Selected<>nil then
    这个方法就不用说了,效果一样
      

  2.   

     try
        FrmJueseguanliedit:=TFrmJueseguanliedit.Create(Application);//创建添加角色的窗口暂时叫他编辑窗口吧    FrmJueseguanliedit.ShowModal;
      finally
        FrmJueseguanliedit.Free;
      end;
    目前为止没有错误
    在这个编辑窗口的FormShow事件中
      ComboBox1.Items.Add('0');
      if FrmJueseguanli.nodesel<>nil then //这里错误,调用上一个窗口的nodesel不准许  
      begin
        ComboBox1.Items.Add(trim(FrmJueseguanli.nodesel.Text    
        ComboBox1.ItemIndex:=1;
      end
      else
      ComboBox1.ItemIndex:=0;
    ===========================================================
    FrmJueseguanliedit释放后再次调用会出错! 应该改成这样
    ===========================================================
     try
        FrmJueseguanliedit:=TFrmJueseguanliedit.Create(Application);//创建添加角色的窗口暂时叫他编辑窗口吧    FrmJueseguanliedit.ShowModal;
    //加到这儿  begin
    ComboBox1.Items.Add('0');
      if FrmJueseguanli.nodesel<>nil then //这里错误,调用上一个窗口的nodesel不准许  
      begin
        ComboBox1.Items.Add(trim(FrmJueseguanli.nodesel.Text    
        ComboBox1.ItemIndex:=1;
      end
      else
      ComboBox1.ItemIndex:=0;
    //加到这儿 end
      finally
        FrmJueseguanliedit.Free;
      end;
      
      

  3.   

    Quote: 引用 2 楼 simonhehe 的回复:

    //加到这儿  begin
    ComboBox1.Items.Add('0');
      if FrmJueseguanli.nodesel<>nil then //这里错误,调用上一个窗口的nodesel不准许  
      begin
        ComboBox1.Items.Add(trim(FrmJueseguanli.nodesel.Text    
        ComboBox1.ItemIndex:=1;
      end
      else
      ComboBox1.ItemIndex:=0;
    //加到这儿 end
    你这一段加在FrmJueseguanliedit.ShowModal;的后面就是个错误,其次,“FrmJueseguanliedit释放后再次调用会出错!”FrmJueseguanliedit这个窗口还没有释放,没有执行完FrmJueseguanliedit.ShowModal,是不会释放窗口的,所以不是这个错误……
    还有我试了一下,在FrmJueseguanliedit.ShowModal之前加载,FrmJueseguanli.nodesel就错误,nodesel就没问题……知道问题是什么了,就是不知道为什么!以前这么调用没问题呀!!
      

  4.   

    FrmJueseguanliedit:=TFrmJueseguanliedit.Create(Application);
    FrmJueseguanliedit.ShowModal;
    你可以把这部分封装一下,在 FrmJueseguanliedit所在单元写一个函数,注意不是类函数
    procedue ShowFrmJueseguanliedit(nodesel:TTreeNode);这样传递一下
      

  5.   

    你能详细告诉我一下,应该怎么传递么?如果直接在FrmJueseguanliedit中public声明一个函数,
    procedue ShowFrmJueseguanliedit(nodesel:TTreeNode);但是在FrmJueseguanliedit中是没有treeview的,所以nodesel:TTreeNode是错误的。
      

  6.   

    现在要解决的问题是,为什么在FrmJueseguanli窗口下FrmJueseguanli.nodesel就错误nodesel就没问题。这个解决了,其他的都不是问题了。在xe下这么写过,难道xe2就不能了?如果不能,改怎么调用呢?
      

  7.   

    我说的写的封装函数不是写到public,是写到类外面,单元函数,Implementation上面那里,这是常规做法。至于nodesel:TTreeNode错误 ,跟窗体上有没有treeview是没有关系的。你在引用单元加一个uses ComCtrls,其实窗体界面肯定有这个啊。
    指出一句:通常是这么判断对象if assigned(nodesel) then你的情况确实没见过,我没有用xe, 你的情况是FrmJueseguanli.nodesel这样访问是会出错,出错原因可能是创建释放先后的问题,具体得看代码。但按我的做法,写一个封装方法 在FrmJueseguanli里面调用ShowFrmJueseguanliedit(nodesel),理论上是可以避免这个问题。
      

  8.   

    恩,方法我,明白了,问题我也找出来了,为了好看,主窗体我用的是CreateTabPage创建,这样没有内存空间,我换了创建方式就好了。
      

  9.   

    顺便问一下,uses引用那些,对应那些东西,有木有详细的对照下呀?或者有没有什么好的文章之类的推荐下,谢谢。对着方面不熟悉。
      

  10.   

    引用单元: 如果是控件类的话  如treeview:Ttreeview 你按Ctrl点一下Ttreeview 就会跳转到要引用的单元,,当你拖控件时,你的uses里面是会自动添加的。  其它的一些功能函数方面的,就得具体查了,这个很复杂,我也一下说不清