Jump to content
Fórum Script Brasil
  • 0

Dbgrid Zebrado


robinhocne
 Share

Question

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 to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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;

Edited by Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link to comment
Share on other 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 to comment
Share on other sites

  • 0
Guest bettega

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;

Edited by Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.5k
×
×
  • Create New...