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 Teacher, you will have to implement some kind 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;
Peter source share