这个是我写的装入ListView的语句
ListView1.Clear;
  while not ADOQuery4.Eof do
  begin
    temp := ListView1.Items.Add;
    temp.Caption := ADOQuery4.Fields[0].AsString ;
    For i := 1 to 7 do
    begin
       temp.SubItems.Add(ADOQuery4.Fields[i].AsString);
    end;
    ADOQuery4.Next;
  end;
如何在装入ListView的同时设定行的颜色?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      ListView1.Clear;
      while not ADOQuery4.Eof do
      begin
        with ListView1.Items.Add do
        begin
          Caption := ADOQuery4.Fields[0].AsString;
          for J := 1 to 7 do SubItems.Add(ADOQuery4.Fields[i].AsString);
          Data := Pointer(Random($10000000)); //000000-FFFFFF//颜色赋值
         ADOQuery4.Next;
        end;
      end;
    end;procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      Sender.Canvas.Brush.Color := TColor(Item) xor $FFFFFF;
      Sender.Canvas.Font.Color := TColor(Item);
    end;
      

  2.   

    Data := Pointer(Random($10000000)); //000000-FFFFFF//颜色赋值
    这个语句我改为Data:= Pointer(clRed);后每次装载ListView后颜色都有变化,如何固定一种颜色?
      

  3.   

    我将Data := Pointer(Random($10000000)); //000000-FFFFFF//颜色赋值
    这个语句注释掉也改变颜色?好晕啊,我的设想是在装载ListView的同时根据条件将某一行的颜色改为红色。
      

  4.   

    if 你的条件 then
      Data := Pointer(clRed)
    else Data := Pointer(clBlack);
      

  5.   

    兄弟,你的方法不对,改变颜色的关键语句是在
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      Sender.Canvas.Brush.Color := TColor(Item) xor $FFFFFF;
      Sender.Canvas.Font.Color := TColor(Item);
    end;
    中的。我这样写为什么不行?
        if Now-StrToDate(Item.SubItems.Strings[1])>3 then
        begin
          Sender.Canvas.Brush.Color := clRed;
          Sender.Canvas.Font.Color := clYellow;
        end;
      

  6.   

    同样的语句我在一个BUTTON中加载ListView就变化颜色,而在FormShow的时候加载就没有变化。是什么原因?
      

  7.   

    procedure TF_YSGL_DU.FormShow(Sender: TObject);
    begin
      ADOQuery1.ConnectionString:=dm.Con_Str;
      ADOQuery2.ConnectionString:=dm.Con_Str;
      ADOQuery3.ConnectionString:=dm.Con_Str;
      ADOQuery4.ConnectionString:=dm.Con_Str;
      //ADOQuery5.ConnectionString:=dm.Con_Str;
      with ADOQuery3 do
      begin
        close;sql.clear;
        sql.Add('select sysdate from dual');
        open;
        DateTimePicker1.DateTime:=fieldbyname('sysdate').asdatetime;
      end;
      case RadioGroup1.ItemIndex of
        0: s_g_1:='  order by a.kdsj ';
        1: s_g_1:='  order by a.ddsj ';
        3: s_g_1:='  order by a.ysmdd ';
      end;
      case RadioGroup2.ItemIndex of
        0: s_g_2:='  asc ';
        1: s_g_2:='  desc ';
      end;
      S_PX:= s_g_1+s_g_2;
      AddAdoQuery4(S_PX);
    end;procedure TF_YSGL_DU.AddAdoQuery4(O_px:String);
    var
      i: Integer;
      s_lsh:String;
      temp: TListItem;
    begin
        s_lsh:='select a.lsh,a.kdsj,a.ddsj,a.ysmdd,';
        s_lsh:=s_lsh+'(select xm  from a_ry where lsh=a.sqrlsh) sqrlsh,';
        s_lsh:=s_lsh+'(select xm  from a_ry where lsh=a.tbrlsh) tbrlsh,';
        s_lsh:=s_lsh+'(select mc  from a_zywzb where lsh=a.wzlsh) mc,a.wzsl';
        s_lsh:=s_lsh+' from a_ysd a,a_zywzb b where a.wzlsh=b.lsh and DJZT = 0'+O_px;
      with ADOQuery4 do
      begin
        close;sql.Clear;
        sql.Add(s_lsh);
        open;
      end;
      //AddListView(Sender);
      ListView1.Clear;
      while not ADOQuery4.Eof do
      begin
        temp := ListView1.Items.Add;
        temp.Caption := ADOQuery4.Fields[0].AsString ;
        For i := 1 to 7 do
        begin
           temp.SubItems.Add(ADOQuery4.Fields[i].AsString);
           //temp.Data:= Pointer(Random($10000000)); //000000-FFFFFF//颜色赋值
           //temp.Data:= Pointer(clRed);//没有这两句也改变颜色
        end;
        ADOQuery4.Next;
      end;
      ADOQuery4.First;
    end;procedure TF_YSGL_DU.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
        if Now-StrToDate(Item.SubItems.Strings[1])>3 then
        begin
          Sender.Canvas.Brush.Color := clRed;
          Sender.Canvas.Font.Color := clYellow;
        end;
        {Sender.Canvas.Brush.Color := TColor(Item) xor $FFFFFF;
        Sender.Canvas.Font.Color := TColor(Item); }
    end;
      

  8.   

    我在另外一个地方的用法类似;却可以根据条件改变颜色。
    procedure TF_YSDCX.SpeedButton4Click(Sender: TObject);
    begin
      Load_js(DateToStr(DateTimePicker4.DateTime),ComboBox1.Text);
    end;procedure TF_YSDCX.Load_js(dusj:String; djzt:String);
    var
      i: Integer;
      s_lsh:String;
      temp: TListItem;
    begin
      s_lsh:='select a.lsh,a.kdsj,a.ddsj,a.ysmdd,';
      s_lsh:=s_lsh+'(select xm  from a_ry where lsh=a.sqrlsh) sqrlsh,';
      s_lsh:=s_lsh+'DECODE(DJZT,0,''未开单'',1,''未指派'',2,''在途'',3,''已结算'') djzt';
      s_lsh:=s_lsh+' from a_ysd a where to_char(a.dusj,''yyyy-MM-dd'') ='''+dusj+''' ';
      if djzt = '未结算' then
        s_lsh:=s_lsh+ ' and a.djzt=''2'' '  
      else if djzt = '已结算' then
        s_lsh:=s_lsh+ ' and a.djzt=''3'' ';
      with ADOQ_js do
      begin
        close;sql.Clear;
        sql.Add(s_lsh);
        open;
      end;
      ListView2.Items.Clear;
      while not ADOQ_js.Eof do
      begin
        temp := ListView2.Items.Add;
        temp.Caption := ADOQ_js.Fields[0].AsString ;
        For i := 1 to 5 do
        begin
           temp.SubItems.Add(ADOQ_js.Fields[i].AsString);
        end;
        if now-ADOQ_js.FieldByName('kdsj').AsDateTime>3 then
        ListView2.Canvas.Brush.Color:=clBlue;
        ADOQ_js.Next;
      end;
    end;procedure TF_YSDCX.ListView2CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      if Odd(Item.Index) then
      begin
        Sender.Canvas.Brush.Color := clSkyBlue;
        Sender.Canvas.Font.Color := clGray;
      end;
      if Now-StrToDate(Item.SubItems.Strings[1])>3 then
      begin
        Sender.Canvas.Brush.Color := clRed;
        Sender.Canvas.Font.Color := clYellow;
      end;
    end;
      

  9.   

    if Now - StrToDate(Item.SubItems.Strings[1]) > 3 then你需要确定这样条件是否成立过
    可以将Item.SubItems.Strings[1]输出来看看是不是你预想的结果
      

  10.   

    当然是可以的。我贴的第二段代码是另外一个窗体中的代码,两个ListView的结构是一样的。就是一个在FormShow的时候加载,另一个在一个查询按钮中加载。
      

  11.   

    是不是在FormShow的时候加载不能触发CustomDrawItem?
      

  12.   

    而且重新加载ListView也不行。
      

  13.   

    这个问题和在什么地方加载没有关系
    既然你有一个窗体已经成功,你就找找它们的区别
    这类问题就只有自己调试了,别人也没有你的数据环境可以调试procedure TF_YSGL_DU.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      if Odd(Item.Index) then // 如果变色表示已经触发
      begin
        Sender.Canvas.Brush.Color := clSkyBlue;
        Sender.Canvas.Font.Color := clGray;
      end;    if Now-StrToDate(Item.SubItems.Strings[1])>3 then // 关键是这个条件是否成立
        begin
          Sender.Canvas.Brush.Color := clRed;
          Sender.Canvas.Font.Color := clYellow;
        end;
        {Sender.Canvas.Brush.Color := TColor(Item) xor $FFFFFF;
        Sender.Canvas.Font.Color := TColor(Item); }
    end;
      

  14.   

    我找到原因了,居然在ListView中Item.SubItems.Strings[1]指的不是第二列,而是第三列。