Fórum Problema com DBGrid #381087

10/07/2010

0

Olá,
Estou tendo um problema com DBGrid. Vou explicar:

Para criar um efeito zebra no DBGrid, tenho o código abaixo no evento DrawColumnCell dele.
O problema ocorre quando, em execução, se tenta redimensionar as colunas. O pior é que é o erro é "Access Violation" e não ocorre toda a vez que é feito o redimensionamento. É aleatório. Se tirar a rotina abaixo, o problema não ocorre.


Rotina executada no DrawColumnCell
 if (GdSelected in State) then //se está selecionado
  begin
   DBGrid1.Canvas.Brush.Color := $00778086;
   DBGrid1.Canvas.Font.Style := [fsBold];
   DBGrid1.Canvas.Font.color := ClWhite;
  end
 else //se não está selecionado
  begin
   if not odd(DM.CDSContasBancarias.RecNo) then // se não for ímpar
    DBGrid1.Canvas.Brush.Color := $00E1FFF9
   else
    DBGrid1.Canvas.Brush.Color := $00FFEBDF;
   DBGrid1.Canvas.Font.Color := ClBlack;
  end;
 DBGrid1.Canvas.FillRect(Rect); // pinta a célula
 DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

Alguém faz idéia de como solucionar isso?

Obrigado

Valdir
Valdir Dill

Valdir Dill

Responder

Posts

10/07/2010

Marco Salles

Olá,
Estou tendo um problema com DBGrid. Vou explicar:

Para criar um efeito zebra no DBGrid, tenho o código abaixo no evento DrawColumnCell dele.
O problema ocorre quando, em execução, se tenta redimensionar as colunas. O pior é que é o erro é "Access Violation" e não ocorre toda a vez que é feito o redimensionamento. É aleatório. Se tirar a rotina abaixo, o problema não ocorre.


Rotina executada no DrawColumnCell
 if (GdSelected in State) then //se está selecionado
  begin
   DBGrid1.Canvas.Brush.Color := $00778086;
   DBGrid1.Canvas.Font.Style := [fsBold];
   DBGrid1.Canvas.Font.color := ClWhite;
  end
 else //se não está selecionado
  begin
   if not odd(DM.CDSContasBancarias.RecNo) then // se não for ímpar
    DBGrid1.Canvas.Brush.Color := $00E1FFF9
   else
    DBGrid1.Canvas.Brush.Color := $00FFEBDF;
   DBGrid1.Canvas.Font.Color := ClBlack;
  end;
 DBGrid1.Canvas.FillRect(Rect); // pinta a célula
 DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

Alguém faz idéia de como solucionar isso?

Obrigado

Valdir
Tente duas coisas   Troque 1)
DBGrid1.Canvas.FillRect(Rect); // pinta a célula
 DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

por
 
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
  2)   Coloque a proprierdade  defaultDrawing em false
Responder

Gostei + 0

12/07/2010

Valdir Dill

Olá,
Estou tendo um problema com DBGrid. Vou explicar:

Para criar um efeito zebra no DBGrid, tenho o código abaixo no evento DrawColumnCell dele.
O problema ocorre quando, em execução, se tenta redimensionar as colunas. O pior é que é o erro é "Access Violation" e não ocorre toda a vez que é feito o redimensionamento. É aleatório. Se tirar a rotina abaixo, o problema não ocorre.


Rotina executada no DrawColumnCell
 if (GdSelected in State) then //se está selecionado
  begin
   DBGrid1.Canvas.Brush.Color := $00778086;
   DBGrid1.Canvas.Font.Style := [fsBold];
   DBGrid1.Canvas.Font.color := ClWhite;
  end
 else //se não está selecionado
  begin
   if not odd(DM.CDSContasBancarias.RecNo) then // se não for ímpar
    DBGrid1.Canvas.Brush.Color := $00E1FFF9
   else
    DBGrid1.Canvas.Brush.Color := $00FFEBDF;
   DBGrid1.Canvas.Font.Color := ClBlack;
  end;
 DBGrid1.Canvas.FillRect(Rect); // pinta a célula
 DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

Alguém faz idéia de como solucionar isso?

Obrigado

Valdir
Tente duas coisas   Troque 1)
DBGrid1.Canvas.FillRect(Rect); // pinta a célula
 DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); // pinta o texto padrão

por
 
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
  2)   Coloque a proprierdade  defaultDrawing em false


Olá Marco,
Obrigado pela dica, mas não funcionou.
Mudei ambas as opções que você indicou e também cada uma sem alterar a outra, mas continua igual.


Responder

Gostei + 0

12/07/2010

Marco Salles

hummmmmmmmmm   Vc diz que  
em execução, se tenta redimensionar as colunas
  O que vc quer dizer com isto ?????
Responder

Gostei + 0

12/07/2010

Wilson Junior

Utilizo esta rotina e funciona perfeitamente. Coloque no evento OnDrawColumnCell.
procedure ZebrarDBGrid(DBGrid: TDBGrid; Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
begin
  DBGrid.Canvas.FillRect( Rect );

  if  gdSelected in State then
    begin
      DBGrid.Canvas.Font.Color  := clWhite;
      DBGrid.Canvas.Brush.Color := clNavy;
    end
  else
    begin
      DBGrid.Canvas.Font.Color := clBlack;
      if  Odd(DBGrid.DataSource.DataSet.RecNo) then
          DBGrid.Canvas.Brush.Color := GRID_COR_ZEBRADO1
      else
          DBGrid.Canvas.Brush.Color := GRID_COR_ZEBRADO2
      ;
    end
  ;

  DBGrid.DefaultDrawColumnCell( Rect, DataCol, Column, State );
end;


E o que você quer dizer quanto ao alterar o tamanho da coluna???

Espero ter colaborado.
Responder

Gostei + 0

12/07/2010

Valdir Dill

hummmmmmmmmm   Vc diz que  
em execução, se tenta redimensionar as colunas
  O que vc quer dizer com isto ?????


Quando em execução se coloca o mouse no título do dBGrid e mouse fica em forma de cruz. Se nesse momento o usuário clicar e arrastar o mouse, aquela coluna do Dbgrid será redimensionada.
Responder

Gostei + 0

12/07/2010

Marco Salles

ha principio ests tudo Ok Mas tente utilizar a Rotina do Wilson (Paulista) . Tem umas sutiliezas em relação a sua Rotina Original
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar