Ir para conteúdo
Fórum Script Brasil
  • 0

Dbgrid Zebrado


robinhocne

Pergunta

Olá pessoal achei este exemplo de DbGrid Zebrado em umas das apostilas minhas de programação, mas modifiquei do jeito que o meu projeto necessita, mas esta dando os seguinte erros:

Esses são os dados:

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
   If Odd (FDtmIza.Praticas.RecNo) and (FDtmIza.Praticas.State <> dsInsert) Then
      Begin // Colocar a unit DB na clausula Uses na unit da tela
         DbgRel.Canvas.Brush.Color := clMoneyGreen; // muda a cor do pincel
         DbgRel.Canvas.FillRect(Rect); // Preenche o fundo com a cor especificada
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State); // desenha as células da grade
      end;
end;

E ai dá este erro em Praticas // Praticas é a minha tabela que eu tenho o grid.

[Warning]Praticas.pas(431): Return value of function 'Tfrmpraticas.RetornaData' might be undefined

[Error] Praticas.pas(658): Undeclared identifier: 'Praticas'

[Fatal Error] sistemacfc.dpr(34): Could not compile used unit 'Praticas.pas'

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0

tenta isso:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if not odd(table1.RecNo) then
 begin
   DBGrid1.Canvas.Brush.Color:= clMoneyGreen;
   DBGrid1.Canvas.FillRect(Rect);
   DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
   if gdFocused in State then
       begin
           DBGrid1.Canvas.Brush.Color:= clBlack;
           DBGrid1.Canvas.FillRect(Rect);
           DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
       end;
 end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Eu fiz desse tipo, mas aparece todo de uma cor só, será que tem como ser uma linha sim outra não?

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;

DataCol: Integer; Column: TColumn; State: TGridDrawState);

begin

DBGrid1.Canvas.Brush.Color:= clMoneyGreen;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);

if gdFocused in State then

begin

DBGrid1.Canvas.Brush.Color:= clBlack;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);

end;

end;

end;

Link para o comentário
Compartilhar em outros sites

  • 0
Olá pessoal achei este exemplo de DbGrid Zebrado em umas das apostilas minhas de programação, mas modifiquei do jeito que o meu projeto necessita, mas esta dando os seguinte erros:

Esses são os dados:

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
   If Odd (FDtmIza.Praticas.RecNo) and (FDtmIza.Praticas.State <> dsInsert) Then
      Begin // Colocar a unit DB na clausula Uses na unit da tela
         DbgRel.Canvas.Brush.Color := clMoneyGreen; // muda a cor do pincel
         DbgRel.Canvas.FillRect(Rect); // Preenche o fundo com a cor especificada
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State); // desenha as células da grade
      end;
end;

E ai dá este erro em Praticas // Praticas é a minha tabela que eu tenho o grid.

[Warning]Praticas.pas(431): Return value of function 'Tfrmpraticas.RetornaData' might be undefined

[Error] Praticas.pas(658): Undeclared identifier: 'Praticas'

[Fatal Error] sistemacfc.dpr(34): Could not compile used unit 'Praticas.pas'

o erro diz que não há um identificador Praticas (pelo seu código uma tabela ou query) definido em FDtmIza (isto deveria ser um form ou datamodule - o que é?)

Link para o comentário
Compartilhar em outros sites

  • 0
Olá pessoal achei este exemplo de DbGrid Zebrado em umas das apostilas minhas de programação, mas modifiquei do jeito que o meu projeto necessita, mas esta dando os seguinte erros:

Esses são os dados:

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
   If Odd (FDtmIza.Praticas.RecNo) and (FDtmIza.Praticas.State <> dsInsert) Then
      Begin // Colocar a unit DB na clausula Uses na unit da tela
         DbgRel.Canvas.Brush.Color := clMoneyGreen; // muda a cor do pincel
         DbgRel.Canvas.FillRect(Rect); // Preenche o fundo com a cor especificada
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State); // desenha as células da grade
      end;
end;
E ai dá este erro em Praticas // Praticas é a minha tabela que eu tenho o grid.
[Warning]Praticas.pas(431): Return value of function 'Tfrmpraticas.RetornaData' might be undefined [Error] Praticas.pas(658): Undeclared identifier: 'Praticas' [Fatal Error] sistemacfc.dpr(34): Could not compile used unit 'Praticas.pas'
o erro diz que não há um identificador Praticas (pelo seu código uma tabela ou query) definido em FDtmIza (isto deveria ser um form ou datamodule - o que é?)
Ok,até essa parte eu resolvi Micheus mas o problema é esse: Eu fiz desse tipo, mas aparece todo de uma cor só, será que tem como ser uma linha sim outra não?
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  DBGrid1.Canvas.Brush.Color:= clMoneyGreen;
  DBGrid1.Canvas.FillRect(Rect);
  DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
  if gdFocused in State then
  begin
    DBGrid1.Canvas.Brush.Color:= clBlack;
    DBGrid1.Canvas.FillRect(Rect);
    DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
  end;
end;

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0
Dá uma olhada neste post e neste outro. Isso já é pergunta velha aqui no forum ;)

Micheus eu Utilizei assim e fala que o RecNo, não foi declarado oque eu faço.

if not odd(FDtmIza.RecNo) then
      begin
         DbgRel.Canvas.Brush.Color:= clMoneyGreen;
         DbgRel.Canvas.FillRect(Rect);
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
     if gdFocused in State then
   begin
     DbgRel.Canvas.Brush.Color:= clBlack;
     DbgRel.Canvas.FillRect(Rect);
     DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
      end;
   end;

Link para o comentário
Compartilhar em outros sites

  • 0

Uma forma fácil, é a seguinte:

procedure TTESTE.DBGrid1DrawColumnCell(Sender: TObject; 
  const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin

  If ( gdSelected in State ) then
    DBGrid1.canvas.brush.color := clNavy
  else begin
    If BANCO_DE_DADOSFAMILIA.RecNo mod 2 = 1 then
      DBGrid1.canvas.brush.color := clBlue
    else
      DBGrid1.canvas.brush.color := clGreen;
  end;
  DBGrid1.DefaultDrawColumnCell ( rect, DataCol, Column, State );
end;

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0
Uma forma fácil, é a seguinte:
procedure TTESTE.DBGrid1DrawColumnCell(Sender: TObject; 
  const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin

  If ( gdSelected in State ) then
    DBGrid1.canvas.brush.color := clNavy
  else begin
    If BANCO_DE_DADOSFAMILIA.RecNo mod 2 = 1 then
      DBGrid1.canvas.brush.color := clBlue
    else
      DBGrid1.canvas.brush.color := clGreen;
  end;
  DBGrid1.DefaultDrawColumnCell ( rect, DataCol, Column, State );
end;

Obrigado Bettega e Micheus, mas continua dando erro:

[Warning]Praticas.pas(430): Return value of function 'Tfrmpraticas.RetornaData' might be undefined

[Error] Praticas.pas(657): Undeclared identifier: 'RecNo'

[Fatal Error] sistemacfc.dpr(34): Could not compile used unit 'Praticas.pas'

E dá problema nesse RecNo.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu uso esse e funciona

procedure TTeste.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin

   If odd(CDS_Query.RecNo) then   //  coloque aqui a sua query ou table
      begin
         DBGrid1.Canvas.Font.Color:= clBlack;
         DBGrid1.Canvas.Brush.Color:= cl3DLight;
      end
   else
      begin
         DBGrid1.Canvas.Font.Color:= clBlack;
         DBGrid1.Canvas.Brush.Color:= clWhite;
      end;
   DBGrid1.Canvas.FillRect(Rect);
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

Link para o comentário
Compartilhar em outros sites

  • 0

Dados:

Firebird 2.0.1

Data Module / Componentes IBTransaction, IBDataBase e IBQuery.

E os Dados que estão em questão:

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
   if not odd(FDtmIza.RecNo) then
      begin
         DbgRel.Canvas.Brush.Color:= clMoneyGreen;
         DbgRel.Canvas.FillRect(Rect);
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
     if gdFocused in State then
   begin
     DbgRel.Canvas.Brush.Color:= clBlack;
     DbgRel.Canvas.FillRect(Rect);
     DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
      end;
   end;

end;

Link para o comentário
Compartilhar em outros sites

  • 0
Dados:

Firebird 2.0.1

Data Module / Componentes IBTransaction, IBDataBase e IBQuery.

Obrigado pelas informações robinhocne.

A propriedade RecNo existe nos componentes da paleta IB, então tem algum "gato" aí.

É impressão minha ou FDtmIza é o nome do datamodule? Se for, onde está a referência a seu dataset em odd(FDtmIza.RecNo)?

Não estaria faltando algo aí no meio: odd(FDtmIza.<nome dataset>.RecNo)?

Mas, tenho quase certeza de que RecNo para estes componentes, retornará sempre -1 - é conferir...

Link para o comentário
Compartilhar em outros sites

  • 0
Dados:

Firebird 2.0.1

Data Module / Componentes IBTransaction, IBDataBase e IBQuery.

Obrigado pelas informações robinhocne.

A propriedade RecNo existe nos componentes da paleta IB, então tem algum "gato" aí.

É impressão minha ou FDtmIza é o nome do datamodule? Se for, onde está a referência a seu dataset em odd(FDtmIza.RecNo)?

Não estaria faltando algo aí no meio: odd(FDtmIza.<nome dataset>.RecNo)?

Mas, tenho quase certeza de que RecNo para estes componentes, retornará sempre -1 - é conferir...

Micheus se eu acrescentar = Ele compila mas no Grid não há diferença nenhuma, O que ocorre.?

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
Begin
   if not odd(DtmIza.QryIza.RecNo) then
      begin
         DbgRel.Canvas.Brush.Color:= clMoneyGreen;
         DbgRel.Canvas.FillRect(Rect);
         DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
     if gdFocused in State then
   begin
     DbgRel.Canvas.Brush.Color:= clBlack;
     DbgRel.Canvas.FillRect(Rect);
     DbgRel.DefaultDrawDataCell(Rect, Column.Field, State);
      end;
   end;

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus se eu acrescentar = Ele compila mas no Grid não há diferença nenhuma, O que ocorre.?
agora chegamos na questão!

Esta questão da resolução do erro de compilação, já poderia ter sido sanado lá no post#8 e tivemos que chegar até o post#14 <_<

Bom, se você souber depurar (utilizar break-point e tal), você poderá observar que o que eu mencionei no post anterior, então, é verdade:

"Mas, tenho quase certeza de que RecNo para estes componentes, retornará sempre -1"

Logo, é por isso que não acontece nada - o Odd(-1) retorna sempre o mesmo resultado, logo não há o efeito zebrado.

Alternativa? Bom, eu teria que pesquisar, porque se não me engano já vi uma - só não lembro onde.

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus se eu acrescentar = Ele compila mas no Grid não há diferença nenhuma, O que ocorre.?
agora chegamos na questão!

Esta questão da resolução do erro de compilação, já poderia ter sido sanado lá no post#8 e tivemos que chegar até o post#14 <_<

Bom, se você souber depurar (utilizar break-point e tal), você poderá observar que o que eu mencionei no post anterior, então, é verdade:

"Mas, tenho quase certeza de que RecNo para estes componentes, retornará sempre -1"

Logo, é por isso que não acontece nada - o Odd(-1) retorna sempre o mesmo resultado, logo não há o efeito zebrado.

Alternativa? Bom, eu teria que pesquisar, porque se não me engano já vi uma - só não lembro onde.

Então como posso fazer?

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, Resolvido, Declarei uma variavel no private como inteiro e coloquei no fim da minha tabela que é em tempo de execução.

Mas agora deu outro problema, quando o programa rodando se eu clico no dbgrid e as a ordem mundo ou fica tudo da mesma cor, acho que deve estar acontecendo isso por causa q eu fiz até aki no forum, sobre o movimento da barra de rolagem com a bolinha do mouse, bom não consiguo descobrir, ai vai o codigo do dbgrid zebrado e o da bolinha para ver se tem sentido.

procedure Tfrmpraticas.DbgRelDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
Begin

   If odd(linha) then   //  coloque aqui a sua query ou table
      begin
         DbgRel.Canvas.Font.Color:= clBlack;
         DbgRel.Canvas.Brush.Color:= cl3DLight;
      end
   else
      begin
         DbgRel.Canvas.Font.Color:= clBlack;
         DbgRel.Canvas.Brush.Color:= clMoneyGreen;
      end;
   DbgRel.Canvas.FillRect(Rect);
   DbgRel.DefaultDrawColumnCell(Rect, DataCol, Column, State);

   if ( DataCol = 4 ) then inc( linha );
end;

procedure Tfrmpraticas.AppEventsMessage(var Msg: TMsg; var Handled: Boolean);

var

Sentido: SmallInt;

WndClass :array[0..128]of char;

begin

if Msg.message = WM_MOUSEWHEEL then

begin

GetClassName(Msg.hwnd, WndClass, SizeOf(WndClass)-1);

if StrComp(WndClass, 'TDBGrid') = 0 then

begin

Msg.message := WM_KEYDOWN;

Msg.lParam := 0;

Sentido := HiWord(Msg.wParam) ;

if Sentido > 0 then

Msg.wParam := VK_UP

else

Msg.wParam := VK_DOWN;

end;

End;

end;

Ambas partes tem referencia no fim do form create da minha tabela:

Application.OnMessage := AppEventsMessage;

linha := 1;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...