怎样在DBGrid里给某一列(如第三列,仅一列)的第二行到第六行网格绘上绿色背景,因为我想一步操作实现复制\粘贴多个网格的数据,数据库为Access 2000数据库(Delphi7),我对此已花很多时间和精力,敬请热心的高人指点,万分感谢!  

解决方案 »

  1.   

    你的要求好多啊 我只要变颜色就很容易实现了 给你参考下吧
    利用DBGrid自绘功能可以很容易地实现这样的要求。用户可以处理DBGrid的OnDrawColumnCell事件,在其中实现特殊的效果。要判 断记录是否满足要求,可以使用DBGrid的DataLink属性获得数据,但DBGrid的DataLink属性属于保护成员,必须在 TCustomDBGrid的子类中调用。 type 
    TMyCustomDBGrid = class(TCustomDBGrid); procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
    var
    sCjts,sQjTs:String;
    begin
    with TMyCustomerDBGrid(Sender) do
    begin
    Cjts:=DataLink.Fields[5].AsString;
    sQjts:=DataLink.Fields[9].AsString;
    if sCjts<>‘‘ then       //春季退书数量>0的用红色显示
    Canvas.Brush.Color := clRed
    else
    if sQjts<>‘‘ then      //秋季退书数量>0的用黄色显示
    Canvas.Brush.Color := clYellow
    else
    Canvas.Brush.Color:=clWhite;
    Canvas.Font.Color:=clBlack; 
    canvas.fillrect(rect);
    canvas.textout(rect.left+4,rect.top+4,Column.Field.AsString);
    end;
    end;  由此方法可以延伸出其它控件的多种修饰方法,比如可以按数据项值采用不同的颜色,可以按记录号显示不同的颜色。总之,灵活应用canvas、rect及bitmap等对象,可以将各种网格装饰得绚丽多彩。 
    在 Delphi 语言的数据库编程中,DBGrid 是显示数据的主要手段之一。但是 DBGrid 缺省的外观未免显得单调和缺乏创意。其实,我们完全可以在我们的程序中通过编程来达到美化DBGrid 外观的目的。通过编程,我们可以改变 DBGrid 的表头、网格、网格线的前景色和背景色,以及相关的字体的大小和风格。
    以下的示例程序演示了对 DBGrid 各属性的设置,使 Delphi 显示的表格就像网页中的表格一样漂亮美观。
    示例程序的运行:
    在 Form1 上放置 DBGrid1、Query1、DataSource1 三个数据库组件,设置相关的属性,使 DBGrid1 能显示表中的数据。然后,在 DBGrid1 的 onDrawColumnCell 事件中键入以下代码,然后运行程序,就可以看到神奇的结果了。本代码在 Windows98、Delphi5.0 环境下调试通过。
    procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;
    const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
    var i :integer;
    begin
    if gdSelected in State then Exit;
    //定义表头的字体和背景颜色:
    for i :=0 to (Sender as TDBGrid).Columns.Count-
    1 do
    begin
    (Sender as TDBGrid).Columns[i].Title.Font.Name :='宋体'; //字体
    (Sender as TDBGrid).Columns[i].Title.Font.Size :=9; //字体大小
    (Sender as TDBGrid).Columns[i].Title.Font.Color :=$000000ff; //字体颜色(红色)
    (Sender as TDBGrid).Columns[i].Title.Color :=$0000ff00; //背景色(绿色)
    end;
    //隔行改变网格背景色:
    if Query1.RecNo mod 2 = 0 then
    (Sender as TDBGrid).Canvas.Brush.Color := clInfoBk //定义背景颜色
    else
    (Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223); //定义背景颜色
    //定义网格线的颜色:
    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
    with (Sender as TDBGrid).Canvas do //画 cell 的边框
    begin
    Pen.Color := $00ff0000; //定义画笔颜色(蓝色)
    MoveTo(Rect.Left, Rect.Bottom); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画蓝色的横线
    Pen.Color := $0000ff00; //定义画笔颜色(绿色)
    MoveTo(Rect.Right, Rect.Top); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画绿色的竖线
    end;
    end; 
      

  2.   

    非常感谢指导!那"复制\粘贴多个网格的数据",还请大家帮忙.复制单个网格数据我是这样实现的:
    type
       Tmydbgrid = class(TDBGrid)
      private
      public
    end;
    procedure TmainForm.ToolButton_cutClick(Sender: TObject);
    begin
      if (dbgrid1.ReadOnly = false)  and (ActiveControl is TDBGrid)
      then  begin
              Tmydbgrid(DBGrid1).InplaceEditor.CutToClipboard;
            end;
      ToolButton_paste.Enabled := true;      
    end;procedure TmainForm.ToolButton_copyClick(Sender: TObject);
    begin
      if  (dbgrid1.ReadOnly = false)  and (ActiveControl is TDBGrid)
      then  begin
              Tmydbgrid(DBGrid1).InplaceEditor.CopyToClipboard;
            end;
      ToolButton_paste.Enabled := true;
    end;procedure TmainForm.ToolButton_pasteClick(Sender: TObject);
    begin
      if (dbgrid1.ReadOnly = false)  and (ActiveControl is TDBGrid)
      then  begin
              try
                Tmydbgrid(DBGrid1).InplaceEditor.PasteFromClipboard;
              except
              end;  
            end;end;procedure TmainForm.ToolButton_cancelClick(Sender: TObject);
    begin
      adoquery1.Edit;   
      try
        adoquery1.Cancel;
      except
      end;  
    end;