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

Customizar exibição em dbgrid


luizf

Pergunta

Eu gostaria de ordenar coluna em ordem crescente ou decrescente, achei este codigo na net:

var
  Campo: String;
  I: Integer;
begin
  Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada

  Application.Processmessages; // Para considerar algo que aconteça no dbgrid durante a entrada nesta procedure

  for I:= 0 to DBGrid1.Columns.Count-1 do
    DBGrid1.Columns[I].Title.Font.Color := clBlack;

  with Query1 do
  begin
    SQL.Clear; // Limpa a Query

    SQL.Add('select * from Div1 order by ' + Campo + 'ASC' ); // ESCREVE O SELECT COM O ORDER BY

    // SELECT * FROM Customers ORDER BY DOB ASC

    if not Prepared then
    begin
      Prepare;
      Open; // ABRE A QUERY COM A ORDEM ESCOLHIDA.
    end;

  end; // with DataModule2.Query_ListaGrav

  Column.Title.Font.Color:= clBlue;
  Column.Font.Color:= clBlue; // COLOCAR A COLUNA NA COR DESEJADA
end;

Mas esta dando erro. E trava o programa.

Estou usando um DataSource e um ClientDataSet que salva os dados em um arquivo xml, que fica numa pasta chamada Dados, no diretorio do executavel , por causa desse codigo que achei, adicionei uma Query.

Aproveitando o tópico, outra coisa que gostaria, era de exibir ou ocultar linha(s) que possuir uma determinada substring, exemplo.

Há uma coluna nomes com os dados (exemplo).

ABC - CDX - AGE

FGH - KEH - GLV

KUI - HUI - ABC

Quero ocultar ou excluir as linha que contenham ABC, então a linha 1 e a 3 é ocultada ou exibida, conforme alguma botão clicado ou coisa assim.

Obrigado

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

No primeiro o código devera ficar no evento OnTitleClick do DBGrid

No segundo o código deverá ficar no evento OnDrawColumnCell e lá voce especifica a condição de um valor para determinado campo

exempo:

Neste código estamos trocando a cor da fonte de um campo se o valor do caixa for menor ou maior que zero

a idéia é a mesma se quizer ocultar o texto ... basta deixar a cor da font igual a do fundo

if (Column.Field.FieldName = 'CAIXA') then
      begin
         if CDS_CaixaP.FieldByName ('CAIXA').Value < 0 then
            begin
               DBGrid1.Canvas.Font.Color:= clRed;
               DBGrid1.Canvas.FillRect(Rect);
               DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
            end
         else
            begin
               DBGrid1.Canvas.Font.Color:= clBlack;
               DBGrid1.Canvas.FillRect(Rect);
               DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
            end;
      end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é, já estava colocando no evento OnTitleClick do DBGrid, mas quando clico no titulo trava e dá erro.

A ultima mensagem de erro apareceu:

Invalid use of keyword.

Token: ?

Line Number : 1.

Onde esta escrito:

SQL.Add('select * from Div1 order by ' + Campo + 'ASC' );

Acho que estou errando nesse Div1 e/ou ASC.

Não dá pra voce, ou alguém, me passar um exemplo, eu tento mudar para o que preciso.

Só pra constar:

Os campos (colunas) que quero ordenar, há

> coluna com valores reais,

> coluna com valores inteiros e

> coluna com valores string

Não sei se tem diferença pra ordenar, conforme o tipo.

T+

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

  • 0

Tentei fazer assim...

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  Campo: String;
  I: Integer;
begin


  Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada
  Application.Processmessages; // Para considerar algo que aconteça no dbgrid durante a entrada nesta procedure

  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM ' + ADOTable1.TableName + ' ORDER BY ' + Campo + ' DESC');

  if not  Query1.Prepared then
     Query1.Prepare;

   Query1.Open;

end;

E continua dando erro.

Link para o comentário
Compartilhar em outros sites

  • 0

Faça assim no OnTileClick do DBGrid:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  if 'a' + Column.FieldName = CDS_CaixaP.IndexName then
    CDS_CaixaP.IndexName := 'd' + column.FieldName
  else
    CDS_CaixaP.IndexName := 'a' + column.FieldName;
end;
E no OnCreate do form poe isso:
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
  for i := 0 to CDS_CaixaP.FieldCount - 1 do
  begin
    CDS_CaixaP.IndexDefs.Add('a' + CDS_CaixaP.Fields[i].FieldName,
      CDS_CaixaP.Fields[i].FieldName, []);
    CDS_CaixaP.IndexDefs.Add('d' + CDS_CaixaP.Fields[i].FieldName,
      CDS_CaixaP.Fields[i].FieldName, [ixDescending]);
  end;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Douglas Soares, você está assumindo que o colega luizf está trabalhando com ClientDataset (CDS_CaixaP.IndexName), quando na verdade ele usa um TQuery (Query1), e neste caso, IndexName não existe e pode confundí-lo.

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  Campo: String;
  I: Integer;
begin
  Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada
  // Application.Processmessages; // esta linha não é exatamente necessária - pode removê-la e observar

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM ' + ADOTable1.TableName + ' ORDER BY ' + Campo + ' DESC');

  // if not  Query1.Prepared then  // também não é necessário. Este teste já é feito internamente quando a consulta é aberta
  //   Query1.Prepare;

   Query1.Open;
end;

luizf, não estou certo do porquê de você ter uma tabela (ADOTable1) e uma consulta (Query1, sobre a mesma tabela ADOTable1.TableName), mas de qualquer modo, seria mais comum que você trabalhasse com a mesma paleta de componentes. Entretanto, você usa um TQuery onde poderia ser um TADOQuery (compatível com TADOTable utilizado).

Se você souber como depurar (usar break-points e tal), você deveria inspecionar o conteúdo da propriedade SQL para que tire a dúvida sobre o que está errado na consulta antes de ela ser aberta.

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, valeu pela ajuda, mas continua dando erro.

Micheus, tentei com seu exemplo, de novo, pois já havia tentando dessa maneira, não sei mas acho que é problema com os numeros, para ordenar, precisar ser string?

Erro:

455erro.GIF

O erro, sempre é nessa linha Token.

T+

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

  • 0
E com o exemplo do Douglas Soares, testei com outro parecido, que usa ClientDataSet, troquei neste anterior por uma dica que encontrei na net, mas o erro foi parecido.
Sem dúvida não é nada parecido. Aqui você obteve um run-time, lá um erro dentro da consulta - é bem diferente.

Onde esta escrito:

SQL.Add('select * from Div1 order by ' + Campo + 'ASC' );

Acho que estou errando nesse Div1 e/ou ASC.

olhando este post, aqui há algo errado sim: você não deixou espaço antes do ASC, logo o texto fica grudado com o nome do campo.

Mas, só para saber qual o ponto da sua consulta está dando erro, quebre ela em mais linhas:

SQL.Add('select *');

SQL.Add('from Div1');

SQL.Add('order by ' + Campo + ' ASC' );

Link para o comentário
Compartilhar em outros sites

  • 0
455erro.GIF

O erro, sempre é nessa linha Token.

Erro.....

206Erro.JPG

luizf, você há de convir que estes dois erros não são iguais, logo não tem origem no mesmo problema.

A tabela existe, os dados são exibidos normalmente, mas quando clico na titulo da coluna, dá erro.

Considerando esta última mensagem de erro e o código que foi postado anteriormente...

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  Campo: String;
  I: Integer;
begin
  Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada
  // Application.Processmessages; // esta linha não é exatamente necessária - pode removê-la e observar

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM ' + ADOTable1.TableName + ' ORDER BY ' + Campo + ' DESC');

  // if not  Query1.Prepared then  // também não é necessário. Este teste já é feito internamente quando a consulta é aberta
  //   Query1.Prepare;

   Query1.Open;
end;

...Eu arriscaria dizer que você não setou a propriedade Database deste seu componente TQuery1. Verifique-o.

Editado por Micheus
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...