我是这样的:procedure TfmReplace.btnUpClick(Sender: TObject);
var
  iIndex: integer;
  strTemp1,strTemp2:  String;
begin
//上移
//办法很笨,麽办法,对ListView的方法还不是很熟悉
    if   (not(ListView1.SelCount>0)) then
      ShowMessage('请选择优先执行的规则!')
      else if not(ListView1.Selected.Index=0)
      then  begin
              iIndex:=ListView1.Selected.Index-1;
              strTemp1:=ListView1.Items.Item[iIndex].Caption;
              strTemp2:=ListView1.Items.Item[iIndex].SubItems[0];
              ListView1.Items.Item[iIndex].Caption:= ListView1.Selected.Caption;
              ListView1.Items.Item[iIndex].SubItems[0]:= ListView1.Selected.SubItems[0];
              ListView1.Selected.Caption:=strTemp1;
              ListView1.Selected.SubItems[0]:= strTemp2;
//              ListView1.Items.Item[iIndex].Selected;
          end;end;
procedure TfmReplace.btnDownClick(Sender: TObject);
var
  iIndex: Integer;
  strTemp1,strTemp2:String;
begin
//下移
    if   (not(ListView1.SelCount>0))  then
      ShowMessage('请选择延后执行的规则!')
      else if not(ListView1.Selected.Index=ListView1.Items.Count-1)
        then  begin
              iIndex:=ListView1.Selected.Index+1;
              strTemp1:=ListView1.Items.Item[iIndex].Caption;
              strTemp2:=ListView1.Items.Item[iIndex].SubItems[0];
              ListView1.Items.Item[iIndex].Caption:= ListView1.Selected.Caption;
              ListView1.Items.Item[iIndex].SubItems[0]:= ListView1.Selected.SubItems[0];
              ListView1.Selected.Caption:=strTemp1;
              ListView1.Selected.SubItems[0]:= strTemp2;
//              ListView1.Items.Item[iIndex].Selected;
          end;
end;
不知道各位兄弟怎么实现的,有没有更好的办法,抛砖引玉一下.

解决方案 »

  1.   

    我是这样做的:
    1)向上移动整行
    void __fastcall TF_testdefinitioneditor::sbUpClick(TObject *Sender)
    {
        List->SetFocus();
        TListItem *pSelectedItem = List->Selected;
        if (pSelectedItem != NULL)
        {
            int selectedindex = pSelectedItem->Index;
            if (selectedindex > 0)
            {
                TListItem *pUpItem = List->Items->Item[selectedindex - 1];
                AnsiString strTemp;
                strTemp = pSelectedItem->Caption;
                pSelectedItem->Caption = pUpItem->Caption;
                pUpItem->Caption = strTemp;
                strTemp = pUpItem->SubItems->Strings[0];
                pUpItem->SubItems->Strings[0] = pSelectedItem->SubItems->Strings[0];
                pSelectedItem->SubItems->Strings[0] = strTemp;
                strTemp = pUpItem->SubItems->Strings[1];
                pUpItem->SubItems->Strings[1] = pSelectedItem->SubItems->Strings[1];
                pSelectedItem->SubItems->Strings[1] = strTemp;            List->Selected = pUpItem;
                pUpItem->Focused = true;
                pUpItem->MakeVisible(true);
            }    }
    }2)向下移动整行
    void __fastcall TF_testdefinitioneditor::sbDownClick(TObject *Sender)
    {
        List->SetFocus();
        TListItem *pSelectedItem = List->Selected;
        if (pSelectedItem != NULL)
        {
            int selectedindex = pSelectedItem->Index;
            int itemcount = List->Items->Count;
            if (selectedindex < itemcount - 1)
            {
                TListItem *pDownItem = List->Items->Item[selectedindex + 1];
                AnsiString strTemp;            strTemp = pSelectedItem->Caption;
                pSelectedItem->Caption = pDownItem->Caption;
                pDownItem->Caption = strTemp;            strTemp = pDownItem->SubItems->Strings[0];
                pDownItem->SubItems->Strings[0] = pSelectedItem->SubItems->Strings[0];
                pSelectedItem->SubItems->Strings[0] = strTemp;            strTemp = pDownItem->SubItems->Strings[1];
                pDownItem->SubItems->Strings[1] = pSelectedItem->SubItems->Strings[1];
                pSelectedItem->SubItems->Strings[1] = strTemp;            List->Selected = pDownItem;
                pDownItem->Focused = true;
                pDownItem->MakeVisible(true);
            }    }
    }
      

  2.   

    嗯,试试看。
    我那个办法,只要移动一行后,选定的Items就不是原来操作的对象了。
    简言之,不能连续移动,必须移动一行后,再选定它,然后才能再移动。
    先谢谢楼上2位兄弟。
      

  3.   

    //上移
    var
      idex: Integer;
      TmpList1, TmpList2, TmpupList: TListItem;
    begin
      TmpList1 := LtView.Selected;
      if TmpList1 = nil then Exit;
      idex := TmpList1.Index;
      if idex = 0 then Exit;
      TmpList2 := LtView.Items[idex - 1];
      LtView.Items.BeginUpdate;
      try
        TmpupList := LtView.Items.Add;
        TmpupList.Assign(TmpList1);
        TmpList1.Assign(TmpList2);
        TmpList2.Assign(TmpupList);
        TmpList2.Selected := True;
        LtView.SetFocus;
      finally
        TmpupList.Delete;
        LtView.Items.EndUpdate;
      end;  
    end;
    //下移
    var
      idex, iCount: Integer;
      TmpList1, TmpList2, TmpdwList: TListItem;
    begin
      TmpList1 := LtView.Selected;
      if TmpList1 = nil then Exit;
      idex := TmpList1.Index;
      iCount := LtView.Items.Count - 1;
      if idex = iCount then Exit;
      TmpList2 := LtView.Items[idex + 1];
      LtView.Items.BeginUpdate;
      try
        TmpdwList := LtView.Items.Add;
        TmpdwList.Assign(TmpList1);
        TmpList1.Assign(TmpList2);
        TmpList2.Assign(TmpdwList);
        TmpList2.Selected := True;
        LtView.SetFocus;
      finally
        TmpdwList.Delete;
        LtView.Items.EndUpdate;
      end;
    end;
      

  4.   

    搞定了,是我不会用
                List->Selected = pDownItem;
                pDownItem->Focused = true;,再加50分结帖。盛情感谢各位兄弟帮忙。