用一个botton来改变DBGrid的背景颜色dbgrid1.Canvas.Brush.color:=clyellow;鼠标选中DBGrid任意一个项,然后点击 一个 按键  把刚才选中的那个背景色变成黄色。要求:  如果选中的项不是同一个项 那么不改变之前的颜色。如   1 liu    23  address1
       2 zhang  21  address2
       3 wang   20  address2 鼠标选中 'liu' 后 点一个按键 把'liu'的背景色变成 黄色 
   选中 '23' 后 再点这个按键 把'23'的背景色也变成黄色,注意之前的 'liu'的黄色 还是依旧存在。这个 怎么实现 请各个大虾指定一下 

解决方案 »

  1.   

    1,定义一个全局数组(changed[]),记录需要变的行的特征,
    2,在dbgrid中的ondrawcolumn..事件中编程实现
      

  2.   

    Dbgrid.Canvas.Brush.Color := clyellow;
    Dbgrid.DefaultDrawColumnCell( Rect, DataCol, Column, [gdFixed,gdFocused,gdSelected] );
      

  3.   

    记下点击时的书签和字段,在DBGrid自画里画出来就可以了,代码:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, FileDB, Grids, DBGrids, StdCtrls, ADODB, ComCtrls, DBClient,
      Provider;type
      //着色的单元格位置
      PCellData = ^TCellData;
      TCellData = record
        Book: string; //单元格对应的书签
        Field: string; //单元格的列对应字段
      end;  TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        FileDataBase1: TFileDataBase;
        ADOQuery1: TFileTable;
        btnTogColor: TButton;
        DataSetProvider1: TDataSetProvider;
        ClientDataSet1: TClientDataSet;
        DBGrid2: TDBGrid;
        DataSource2: TDataSource;
        btnClearColor: TButton;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure btnClearColorClick(Sender: TObject);
        procedure btnTogColorClick(Sender: TObject);
      private
        { Private declarations }
        FCellList: TList; //用来记录着色过的单元格
        procedure ClearCellData;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FCellList := TList.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ClearCellData; //清理内存
      FreeAndNil(FCellList);
    end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);  function NeedColored: Boolean;
      var
        i: Integer;
        Book, Field: string;
        dtCell: PCellData;
      begin
        Book := Column.Field.DataSet.Book;
        Field := Column.FieldName;    //取出当前的书签和字段名在FCellList中查找,看是否存在,存在就要改变背景
        for i := 0 to FCellList.Count - 1 do
        begin
          dtCell := FCellList[i];
          if (dtCell.Book = Book) and SameText(dtCell.Field, Field) then
          begin
            Result := True;
            Exit;
          end;
        end;
        Result := False;
      end;var
      ACanvas: TCanvas;
    begin
      ACanvas := DBGrid1.Canvas;
      if NeedColored then
        ACanvas.Brush.Color := clRed;
      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;procedure TForm1.ClearCellData;
    var
      i: Integer;
    begin
      //清空内存
      for i := 0 to FCellList.Count - 1 do
        Dispose(FCellList[i]);
      FCellList.Clear;
    end;procedure TForm1.btnClearColorClick(Sender: TObject);
    begin
      //清除所有背景
      ClearCellData;
      DBGrid1.Invalidate;
    end;procedure TForm1.btnTogColorClick(Sender: TObject);
    var
      dtCell: PCellData;
    begin
      //标记当前的单元格颜色
      if DBGrid1.DataSource.DataSet.Active and
        not DBGrid1.DataSource.DataSet.IsEmpty then
      begin
        New(dtCell);
        dtCell^.Book := DBGrid1.DataSource.DataSet.Book;
        dtCell^.Field := DBGrid1.SelectedField.FieldName;
        FCellList.Add(dtCell);
        DBGrid1.Invalidate;
      end;
    end;end.
      

  4.   

    我的思路是 在 DbGrid  onclick时得到 选中的行和列值
     hang:=DBGrid1.DataSource.DataSet.RecNo;
     lie:=Column.Index;然后在点击按键时  把定位的这个地方的底色变了
           if Column.Index = lie then
           if RecNo =hang then
              DBGrid1.Canvas.Brush.Color := clGreen;
    ,但是不能改变已经弄好的单元颜色、
      就是'liu'变红后  在点‘23’时  ‘liu’的 底色就给冲突了我做的 问题是 如果在同一行  老冲突。 一行只能变一个单元的颜色
      

  5.   


    列要用个数组来记录,每选中一个都记录到数组中,这样就能保存所有选过的列。Lies:array[0..MaxLieCnt] of integer;
    if Column.Index=lie then------------>也要改成,循环判断Column.Index是不是在Lies[]中。