我的意思是:删除的和修改的记录都显示在dbgrid中,颜色不一样,大家看一
看啊

解决方案 »

  1.   

    你可以在表中加多一个状态字段用来记录是删除了还是修改的,
    删除的话,只是更新状态字段的值,并不做真正的删除动作。
    然后在打开表的时候根据状态字段来设置Canvas的属性重绘dbgrid.
      

  2.   

    这个问题太简单了,用Delphi3.0的时候就解决了。
    例如:
    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);begin
      if Table1.FieldByName('IsDelete').Asstring = 0 then
        DBGrid1.Canvas.Font.Color := clRed;
      if Table1.FieldByName('IsDelete').Asstring = 1 then
        DBGrid1.Canvas.Font.Color := clBlue;
      DBGrid1.DefaultDrawDataCell(Rect, Field, State);
    end;
      

  3.   

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);begin
      if Table1.state = dsEdit then
        DBGrid1.Canvas.Font.Color := clRed;
      if Table1.state = dsBrowse then
        DBGrid1.Canvas.Font.Color := clBlue;
      DBGrid1.DefaultDrawDataCell(Rect, Field, State);
    end;
      

  4.   

    需要从Dbgrid继承并生成一个新类,下面是一段源代码:
    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 current record is modified 
        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 
        // if current record is inserted. 
        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 
        // if current record is deleted. 
        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); 
    (* 
      Description: Draw Cell 
    *) 
    var 
      ARect: TRect; 
    begin 
      inherited; 
      CopyRect(ARect, Rect);   if Assigned(DataLink) and (DataLink.Active) and (DataLink.DataSet <> nil) then 
      begin 
        // if current record is modified. 
        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 
        // if current record is inserted. 
        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 
        // if current record is deleted. 
        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; 
      // for showing selected record type only. 
      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.