Como classificar registros no Delphi DBGrid por título de coluna

Delphi DBGrid é um componente tão poderoso que você provavelmente o usa todos os dias se estiver desenvolvendo aplicativos com reconhecimento de dados. Abaixo, veremos como adicionar mais alguns recursos aos seus aplicativos de banco de dados que seus usuários adoram.

Seguindo os conceitos descritos no Guia para Iniciantes em Programação de Banco de Dados Delphi, os exemplos abaixo usam componentes ADO (AdoQuery / AdoTable conectado ao ADOConnection, DBGrid conectado ao AdoQuery sobre DataSource) para exibir o registros de uma tabela de banco de dados em um componente DBGrid.

Todos os nomes de componentes foram deixados como Delphi os nomeou quando descartados no formulário (DBGrid1, ADOQuery1, AdoTable1, etc.).

O mouse se move sobre a área de título do DBGrid

Primeiro, vamos ver como alterar o ponteiro do mouse enquanto ele se move sobre a área de título do DBGrid. Tudo o que você precisa fazer é adicionar o código ao evento OnMouseMove para o componente DBGrid.

O código abaixo simplesmente usa a propriedade MouseCoord do componente DBGrid para "calcular" onde está o ponteiro do mouse. Se estiver sobre a área de título do DGBrid, o pt.y será igual a 0, que é a primeira linha no DBGrid (a área de título que exibe títulos de colunas / campos).

instagram viewer

procedimento TForm1.DBGrid1MouseMove
(Remetente: TObject; Shift: TShiftState; X, Y: Inteiro);
var
pt: TGridcoord;
início
pt: = DBGrid1.MouseCoord (x, y);
E se pt.y = 0 então
DBGrid1.Cursor: = crHandPoint
outro
DBGrid1.Cursor: = crDefault;
fim;

Classificar na coluna Clique e altere a fonte do título da coluna

Se você estiver usando a abordagem ADO para o desenvolvimento de banco de dados Delphi e quiser classificar os registros no conjunto de dados, precisará definir a propriedade Sort do seu AdoDataset (ADOQuery, AdoTable).

A propriedade Sort é o valor de cadeia ampla que indica a parte "ORDER BY" da consulta SQL padrão. Obviamente, você não precisa escrever a consulta SQL para poder usar a propriedade Sort. Basta definir a propriedade Classificar com o nome de um único campo ou com uma lista de campos separados por vírgula, cada um seguindo a ordem de classificação.

Aqui está um exemplo:

ADOTable1.Sort: = 'Ano DESC, ArticleDate ASC'

O evento OnTitleClick do componente DBGrid possui um parâmetro Column indicando a coluna na qual o usuário clicou. Cada coluna (objeto do tipo TColumn) possui uma propriedade Field indicando o Field (TField) representado por a coluna e o campo em sua propriedade FieldName mantém o nome do campo no subjacente conjunto de dados.

Portanto, para classificar um conjunto de dados ADO por campo / coluna, uma linha simples pode ser usada:

com TCustomADODataSet (DBGrid1.DataSource. DataSet) do
Classificar: = Coluna. Campo. FieldName; // + 'ASC' ou 'DESC'

Abaixo está o código do manipulador uniforme OnTitleClick que classifica os registros por clique na coluna. O código, como sempre, estende a ideia.

Primeiro, queremos marcar de alguma forma a coluna usada atualmente para a ordem de classificação. Em seguida, se clicarmos no título de uma coluna e o conjunto de dados já estiver classificado por essa coluna, queremos alterar a ordem de classificação de ASC (crescente) para DESC (decrescente) e vice-versa. Finalmente, quando classificamos o conjunto de dados por outra coluna, queremos remover a marca da coluna selecionada anteriormente.

Por uma questão de simplicidade, para marcar a coluna que "classifica" os registros, basta alterar o estilo da fonte do título da coluna para Negrito e removê-lo quando o conjunto de dados for classificado usando outra coluna.

procedimento TForm1.DBGrid1TitleClick (coluna: TColumn);
{$ J +}const PreviousColumnIndex: inteiro = -1;
{$ J-}
beginif DBGrid1.DataSource. DataSet é TCustomADODataSet então com TCustomADODataSet (DBGrid1.DataSource. DataSet) dobegintry
DBGrid1.Columns [PreviousColumnIndex] .title. Fonte. Estilo: =
DBGrid1.Columns [PreviousColumnIndex] .title. Fonte. Estilo - [fsBold];
exceto;
Column.title. Fonte. Estilo: =
Column.title. Fonte. Estilo + [fsBold];
PreviousColumnIndex: = Coluna. Índice;
E se (Pos (coluna. Campo. FieldName, Sort) = 1)
e (Pos ('DESC', classificação) = 0) então
Classificar: = Coluna. Campo. FieldName + 'DESC'
outro
Classificar: = Coluna. Campo. FieldName + 'ASC';
fim;
fim;

O código acima usa constantes digitadas para preservar o valor da coluna "selecionada anteriormente" para a ordem de classificação.

instagram story viewer