Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
DiabloX3

(Resolvido) DBGrid zebrado + alinhado

Question

Formatei um dbgrid para zebrado e ele perdeu todos os alinhamentos das colunas.

tem varios campos como cod, desc, qnt, valor vista, a prazo etc

todos exceto a desc devem ficar alinhados, (e estao quando vou nas colunas do grid) mas na execução ficam justificadas a direita. não sei se é por causa da formatação zebrado...

Vou postar o codigo usado e gostaria de saber como alinho as colunas

procedure TfrmCaixa.grdItemDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
if odd(qrItemVenda.RecNo) then
 grdItem.Canvas.Brush.Color := $00EFEFEF
else
 grdItem.Canvas.Brush.Color := $00E6E6E6;

 TDbGrid(Sender).Canvas.Font.Color:= $00400000;
if gdSelected in State then
 with (Sender as TDBGrid).Canvas do
 begin
 Brush.Color := clMenuHighlight;
 FillRect(Rect);
 Font.Style := [fsbold];
 Font.Color := clWhite;
  end;
 TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);

Edited by DiabloX3

Share this post


Link to post
Share on other sites

11 answers to this question

Recommended Posts

  • 0

Tente assim:

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

   If odd(qrItemVenda.RecNo) then
      begin
         grdItem.Canvas.Font.Color:= clBlack;
         grdItem.Canvas.Brush.Color:= cl3DLight;
      end
   else
      begin
         grdItem.Canvas.Font.Color:= clBlack;
         grdItem.Canvas.Brush.Color:= clWhite;
      end;

   if (gdSelected in state) then
      grdItem.Canvas.Font.Color:= clred
   else
      grdItem.Canvas.Font.Color:= clBlack;

   grdItem.Canvas.FillRect(Rect);
   grdItem.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

abraço

Share this post


Link to post
Share on other sites
  • 0

DiabloX3, duas recomendações:

1) passe ao método default os parâmetros que você recebe no cabeçalho do evento/procedure, ou seja, ao invés de:

TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);

use deste modo:

TDbGrid(Sender).DefaultDrawDataCell(Rect, Column, State);

que é como o colega Jhonas lhe sugeriu.

Outra coisa a observar é se você definiu este alinhamento na definição da coluna adicionada ao DBGrid ou no field do dataset. De acordo com o help do Delphi 2006, este evento usa a informação do field e não da coluna.

..., DefaultDrawDataCell gets the alignment for the text from the field component rather than the column descriptor, and it never draws a focus rectangle on selected cells.

E esta pode ser a causa da perda de alinhamento.

2) também segundo o help, o evento OnDrawDataCell é obsoleto e mantido para compatibilidade. Ele orienta que seja usado o evento OnDrawColumnCell e neste caso o método default a ser chamado será DefaultDrawColumnCell.

Do not write an OnDrawDataCell event handler. OnDrawDataCell is obsolete and included for backward compatibility. Instead, write an OnDrawColumnCell event handler.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Muito obrigado a voces.. deu certo sim

só outra pergunta ao Micheus: realmente eu alinhei pela propriedade Columns do DBGrid. Fui olhar agora essa parte de alinhar pelo field do dataset mas não soube solucionar por este método.. Onde ela estaria mais especificamente? a título de curiosidade

abraço

Share this post


Link to post
Share on other sites
  • 0
realmente eu alinhei pela propriedade Columns do DBGrid. Fui olhar agora essa parte de alinhar pelo field do dataset mas não soube solucionar por este método.. Onde ela estaria mais especificamente? a título de curiosidade
DiabloX3, se você adicionou os campos (fields) ao seu dataset em design-time, você simplesmente acessa ele e do mesmo modo como você configura, p.e., a propriedade DisplayFormat, você usa a propriedade Alignment para definir o alinhamento a ser usado no desenho do field através do método DefaultDrawDataCell (obsoleto).

Caso você não tenha adicionado os campos em design-time, então no código do programa, após aberto o dataset, você acessa o campo através da propriedade Fields do dataset, ou mesmo via FieldByName - que lhe rotornará um TField - e acessa sua propriedade Alignment:

qryCliente.Fields[1].Alignment := taLeftJustify;

ou

qryCliente.FieldByName('DatNascimento').Alignment := taRightJustify;

Abraços

Share this post


Link to post
Share on other sites
  • 0

Bom dia

estou revivendo o tópico pois surgiu uma nova duvida em relação a essa mesma programação

Tenho a necessidade de usar o mesmo código proposto pelo amigo Jhonas só que com MultiSelect

nas grids que não tenho essa procedure zebrada, segurando ctrl + clique com mouse eu consigo selecionar apenas as linhas que eu quero, mas com esses comandos ele apenas deixa um pontinho na borda na grid. Queria saber se tem como deixar zebrado e ainda fazer a mesma coisa como se não tivesse zebrada.

abraços

Share this post


Link to post
Share on other sites
  • 0
Citar
Tenho a necessidade de usar o mesmo código proposto pelo amigo Jhonas só que com MultiSelect

nas grids que não tenho essa procedure zebrada, segurando ctrl + clique com mouse eu consigo selecionar apenas as linhas que eu quero, mas com esses comandos ele apenas deixa um pontinho na borda na grid. Queria saber se tem como deixar zebrado e ainda fazer a mesma coisa como se não tivesse zebrada.

Não vejo onde está o problema ... basta deixar na propriedade Options do DBGrid a opção dgMultiSelect como true que funciona perfeitamente a multi seleção e o zebrado

 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
   If odd(Query1.RecNo) then
      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;

   if (gdSelected in state) then
      DBGrid1.Canvas.Font.Color:= clred
   else
      DBGrid1.Canvas.Font.Color:= clBlack;

   DBGrid1.Canvas.FillRect(Rect);
   DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

abraço

Share this post


Link to post
Share on other sites
  • 0

if odd(qryPesquisa.RecNo) then // Se não for par
 grdVendas.Canvas.Brush.Color := $00EFEFEF
else
 grdVendas.Canvas.Brush.Color := $00E6E6E6;
 TDbGrid(Sender).Canvas.Font.Color:= $00400000;

 if (gdSelected in state) then  // Se o estado da célula não é selecionado
  with (Sender as TDBGrid).Canvas do
    begin
     Brush.Color := clMenuHighlight;
     Font.Style := [fsbold];
     Font.Color := clWhite
    end
   else
      grdVendas.Canvas.Font.Color:= clBlack;

   grdVendas.Canvas.FillRect(Rect);
   grdVendas.DefaultDrawColumnCell(Rect, DataCol, Column, State); // Reescreve o valor que vem do banco

O meu pro seu só muda as cores acho, e o que faz com a linha seleciona (bold etc)

O problema que nessa Grid com esse código, quando seguro o ctrl e clico, apenas fica com um pontinho preto no canto esquerdo da Grid onde não tá escrito nada, onde fica o cursorzinho indicando a linha atual, mas não seleciona a linha de fora a fora. O dgMultiSelect está True

Na grid sem o evento DrawColumnCell, ctrl + clique ele seleciona de fora a fora a linha. Não sei se é algum detalhe no meu código?

Share this post


Link to post
Share on other sites
  • 0
Na grid sem o evento DrawColumnCell, ctrl + clique ele seleciona de fora a fora a linha. Não sei se é algum detalhe no meu código?

Caso voce não tenha percebido, para montar o zebrado o evento OnDrawColumnCell fica numa especie de loop constante para poder pintar uma linha com o fundo branco e outra com o fundo cinza.

Se voce deixa uma linha totalmente pintada o zebrado não acontece mais em virtude de ter que tirar o comando de sua posição

exemplo

if (gdSelected in state) then  // Se o estado da célula não é selecionado
  with (Sender as TDBGrid).Canvas do
    begin
     Brush.Color := clMenuHighlight;
     Font.Style := [fsbold];
     Font.Color := clWhite
   
    Canvas.FillRect(Rect);
    DefaultDrawColumnCell(Rect, DataCol, Column, State)

    end
   else
      grdVendas.Canvas.Font.Color:= clBlack;

para fazer o que voce está querendo, teria que acrestar um outro loop , para repintar novamente o zebrado em função dos registros selecionados pelo multiselect , ou seja a cada registro selecionado, pintar a linha toda e para cada registro não selecionado pintar um de branco e um de cinza.

Mas não aconselho, pois se tornaria um processo que iria exigir mais tempo de processamento somente para ficar fazendo isto.

abraço

Share this post


Link to post
Share on other sites
  • 0

Fiz desta maneira e funcionou sem muitos segredos

 

procedure ZebrarGrid(Sender, DataSet: TObject; Rect: TRect; Column: TColumn;
  State: TGridDrawState);
begin
  if not (DataSet as TDataSet).Active  then Exit;
  if (DataSet as TDataSet).IsEmpty then Exit;

  // se a célula está selecionada ou foi selecionada no multi-select
  if (gdSelected in State) or ((Sender as TDBGrid).SelectedRows.CurrentRowSelected) then
    begin
      // define a cor de fundo do fundo
      (Sender as TDBGrid).Canvas.Brush.Color := $00CFB78F;
    end
  else  // se a célula não está selecionada
    begin
      if not Odd((DataSet as TDataSet).RecNo) then // se for ímpar
        begin
          // define a cor de fundo
          (Sender as TDBGrid).Canvas.Brush.Color := cl3DLight;
        end
      else
        begin
          // define a cor de fundo
          (Sender as TDBGrid).Canvas.Brush.Color := clWindow;
        end;
    end;

  (Sender as TDBGrid).Canvas.FillRect(Rect);
  (Sender as TDBGrid).Canvas.TextOut(Rect.Left + 2,Rect.Top, Column.Field.AsString);

end;

Share this post


Link to post
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.

Sign in to follow this  



  • Forum Statistics

    • Total Topics
      148593
    • Total Posts
      644162
×
×
  • Create New...