Change DBGRID row color on field value in delphi

后端 未结 1 1660
梦谈多话
梦谈多话 2021-01-19 06:00

How to change color of dbgrid rows that have the same value on a field in delphi?

for example all rows that have the same teacher

note: those rows are groupe

相关标签:
1条回答
  • 2021-01-19 06:21

    You can easily implement this using the DBGrids onDrawColumnCell Event :

    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
     if Table1.FieldByName('Teacher').AsString = 'Joe'
     then
      DBGrid1.Canvas.Brush.Color:=clRed;
     DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);  
    
    end;
    

    However, if you do not know the name of the Teachers then you will have to implement some sort of recursive action, this is my implementation :

    var TeacherStringList : TStringList;
        lastColorUsed : TColor;
        AColors : Array of TColor;
    
    
    function mycolor: TColor;
    begin
      result := RGB(Random(256), Random(256), Random(256));
    end;
    
    procedure TForm3.Button1Click(Sender: TObject);
    var CurrS : String;
        Index : Integer;
    begin
    
      if TeacherStringList.Count <> 0 then TeacherStringList.Clear;
      Table1.DisableControls;
      try
        while not Table1.Eof do
        begin
    
          CurrS := Table1.FieldByName('Teacher').AsString;
          if (not TeacherStringList.Find(CurrS,Index)) and (not currS.IsEmpty)
          then  TeacherStringList.Add(CurrS);
          Table1.Next;
    
        end;
        Table1.First;
        SetLength(AColors,TeacherStringList.Count);
        for Index := Low(AColors) to High(AColors)
        do AColors[Index] := mycolor;
    
      finally
        Table1.EnableControls;
      end;
    
    end;
    
    procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var Index : integer;
    
    begin
    
      if (TeacherStringList.Find(Table1.FieldByName('Teacher').AsString,Index))
      then 
        DBGrid1.Canvas.Brush.Color:= AColors[index];
    
      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    
    end;
    
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      teacherStringList := TStringList.Create;
      teacherStringList.Sorted := True;
    end;
    
    procedure TForm3.FormDestroy(Sender: TObject);
    begin
      teacherStringList.Free;
    end;
    
    0 讨论(0)
提交回复
热议问题