我用DBGridEh显示数据库中的内容,并且实现自画Cell,显示效果类似于此论坛,问题是当我选中其中的一条记录时,不能高亮度显示(如显示为一般的列表框的选中状态),而只是单单把字体的颜色反转了一下.这样我的背景接近于白色,字体也变为了白色,导致看都看不清选中的东西.是不是我必须对选择的东西也要自画,怎么对选择的自画,帮帮忙!

解决方案 »

  1.   

    可以根据state的不同选择不同的颜色
      

  2.   

    这是我自画dbgrideh的函数,其中有些地方是根据我的实际需要设的,你可以改改看procedure TfrmCopyBook_MeterCopy.SetGridColor(var AdoTable: TDataSet; var DbGrid1: TDBGrideh; const Rect: TRect; DataCol: Integer;
      Column: TColumneh; State: TGridDrawState);
    begin
      if (AdoTable.RecNo <> AdoTable.RecordCount + 1) and
        (((DataCol >= 7) and (DataCol <= 12)) or (DataCol = 20) or (DataCol = 22)) then      DbGrid1.Canvas.Brush.color := $00EBE9A7; // file://偶数行用浅绿色显示
        
      if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
        case DataCol of
          7, 8, 9, 10, 11, 12,20,22:
            begin
              DbGrid1.Canvas.Brush.color := $00FFFF; //file://当前选中行用红色
              dbgrid1.Canvas.Font.Color := clred;
            end;
          {False:
            begin
              DbGrid1.Canvas.Brush.color := $00FFFF;
              dbgrid1.Canvas.Font.Color := clred;
            end;}
        end;
      DbGrid1.Canvas.pen.mode := pmCopy;
      DbGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
      

  3.   

    忘了说了,该过程在DBGridEh的DrawColumnCell事件中调用就可以了
      

  4.   

    或许对楼主有帮助!
    procedure TDbgridForm.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 :=clgreen;       
        end;
        DefaultDrawColumnCell(Rect, DataCol, Column, State); 
      end;
    end;