我看到有两中方法,但都不使用,我想把它更实用点.请大家帮帮忙.
一.
在listview中的OnDrawcustomItem中用下列语句实现.
if Item.Index mod 2 =0 thenSender.Canvas.Brush.Color :=clSkyBlueelseSender.Canvas.Brush.Color :=clWhite;
我把if Item.Index mod 2 =0 then条件改为if Item.index=listview1.selected.index then 可运行时在这儿就要出错请大家帮我看看错在哪儿,怎样修改.
 
二.
在OnDrawcustomItem中用下列的语句实现
var
  p:trect;
begin
  if cdsselected in state then
  begin
    listview1.Canvas.Font.Color:=clgreen;
    listview1.Canvas.brush.Color:=clred;
    p:=item.displayrect(drselectbounds);
    listview1.Canvas.FillRect(p);
    listview1.Canvas.Textout(p.Left+2,p.Top,item.Caption);
    listview1.Canvas.brush.Color:=clblue;
    listview1.Canvas.FrameRect(item.displayrect(drselectbounds));
    defaultdraw:=false;
  end;
但是运行时若在多行之间切换会在listview的最左边有一点颜色总是消不完,就是在listview的最左边会出现一条红色的直线.看来很不爽.还是请大家帮我修改一下吧我正要用这个.谢谢!   

解决方案 »

  1.   

    canvas的PEN属性里有STYLE属性你把它设为psClear这样就是透明线了。你试试
      

  2.   

    to whitetiger8:我把pen.style:=psclear还是不行呢.请各位大虾在帮想想吧.
      

  3.   

    这样改一下就没有红线了
    var
      p:trect;
    begin
      if cdsselected in state then
      begin
        listview1.Canvas.Font.Color:=clgreen;
        listview1.Canvas.brush.Color:=clred;
        p:=item.displayrect(drselectbounds);
        p.Left :=P.Left+2;
        listview1.Canvas.FillRect(p);
        listview1.Canvas.Textout(p.Left+2,p.Top,item.Caption);
        listview1.Canvas.brush.Color:=clblue;
        listview1.Canvas.FrameRect(item.displayrect(drselectbounds));
        defaultdraw:=false;
      end;
      

  4.   

    to liuziran,你的程序运行结果是有一个蓝色的边,我改了一下,现在可以了.
    var
    p:trect;
    begin
      if cdsselected in state then
      begin
        listview1.Canvas.Font.Color:=clgreen;
        listview1.Canvas.brush.Color:=clred;
        p:=item.displayrect(drselectbounds);
        p.Left:=p.Left+2;
        listview1.Canvas.FillRect(p);
        listview1.Canvas.Textout(p.Left,p.Top,item.Caption);
        listview1.Canvas.brush.Color:=clblue;
        listview1.Canvas.FrameRect(p);
        defaultdraw:=false;
      end;