如何在输入状态下,动态改变单元格中部分满足条件字符的颜色?马上结贴

解决方案 »

  1.   

    procedure TForm1.DBGrid1DrawDataCell(Sender:TObject;const Rect: TRect;Field:TField;State :TGridDrawState);
    begin
      if Table1.FieldByName('Test').asInteger>0 then
        DBGrid1.Canvas.Brush.Color := clRed //红色;
      else
        DBGrid1.Canvas.Brush.Color := clWindowsText;
       DBGrid1.Canvas.FillRect(Rect);
       DBGrid1.Canvas.TextOut(Rect,Left+2,Rect.Top+2,Field.AsString);
    end;
      

  2.   

    感谢,但是问题没有解决啊,我指的是在输入状态,这时候不会触发DBGrid1DrawDataCell事件啊,请大家帮忙啊.
      

  3.   

    应该是可以的,就是有些麻烦吧。而且还要有个判断国家名字的函数。这需要一个国家表,否则无法判断,相信你应该有吧。
    而且不按回车的话,每输入一个字母都要对整个单词进行一次检测呀,假设你有一个国家表的话,每次key
    都要query一次数据库了。
    最关键就是canvas颜色问题,你自己在检查到是国家名字的时候,主动呼叫DBGrid1DrawDataCell事件看看。
    如果是我的话就这样做了。下班回家。
      

  4.   

    可以试一下在DataSource中的OnDataChange中事件,在事件中判断,根据输入内容再重画。
      

  5.   

    我是这样做的
    procedure TForm1.DBGridEh1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    var
        lRect:TRect;
        ls_Char:String[1];
        ls_Country:String;
        li_Width:integer;
    begin    ls_Char := Copy(Value,length(Value),1);
        lRect := (Sender As TDbGridEh).Columns.Grid.CellRect(ACol,ARow);    if  ls_Char=' ' then
        begin
             //如果两个空格间是一个国家
            ls_Country := GetCountryWord(trim(Value));
            if   ls_Country <>'' then
            begin            li_Width := Canvas.TextWidth(Value) - Canvas.TextWidth(ls_Country);            lRect.Left :=  lRect.Left+li_Width;            (Sender As TDbGridEh).Canvas.Font.Color:=Clred;
                (Sender As TDbGridEh).Canvas.fillrect(lRect);            (Sender As TDbGridEh).Canvas.textout(lRect.left,lRect.top+2,ls_Country );
            end;
        end;
    end;
    基本实现了功能,但是在录入下一个单词时,前一个国家单词的颜色又变成黑色了,怎么办啊???有其他方法吗?
      

  6.   

    先定位,再著色procedurDrawLine(tab:Ttable;const Rect:Trect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
    begin
    if (tab.fieldbyname(zdm).asstring=zdz)then
    begin
    dbg.canvas.font.color:=clred;
    dbg.canvas.brush.color:=clyellow;
    end;
    dbg.DefaultDrawDataCell(Rect,Field,State);
    end;
      

  7.   

    kye_jufei,我只是改变部分字符的颜色,你这样把整个字段的颜色都变了啊。
      

  8.   

    某个单元格中部分字符颜色改变,如单元格中是"ABCDEFGHI",希望"CDEF"是一种色,而其它的是另外一种色.这要修改dbgrid才能实现.楼上的方法都没有达到楼主的要求.
      

  9.   

     YFLK的理解完全正确,有没有好办法啊?或者用其他控件也行