请问:如何在dbgrid中改变记录行的背景色?
还有怎样打印dbgrid中的内容(并支持分页打印)?
  公司要我作一个筛选异常数据的软件,要求在dbgrid中用红色标示出有异常数据的行,想了很久,也做不到,列颜色可以改变查行不可以,dbgrid中好像没这属性?
(急 急 急,在线等,百分送.)

解决方案 »

  1.   

    在Delphi中随意控制DBGrid每一行的颜色  
    1、 数据表的建立 2、程序设置;
    procedure Tinfo.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn;State: TGridDrawState);
    begin
            if query1.FieldByName('all').asstring>40’ then
            begin
                    dbgrid1.Canvas.Font.Color:=clred;
                    dbgrid1.Canvas.Brush.color:=clyellow;
            end
            else
            begin
                    dbgrid1.Canvas.Font.Color:=clblue;
                    dbgrid1.Canvas.Brush.color:=clyellow;
                    end;
     
            dbgrid1.DefaultDrawColumnCell(rect,datacol,column,state);
    end;
      

  2.   

    //==============================================================================
    //打印DBGrid中的所有数据********************************************************
    //==============================================================================
    procedure DBGridPrint(DBGrid: TDBGrid; Title: string);
    var PrintDialog: TPrintDialog;
        RowHeight, Temp_X, Temp_Y, PageEdgeX, PageEdgeY, PixelsPerInchX, PixelsPerInchY: integer;
        TempStr: string;
        Scale: Double;
        Rect: TRect;
    //==============================================================================
    //1.输出标题********************************************************************
    //==============================================================================
        procedure Print_Title;
        begin
          Rect := Bounds(0,0,Printer.PageWidth,PageEdgeY);
          Printer.Canvas.Font.Name := '楷体_GB2312';
          Printer.Canvas.Font.Style := Printer.Canvas.Font.Style + [fsBold];
          Printer.Canvas.Font.Size := 20;
          DrawText(Printer.Canvas.Handle,PChar(Title),Length(Title),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
          Printer.Canvas.Rectangle(PageEdgeX, PageEdgeY, Printer.PageWidth - PageEdgeX, PageEdgeY + 1);
        end;
    //==============================================================================
    //2.输出列头********************************************************************
    //==============================================================================
        procedure Print_Column;
        var j: integer;
        begin
          Printer.Canvas.Font.Name := '黑体';
          Printer.Canvas.Font.Size := 9;
          Temp_X := PageEdgeX;
          Temp_Y := PageEdgeY;
          //========================================================================
          for j:=1 to DBGrid.Columns.Count do
          begin
            if not DBGrid.Columns[j-1].Visible then Continue;
            //======================================================================
            TempStr := DBGrid.Columns[j-1].Title.Caption;
            Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
            case DBGrid.Columns[j-1].Field.Alignment of
              //====================================================================
              //case.1.居中*********************************************************
              //====================================================================
              taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
              //====================================================================
              //case.2.居左*********************************************************
              //====================================================================
              taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
              //====================================================================
              //case.3.居右*********************************************************
              //====================================================================
              taRightJustify: if Rect.Right-Rect.Left>=Printer.Canvas.TextWidth(TempStr)
                              then DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE)
                              else DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
            end;
            Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
          end;
          Temp_Y := Temp_Y + RowHeight;
        end;
      

  3.   

    //==============================================================================
    //3.输出DBGrid内容**************************************************************
    //==============================================================================
        procedure Print_Cells;
        var j: integer;
        begin
          Printer.Canvas.Font.Name := '宋体';
          Printer.Canvas.Font.Style := Printer.Canvas.Font.Style - [fsBold];
          while Temp_Y<Printer.PageHeight-PageEdgeY do
          begin
            Temp_X := PageEdgeX;
            for j:=1 to DBGrid.Columns.Count do
            begin
              if not DBGrid.Columns[j-1].Visible then Continue;
              //====================================================================
              Rect := Bounds(Temp_X, Temp_Y, Trunc(DBGrid.Columns[j-1].Width*Scale), RowHeight);
              if (DBGrid.Columns[j-1].Field is TCurrencyField)
              or (DBGrid.Columns[j-1].Field is TLargeIntField)
              or (DBGrid.Columns[j-1].Field is TSmallIntField)
              or (DBGrid.Columns[j-1].Field is TIntegerField)
              or (DBGrid.Columns[j-1].Field is TFloatField)
              or (DBGrid.Columns[j-1].Field is TWordField)
              then TempStr := FormatFloat(',##0.00',DBGrid.Columns[j-1].Field.AsFloat)
              else TempStr := DBGrid.Columns[j-1].Field.AsString;
              //====================================================================
              case DBGrid.Columns[j-1].Field.Alignment of
                //==================================================================
                //case.1.居中*******************************************************
                //==================================================================
                taCenter: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE);
                //==================================================================
                //case.2.居左*******************************************************
                //==================================================================
                taLeftJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
                //==================================================================
                //case.3.居右*******************************************************
                //==================================================================
                taRightJustify: DrawText(Printer.Canvas.Handle,PChar(TempStr),Length(TempStr),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
              end;
              Temp_X := Temp_X + Trunc(DBGrid.Columns[j-1].Width*Scale);
            end;
            Temp_Y := Temp_Y + RowHeight;
            DBGrid.DataSource.DataSet.Next;
            if DBGrid.DataSource.DataSet.Eof then Exit;
          end;
        end;
    //==============================================================================
    //4.输出页脚********************************************************************
    //==============================================================================
        procedure Print_Footer;
        begin
          Temp_Y := Printer.PageHeight - PageEdgeY + RowHeight;
          //========================================================================
          //4.0.输出横线************************************************************
          //========================================================================
          Printer.Canvas.Rectangle(PageEdgeX, Temp_Y, Printer.PageWidth - PageEdgeX, Temp_Y + 1);
          //========================================================================
          //4.1.输出日期************************************************************
          //========================================================================
          Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX, RowHeight);
          DrawText(Printer.Canvas.Handle,PChar(DateTimeToStr(Now)),Length(DateTimeToStr(Now)),Rect,DT_LEFT or DT_VCENTER or DT_SINGLELINE);
          //========================================================================
          //4.2.输出页号************************************************************
          //========================================================================
          Rect := Bounds(PageEdgeX, Temp_Y, Printer.PageWidth-PageEdgeX*2, RowHeight);
          DrawText(Printer.Canvas.Handle,PChar('#'+IntToStr(Printer.PageNumber)),Length('#'+IntToStr(Printer.PageNumber)),Rect,DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
        end;
    //==============================================================================
    begin
      PrintDialog := TPrintDialog.Create(DBGrid);
      if PrintDialog.Execute then
      begin
        //==========================================================================
        //0.取当前打印机X,Y方向每英寸像素*******************************************
        //==========================================================================
        PixelsPerInchX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
        PixelsPerInchY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
        //==========================================================================
        //1.变量初始化**************************************************************
        //==========================================================================
        PageEdgeX := PixelsPerInchX div 6;
        PageEdgeY := PixelsPerInchY div 5 * 4;
        RowHeight := Trunc(1.5 * 9 * PixelsPerInchY / 72);
        Scale :=  PixelsPerInchX / Screen.PixelsPerInch;
        //==========================================================================
        try
          Printer.BeginDoc;
          DBGrid.DataSource.DataSet.First;
          while not DBGrid.DataSource.DataSet.Eof do
          begin
            Print_Title;
            Print_Column;
            Print_Cells;
            Print_Footer;
            if not DBGrid.DataSource.DataSet.Eof then Printer.NewPage;
          end;
          //========================================================================
          if not Printer.Aborted then Printer.EndDoc;
        except
          on E:EPrinter do
          begin
            MessageBox(Application.Handle,PChar('打印机没有准备好!'),'提示!',MB_OK+MB_ICONINFORMATION);
            Printer.Abort;
            Exit;
          end;
          on E:Exception do
          begin
            raise;
            Exit;
          end;
        end;
      end;
      //============================================================================
      PrintDialog.Free;
    end;