我的数据库与dbgrid关联, 我想根据条件来对表中的某个单元格上色
 可以是整行上色
 可以一行中某个单元格的上色
如果有源程序给我看看,感激涕零

解决方案 »

  1.   

    dbgrid的颜色    
        
    如何使DBGRID网格的颜色随此格中的数据值的变化而变化。如<60的网格为红色?Delphi中数据控制构件DBGrid是用来反映数据表的最重要、也是最常用的构件。在应用程序中,如果以彩色的方式来显示DBGrid,将会增加其可视性,尤其在显示一些重要的或者是需要警示的数据时,可以改变这些数据所在的行或列的前景和背景的颜色。  DBGrid属性DefaultDrawing是用来控制Cell(网格)的绘制。若DefaultDrawing的缺省设置为True,意思是Delphi使用DBGrid的缺省绘制方法来制作网格和其中所包含的数据,数据是按与特定列相连接的Tfield构件的DisplayFormat或EditFormat特性来绘制的;若将DBGrid的DefaultDrawing特性设置成False,Delphi就不绘制网格或其内容,必须自行在TDBGrid的OnDrawDataCell事件中提供自己的绘制例程(自画功能)。  在这里将用到DBGrid的一个重要属性:画布Canvas,很多构件都有这一属性。Canvas代表了当前被显示DBGrid的表面,你如果把另行定义的显示内容和风格指定给DBGrid对象的Canvas,DBGrid对象会把Canvas属性值在屏幕上显示出来。具体应用时,涉及到Canvas的Brush属性和FillRect方法及TextOut方法。Brush属性规定了DBGrid.Canvas显示的图像、颜色、风格以及访问Windows GDI 对象句柄,FillRect方法使用当前Brush属性填充矩形区域,方法TextOut输出Canvas的文本内容。  以下用一个例子来详细地说明如何显示彩色的DBGrid。在例子中首先要有一个DBGrid构件,其次有一个用来产生彩色筛选条件的SpinEdit构件,另外还有ColorGrid构件供自由选择数据单元的前景和背景的颜色。  1.建立名为ColorDBGrid的Project,在其窗体Form1中依次放入所需构件,并设置属性为相应值,具体如下所列:   Table1 DatabaseName: DBDEMOSTableName: EMPLOYEE.DBActive: True;  DataSource1 DataSet: Table1  DBGrid1 DataSource1: DataSource1DefaultDrawing: False  SpinEdit1 Increment:200Value: 20000  ColorGrid1 GridOrdering: go16*1  2.为DBGrid1构件OnDrawDataCell事件编写响应程序:  procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;Field: TField; State: TGridDrawState);  begin   if Table1.Fieldbyname(′Salary′).value<=SpinEdit1.value then   DBGrid1.Canvas.Brush.Color:=ColorGrid1.ForeGroundColor   else   DBGrid1.Canvas.Brush.Color:=ColorGrid1.BackGroundColor;   DBGrid1.Canvas.FillRect(Rect);   DBGrid1.Canvas.TextOut(Rect.left+2,Rect.top+2,Field.AsString);  end;  这个过程的作用是当SpinEdit1给定的条件得以满足时,如′salary′变量低于或等于SpinEdit1.Value时,DBGrid1记录以ColorGrid1的前景颜色来显示,否则以ColorGrid1的背景颜色来显示。然后调用DBGrid的Canvas的填充过程FillRect和文本输出过程重新绘制DBGrid的画面。  3.为SpinEdit1构件的OnChange事件编写响应代码:  procedure TForm1.SpinEdit1Change(Sender: TObject);  begin   DBGrid1.refresh;  end;  当SpinEdit1构件的值有所改变时,重新刷新DBGrid1。  4.为ColorGrid1的OnChange事件编写响应代码:  procedure TForm1.ColorGrid1Change(Sender: TObject);  begin   DBGrid1.refresh; end;  当ColorGrid1的值有所改变时,即鼠标的右键或左键单击ColorGrid1重新刷新DBGrid1。  5.为Form1窗体(主窗体)的OnCreate事件编写响应代码:  procedure TForm1.FormCreate(Sender: TObject);  begin   ColorGrid1.ForeGroundIndex:=9;   ColorGrid1.BackGroundIndex:=15;  end;  在主窗创建时,将ColorGrid1的初值设定前景为灰色,背景为白色,也即DBGrid的字体颜色为灰色,背景颜色为白色。  6.现在,可以对ColorDBGrid程序进行编译和运行了。当用鼠标的左键或右键单击ColorGrid1时,DBGrid的字体和背景颜色将随之变化。  在本文中,只是简单展示了以彩色方式显示DBGrid的原理,当然,还可以增加程序的复杂性,使其实用化。同样道理,也可以将这个方法扩展到其他拥有Canvas属性的构件中,让应用程序的用户界面更加友好。
     
       
      

  2.   

    procedure TfrmEhlib.dgStoreDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      if Odd(aqStore.RecNo + 1) then  {隔行显示,aqStore为DBGrid.DataSource.DataSet}
      begin
        dgStore.Canvas.Brush.Color := clCream;
        dgStore.Canvas.Font.Color := clNavy;
      end;
      if aqStore.FieldByName('scount').asinteger > 80 then  {满足条件显示}
        dgStore.Canvas.brush.Color := clLime;  dgStore.DefaultDrawColumnCell(Rect, DataCol, Column, State);  {生效}
    end;
      

  3.   

    给单元格上色:
    ...
      if Column.FieldName = 'onshow' then
        if Column.Field.AsBoolean = true then
          dgStore.Canvas.brush.Color := $00FFBB95;
    ...
      

  4.   

    将grid的ownerdraw属性设为true;
    编写grid的DrawColumnCell事件,根据自己的条件进行着色.
    grid的CANVAS的BRUSH.COLOR是背景色,FONT.COLOR是字色,
    最后调用DefaultDrawColumnCell.
    不难的.
      

  5.   

    呵呵
    就用  miky(miky) 和 weizi2000(秋风啊) 说的方式了
    再根据自己的要求灵活改动下就可以了。
      

  6.   

    1. 纵向斑马线效果:实现网格的奇数列和偶数列分别以不同的颜色显示,以区别相邻的数据列。  file://在DbGrid的DrawColumnCell事件中编写如下代码:  Case DataCol Mod 2 = 0 of   True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色   False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色  End;  DbGrid1.Canvas.Pen.Mode:=pmMask;  DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
    2. 纵向斑马线,同时以红色突出显示当前单元格效果:以突出显示当前选中的字段。  file://将上述代码修改为:  Case DataCol Mod 2 = 0 of   True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色   False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色  End;  If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then    If Not DbGrid1.SelectedRows.CurrentRowSelected then      DbGrid1.Canvas.Brush.Color:=clRed; file://当前选中单元格显示红色      DbGrid1.Canvas.Pen.Mode:=pmMask;      DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);上述两种方法突出了列的显示效果。  3.在数据网格中以红色突出显示当前选中的行。  设置DbGrid控件的Options属性中的dgRowSelect属性为真,Color属性为clAqua(背景色), 在DbGrid的DrawColumnCell事件中编写如下代码:  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then   DbGrid1.Canvas.Brush.color:=clRed; file://当前行以红色显示,其它行使用背景的浅绿色   DbGrid1.Canvas.pen.mode:=pmmask;   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);  4.行突显的斑马线效果:既突出当前行,又区分不同的列(字段)。  file://其它属性设置同3,将上述代码修改为:  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then   begin    Case DataCol Mod 2 = 0 of     True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列显示红色     False: DbGrid1.Canvas.Brush.color:=clblue; file://当前选中行的奇数列显示蓝色    end;   DbGrid1.Canvas.pen.mode:=pmmask;   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);  end;
    5.横向斑马线, 同时以红色突显当前行效果。  file://其它属性设置同3,将上述代码修改为:  Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断   True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示   False: DbGrid1.Canvas.Brush.color:=clblue; file://奇数行用蓝色表示  end;  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then file://选中行用红色显示   DbGrid1.Canvas.Brush.color:=clRed;   DbGrid1.Canvas.pen.mode:=pmMask;   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);  6.双向斑马线效果:即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。  file://其它属性设置同3,将上述代码修改为:  Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断   True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示   False: DbGrid1.Canvas.Brush.color:= clblue; file://奇数行用蓝色表示  end;  If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then  Case DataCol mod 2 = 0 of   True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列用红色   False: DbGrid1.Canvas.Brush.color:= clGreen; file://当前选中行的奇数列用绿色表示  end;  DbGrid1.Canvas.pen.mode:=pmMask;  DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);
      

  7.   

    要是有这样的函数多好:
    dbgrid.cell[1,2].color=red

    dbgrid.colmuns[i].row[k].color=red谁有这样的函数拿出来看看,我也给100分啊
      

  8.   

    要是有这样的函数多好:
    dbgrid.cell[1,2].color=red

    dbgrid.colmuns[i].row[k].color=red谁有这样的函数拿出来看看,我也给100分啊=======================================================
    我这里有对行进颜色设置的代码虽不是函数,但代码不长,你自己还可以把它写成函数,
      

  9.   

    楼主,你有福了,这是我做项目的这段代码。你完全用得着!!!
    procedure TBrowseForm.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
     with dbgrid1 do
          begin
            if ((state=[gdselected])  or (state=[gdselected,gdfocused])) then
                begin
                canvas.Font.Color:=clyellow;
                canvas.Brush.Color:=clnavy;
                end
             else
             begin
               if datasource1.DataSet.RecNo mod 2<>0 then
                  canvas.Brush.Color:=clwhite
       else
                  canvas.Brush.Color:=$00eaeaea;
             end;
     defaultdrawcolumncell(rect,datacol,column,state);         
          end;
    end;你只要改改FORM的名称和DBgrid的名称和你的相对应就可以了!!!!!!!!
    为了你无悔做一切!!!
      

  10.   

    唉,请大家来关心一下我的问题好吗?楼主别拿转头丢我,我也是无赖啊。怎么使图片缩小到和image1一样大小比例不变。
    http://expert.csdn.net/Expert/topic/3062/3062400.xml?temp=.4825861