各位大侠看看我的这个搜索算法那里有缺陷?procedure TFmDm.SetTreeviewMultiSelect(SuoZaidDi:TTreeview;Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
   i_loop :Integer;
begin
   if Button=mbRight then
      begin
         SuoZaidDi.Select(SuoZaidDi.GetNodeAt(x,y));
         if SuoZaidDi.Selected<>nil then  //鼠标选择,获取焦点
            begin
               if SuoZaidDi.Selected.ImageIndex=0 then    //SuoZaidDi.Selected.ImageIndex=0未选图标
                  begin
                     if SuoZaidDi.Selected.Level>0 then   //非根节点
                        begin
                           if SuoZaidDi.Selected.Parent.ImageIndex=0 then
                              begin
                                 SuoZaidDi.Selected.ImageIndex:=1;  //ImageIndex:=1选中一个非根节点
                                 SuoZaidDi.Selected.SelectedIndex:=1;
 /////下面这个循环没有把下一级的最后一个子节点的所有孙节点获取到,请问大侠要如何改进?
                                 if SuoZaidDi.Selected.HasChildren then //非根节点的所有子结点
                                    begin
                                       for i_loop:=Trv_ryjs_szd.Selected.getFirstChild.AbsoluteIndex to   SuoZaidDi.Selected.GetLastChild.AbsoluteIndex do
                                           SuoZaidDi.Items.Item[i_loop].ImageIndex:=1;//已选图标
                                    end;
                              end;
                        end
                     else   //根节点 Level=0
                        begin
                           SuoZaidDi.Selected.ImageIndex:=1;      //选中根节点
                           SuoZaidDi.Selected.SelectedIndex:=1;
 /////下面这个循环没有把下一级的最后一个子节点的所有孙节点获取到,请问大侠要如何改进?
                           if SuoZaidDi.Selected.HasChildren then //根节点的所有子结点的选择
                              begin
                                 for i_loop:=SuoZaidDi.Selected.getFirstChild.AbsoluteIndex to SuoZaidDi.Selected.GetLastChild.AbsoluteIndex do
                                     SuoZaidDi.Items.Item[i_loop].ImageIndex:=1;
                              end;
                        end;
                  end;
            end;
      end;
   SuoZaidDi.Refresh;//刷新
end;

解决方案 »

  1.   

    上面代码执行之后的效果如下:
    假如有三级节点:根节点AAA;一级节点A1,B1,C1;二级节点;三级节点a1,a2,b1,b2,c1,c2,c3...
    ***AAA
      **A1
        *a1
        *a1
      **B1
        *b1
        *b2
      **C1
        *c1
        *c2
        *c3
    点击根节点AAA获取焦点,执行之后,下一级最后一个自己点C1下面的所有孙节点c1,c2,c3不能取到
    问:该如何修改里面的代码来解决?