Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

TDBGrid компонент c разными цветами: удаленные, обновленные и добавленные записи

01.01.2007
unit atcDBGrid; 
{ 
  (c) Aveen Tech 
  2001 - 2002 
 
  FileName: atcDBGrid.pas 
 
  Version        Date            Author              Comment 
  1.0            13/06/2000      Majid Vafai Jahan  Create. 
 
OVERVIEW 
  - This grid is inherited from DBGrid and add some required functionality to it. 
 
Functionality: 
  - Record type are all records that may be modified, unmodified, inserted, deleted. 
  - Coloring according to Record type. 
  - show selected Record Type. 
 
} 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Grids, DBGrids, dbTables, db; 
const 
  AlignFlags : array [TAlignment] of Integer = 
    ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, 
      DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX, 
      DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX ); 
  RTL: array [Boolean] of Integer = (0, DT_RTLREADING); 
type 
  TCachedShow = (csModify, csUnModify, csRemoved, csInserted, csAll, csNormal); 
  TatcDBGrid = class(TDBGrid) 
  private 
    FCachedShow: TCachedShow; 
    FModifiedColor: TColor; 
    FInsertedColor: TColor; 
    FDeletedColor: TColor; 
    procedure SetCachedShow(const Value: TCachedShow); 
  protected 
    procedure DrawDataCell(const Rect: TRect; Field: TField; 
      State: TGridDrawState); override; 
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; 
      Column: TColumn; State: TGridDrawState); override; 
  public 
    constructor Create(AOwner: TComponent); override; 
  published 
    property atcCachedShow: TCachedShow read FCachedShow write SetCachedShow; 
    property atcDeletedColor: TColor read FDeletedColor write FDeletedColor; 
    property atcInsertedColor: TColor read FInsertedColor write FInsertedColor; 
    property atcModifiedColor: TColor read FModifiedColor write FModifiedColor; 
  end; 
 
procedure Register; 
 
implementation 
 
procedure Register; 
begin 
  RegisterComponents('ATC DB Compo', [TatcDBGrid]); 
end; 
 
constructor TatcDBGrid.Create(AOwner: TComponent); 
{Description: Record Type Showing is All except Deletes. }
begin 
  inherited; 
  FCachedShow := csNormal; 
  FDeletedColor := clGray; 
  FInsertedColor := clAqua; 
  FModifiedColor := clRed; 
end; 
 
procedure TatcDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; 
  Column: TColumn; State: TGridDrawState); 
{Description: On Drawing Column Color Updated Records.}
var 
  ARect: TRect; 
begin 
  inherited; 
  if not Assigned(Column.Field) then 
    exit; 
  // Copy Rect into Variable. 
  CopyRect(ARect, Rect); 
  if Assigned(DataLink) and (DataLink.Active) and (DataLink.DataSet <> nil) then 
  begin 
    // если текущая запись изменена
    if DataLink.DataSet.UpdateStatus = usModified then 
    begin 
      Canvas.Brush.Color := atcModifiedColor; 
      Canvas.Font.Color := clBlack; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect, 
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]); 
    end 
    // если текущая запись добавлена.
    else if DataLink.DataSet.UpdateStatus = usInserted then 
    begin 
      Canvas.Brush.Color := atcInsertedColor; 
      Canvas.Font.Color := clBlack; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect, 
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]); 
    end 
    // если текущая запись удалена.
    else if DataLink.DataSet.UpdateStatus = usDeleted then 
    begin 
      Canvas.Brush.Color := atcDeletedColor; 
      Canvas.Font.Color := clWhite; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Column.Field.Text), Length(Column.Field.Text), ARect, 
       AlignFlags[Column.Alignment] or RTL[UseRightToLeftAlignmentForField(Column.Field, Column.Alignment)]); 
    end; 
  end; 
end; 
 
procedure TatcDBGrid.DrawDataCell(const Rect: TRect; Field: TField; 
  State: TGridDrawState); 
{Описание: Рисуем ячейки}
var 
  ARect: TRect; 
begin 
  inherited; 
  CopyRect(ARect, Rect); 
 
  if Assigned(DataLink) and (DataLink.Active) and (DataLink.DataSet <> nil) then 
  begin 
    // если текущая запись изменена
    if DataLink.DataSet.UpdateStatus = usModified then 
    begin 
      Canvas.Brush.Color := clRed; 
      Canvas.Font.Color := clBlack; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect, 
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]); 
    end 
    // если текущая запись добавлена.
    else if DataLink.DataSet.UpdateStatus = usInserted then 
    begin 
      Canvas.Brush.Color := clAqua; 
      Canvas.Font.Color := clBlack; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect, 
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]); 
    end 
    // если текущая запись удалена.
    else if DataLink.DataSet.UpdateStatus = usDeleted then 
    begin 
      Canvas.Brush.Color := clGray; 
      Canvas.Font.Color := clWhite; 
      Canvas.FillRect(Rect); 
      DrawText(Canvas.Handle, PChar(Field.Text), Length(Field.Text), ARect, 
       AlignFlags[Field.Alignment] or RTL[UseRightToLeftAlignmentForField(Field, Field.Alignment)]); 
    end; 
  end; 
end; 
 
procedure TatcDBGrid.SetCachedShow(const Value: TCachedShow); 
{Description: Record type for showing in grid. 
 Parameters: Value cached record show. }
begin 
  FCachedShow := Value; 
  if ComponentState = [csDesigning] then 
    exit; 
  if not Assigned(DataSource) or not Assigned(DataSource.DataSet) then 
    exit; 
  // для показа только выбранного типа записей.
  if Assigned(DataLink) and Assigned(DataLink.DataSet) and (DataLink.Active) then 
  begin 
    case FCachedShow of 
    csAll: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified, rtInserted, rtDeleted, rtUnmodified]; 
    csModify: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified]; 
    csUnModify: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtUnmodified]; 
    csInserted: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtInserted]; 
    csRemoved: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtDeleted]; 
    csNormal: 
      TBDEDataSet(DataSource.DataSet).UpdateRecordTypes := [rtModified, rtInserted, rtUnmodified]; 
    end; 
  end; 
end; 
 
end.

Взято из https://forum.sources.ru