我的程序中有一个重复查找的功能,如果查找的项在可见区域外,Listview的滚动条不会自动滚动。如何使它能自动滚动,显示出我所找到并选中的项(主要是显示的问题,该项我已经找到)?

解决方案 »

  1.   

    procedure TRichList.Search;
    var s: string;
        i: integer;
        p: TPoint;
    begin
       if LV.Items.Count=0 then exit;
       if CanSearch(s,FDlgCol) then
       begin
          for i:=0 to Lv.Items.Count-1 do
          begin
             if Lv.Items[i].Caption = s then
                begin
                   LV.SetFocus;
                   lv.Selected:= lv.Items[i];
                   lv.Items[i].Focused:= true;
                   p:=lv.Items[i].Position;
                   lv.Scroll(0,p.y-20);
                   lv.Scroll(p.x-20,0);
                   exit;
                end;
          end;
          //lv.FindCaption(0,s,false,true,true);
          application.MessageBox('搜索结束,没有找到符合条件的人','提示',MB_OK+MB_ICONINFORMATION);
          lv.Selected:= lv.Items[0];
       end;
    end;
    其中lv就是listview
      

  2.   

    不行呀,难道listview还有什么特殊的设置?
      

  3.   

    我试了也好像不行,用下面语句:
    ListView1.Items[i].MakeVisible(True);
      

  4.   

    procedure TMainFrm.Button1Click(Sender: TObject);
    var
      DX,DY : integer;
    begin
      DX := lvPlugIns.Selected.Position.X - lvPlugins.Left;
      DY := lvPlugIns.Selected.Position.Y - lvPlugins.top;
      lvPlugIns.Scroll(DX,DY);
    end;
    自己照这个方法算一算就可以了.
      

  5.   

    如果简单点, 并且可以把listview的顺序交换那么:
    就是先用,sendMessage,ListViewHwnd,LVM_GETTOPINDEX,0
    得到当前的最上面的那个item的index,然后与找到的那个index,下的内容全部交换一下。如果不容许交换顺序
    那么就用,sendMessage,ListViewHwnd,LVM_SCROLL,0,dy
    至于dy = ?,就要自己算了,
      

  6.   

    LVM_FIRST           =  1000h
    LVM_SCROLL      =   LVM_FIRST + 20
    直接带常数    0x1000+20
      

  7.   

    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      tmpItem: TListItem;
      dx,dy: integer;
    begin
      tmpItem := listview1.FindCaption(0,edit1.Text,true,false,true);
      listview1.Selected := tmpItem;
      listview1.SetFocus;
      dx := tmpItem.Position.X - listview1.Left;
      dy := tmpItem.Position.Y - listview1.Top - 20;
      listview1.Scroll(dx,dy);
    end;
    我试过了,完全可以的。
      

  8.   

    我发现sendmessage,如果listview.multiselected:=true的话,就不行了!为什么呀?
    还有,我使用listview1.scroll就是不行!