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

(Resolvido) DBGrid zebrado + alinhado


DiabloX3

Pergunta

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);

Editado por DiabloX3
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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?

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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;

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,7k
×
×
  • Criar Novo...