Comment trier les enregistrements dans Delphi DBGrid par titre de colonne

Delphi DBGrid est un composant si puissant que vous l'utilisez probablement tous les jours si vous développez des applications orientées données. Ci-dessous, nous allons voir comment ajouter des fonctionnalités supplémentaires à vos applications de base de données que vos utilisateurs vont certainement adorer.

En suivant les concepts décrits dans le Guide du débutant pour la programmation de bases de données Delphi, les exemples ci-dessous utilisent des composants ADO (AdoQuery / AdoTable connecté à ADOConnection, DBGrid connecté à AdoQuery sur DataSource) pour afficher le enregistrements à partir d'une table de base de données dans un composant DBGrid.

Tous les noms de composants ont été laissés tels que Delphi les a nommés lorsqu'ils ont été déposés sur le formulaire (DBGrid1, ADOQuery1, AdoTable1, etc.).

La souris se déplace sur la zone de titre DBGrid

Voyons d'abord comment changer le pointeur de la souris pendant qu'il se déplace sur la zone de titre DBGrid. Tout ce que vous avez à faire est d'ajouter le code à l'événement OnMouseMove pour le composant DBGrid.

instagram viewer

Le code ci-dessous utilise simplement la propriété MouseCoord du composant DBGrid pour "calculer" où se trouve le pointeur de la souris. S'il se trouve sur la zone de titre DGBrid, le pt.y est égal à 0, qui est la première ligne du DBGrid (la zone de titre affichant les titres de colonne / champ).

procédure TForm1.DBGrid1MouseMove
(Expéditeur: TObject; Shift: TShiftState; X, Y: Entier);
var
pt: TGridcoord;
commencer
pt: = DBGrid1.MouseCoord (x, y);
si pt.y = 0 ensuite
DBGrid1.Cursor: = crHandPoint
autre
DBGrid1.Cursor: = crDefault;
fin;

Trier sur la colonne Cliquez et modifiez la police du titre de la colonne

Si vous utilisez l'approche ADO pour le développement de bases de données Delphi et souhaitez trier les enregistrements dans l'ensemble de données, vous devez définir la propriété Sort de votre AdoDataset (ADOQuery, AdoTable).

La propriété Sort est la valeur de chaîne la plus large indiquant la partie "ORDER BY" de la requête SQL standard. Bien sûr, vous n'avez pas besoin d'écrire la requête SQL pour pouvoir utiliser la propriété Sort. Définissez simplement la propriété Sort sur le nom d'un seul champ ou sur une liste de champs séparés par des virgules, chacun suivant l'ordre de tri.

Voici un exemple:

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

L'événement OnTitleClick du composant DBGrid a un paramètre Column indiquant la colonne sur laquelle l'utilisateur a cliqué. Chaque colonne (objet de type TColumn) possède une propriété Field indiquant le champ (TField) représenté par la colonne et le champ dans sa propriété FieldName contient le nom du champ dans le sous-jacent base de données.

Par conséquent, pour trier un ensemble de données ADO par champ / colonne, une simple ligne peut être utilisée:

avec TCustomADODataSet (DBGrid1.DataSource. DataSet) faire
Trier: = colonne. Champ. Nom de domaine; // + 'ASC' ou 'DESC'

Ci-dessous se trouve le code du gestionnaire pair OnTitleClick qui trie les enregistrements par clic de colonne. Le code, comme toujours, étend l'idée.

Tout d'abord, nous voulons, d'une manière ou d'une autre, marquer la colonne qui est actuellement utilisée pour l'ordre de tri. Ensuite, si nous cliquons sur un titre de colonne et que l'ensemble de données est déjà trié par cette colonne, nous voulons changer l'ordre de tri de ASC (ascendant) à DESC (descendant), et vice versa. Enfin, lorsque nous trions l'ensemble de données par une autre colonne, nous voulons supprimer la marque de la colonne précédemment sélectionnée.

Par souci de simplicité, pour marquer la colonne qui "trie" les enregistrements, nous allons simplement changer le style de police du titre de la colonne en gras et le supprimer lorsque l'ensemble de données est trié à l'aide d'une autre colonne.

procédure TForm1.DBGrid1TitleClick (Colonne: TColonne);
{$ J +}const PreviousColumnIndex: entier = -1;
{$ J-}
début DBGrid1.DataSource. Base de données est TCustomADODataSet puis avec TCustomADODataSet (DBGrid1.DataSource. Base de données) dobegintry
DBGrid1.Columns [PreviousColumnIndex] .title. Police de caractère. Style: =
DBGrid1.Columns [PreviousColumnIndex] .title. Police de caractère. Style - [fsBold];
sauf;
Column.title. Police de caractère. Style: =
Column.title. Police de caractère. Style + [fsBold];
PreviousColumnIndex: = Colonne. Indice;
si (Pos (colonne. Champ. FieldName, Sort) = 1)
et (Pos ('DESC', Trier) = 0) ensuite
Trier: = colonne. Champ. FieldName + 'DESC'
autre
Trier: = colonne. Champ. FieldName + 'ASC';
fin;
fin;

Le code ci-dessus utilise constantes typées pour conserver la valeur de la colonne précédemment "sélectionnée" pour l'ordre de tri.

instagram story viewer