做几个小图标,根据状态来切换,很容易的

解决方案 »

  1.   

    根据状态来切换早就完成了,我现在的问题比较头疼,我正在思考中
      

  2.   

    procedure TSZGWCDForm.tree1MouseDown(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
     //0:没有选,1:灰,2:选中,3:只读
    var
      node1,pnode,ppNode:TfcTreenode;
      i,j:integer;
      AllCheck,AllNotCheck:boolean;
       myhittest:tfchittests;
    begin
      if IsFinished then exit;
      IsFinished:=true;
      Tree1.AutoExpand:=False;
      myhittest:=Tree1.gethittestinfoat(X,Y);
      if not (fchtonitem in myhittest) then
      exit;  Node:=tree1.GetNodeAt(X,Y);
      Node.Selected:=True;//node.Selected:=true ;
    //----------------处理该节点有子节点,则只有1\2两种状态------------
    //--------------------若没有子节点,则有0\2两种状态---------------
      if node.HasChildren then
      begin
         if node.ImageIndex=2 then
         begin
           node.ImageIndex :=0;
           Node.SelectedIndex :=0;
         end  else if node.ImageIndex=0 then
         begin
           Node.ImageIndex := 2;
           Node.SelectedIndex :=2;
         end else if Node.ImageIndex =1 then
         begin
           Node.ImageIndex := 0;
           Node.SelectedIndex :=0;
         end;
         PTreeRec(node.Data).Modified:=true;
      end
      else
      begin
        if Node.ImageIndex =2 then
        begin
          node.ImageIndex :=0 ;
          node.SelectedIndex :=0;
        end  else  if Node.ImageIndex = 0 then
        begin
          Node.ImageIndex := 2;
          Node.SelectedIndex := 2;
        end ;
        PTreeRec(node.Data).Modified:=true;
      end;//-----------处理上一级选,下面各级都选----------
    //-----------上一级不选,下面各级都不选----------
      if node.HasChildren then
      begin
        node1:=node.GetLastChild ;
        while node1<> nil do
        begin
          j:=node1.AbsoluteIndex ;
          node1:=node1.GetLastChild ;
        end;
        for i:=node.AbsoluteIndex to j do
        begin
          if node.ImageIndex=2 then  begin
             Tree1.Items[i].ImageIndex :=2;
             Tree1.Items[i].SelectedIndex :=2
          end
          else if node.ImageIndex=0 then  begin
             Tree1.Items[i].ImageIndex:=0;
             Tree1.Items[i].SelectedIndex:=0;
          end
          else if node.ImageIndex=1 then begin
             Tree1.Items[i].ImageIndex:=0;
             Tree1.Items[i].SelectedIndex:=0;
          end;
          PTreeRec(node.Data).Modified:=true;
        end;
      end;
    //-----------处理子节点中有空,父节点必须为灰的情况---------------//--------------------------只处理三层菜单-------------------------------
      if node.Level =2 then   //如果有子结点
      begin
        Allcheck:=true;
        Allnotcheck:=true;
        Pnode:=node.parent;
        for i:= 0 to Pnode.Count -1 do
        begin
          if Pnode.item[i].ImageIndex  <> 2 then
            Allcheck:=false;
          if Pnode.Item[i].ImageIndex <> 0 then
            Allnotcheck:=false;
        end;
        if Allcheck then
        begin
          Pnode.ImageIndex :=2;
          Pnode.SelectedIndex :=2;
        end
        else if Allnotcheck then
        begin
          Pnode.ImageIndex :=0;
          Pnode.SelectedIndex :=0;
        end
        else begin
          Pnode.ImageIndex :=1;
          Pnode.selectedindex:=1;
        end;
        PTreeRec(node.Data).Modified:=true;
      end;  if node.Level=3 then
      begin
        Allcheck:=true;
        Allnotcheck:=true;
        pNode:=node.Parent ;
        ppNode:=pNode.Parent ;    for i:= 0 to Pnode.Count -1 do
        begin
          if Pnode.item[i].ImageIndex  <> 2 then
            Allcheck:=false;
          if Pnode.Item[i].ImageIndex <> 0 then
            Allnotcheck:=false;
        end;    if Allcheck then
        begin
          Pnode.ImageIndex :=2;
          Pnode.SelectedIndex :=2;
        end
        else if Allnotcheck then
        begin
          Pnode.ImageIndex :=0;
          Pnode.SelectedIndex :=0;
        end
        else begin
          Pnode.ImageIndex :=1;
          Pnode.selectedindex:=1;
        end;    Allcheck:=true;
        Allnotcheck:=true;
        for i:= 0 to PPnode.Count -1 do
        begin
          if PPnode.item[i].ImageIndex  <> 2 then
            Allcheck:=false;
          if PPnode.Item[i].ImageIndex <> 0 then
            Allnotcheck:=false;
        end;    if Allcheck then
        begin
          PPnode.ImageIndex :=2;
          PPnode.SelectedIndex :=2;
        end
        else if Allnotcheck then
        begin
          PPnode.ImageIndex :=0;
          PPnode.SelectedIndex :=0;
        end
        else begin
          PPnode.ImageIndex :=1;
          PPnode.selectedindex:=1;
        end;
        PTreeRec(Ppnode.Data).Modified:=true; //如果改变了, 节点改变标志
    //--------------------以上pnode的节点逻辑上, 多个情况不能表达清楚,全部改变状态--------
      end;
      node.Selected:=false;
      // tree1.Refresh;
      // bbtnApply.Enabled:=true;
    end;