Come ordinare i record in Delphi DBGrid

Delphi DBGrid è un componente così potente che probabilmente lo stai usando ogni giorno se stai sviluppando applicazioni sensibili ai dati. Di seguito, daremo un’occhiata a come aggiungere altre funzionalità alle tue applicazioni di database che i tuoi utenti apprezzeranno sicuramente.

Seguendo i concetti descritti nella Guida per principianti alla programmazione di database Delphi, gli esempi seguenti utilizzano componenti ADO (AdoQuery / AdoTable connesso ad ADOConnection, DBGrid connesso ad AdoQuery su DataSource) per visualizzare i record da una tabella di database in un componente DBGrid.

Tutti i nomi dei componenti sono stati lasciati come li ha denominati Delphi quando vengono rilasciati nel modulo (DBGrid1, ADOQuery1, AdoTable1, ecc.).

Il mouse si sposta sull’area del titolo DBGrid

Per prima cosa, vediamo come modificare il puntatore del mouse mentre si sposta sull’area del titolo DBGrid. Tutto quello che devi fare è aggiungere il codice all’evento OnMouseMove per il componente DBGrid.

Il codice riportato di seguito utilizza semplicemente la proprietà MouseCoord del componente DBGrid per “calcolare” dove si trova il puntatore del mouse. Se si trova sull’area del titolo DGBrid, pt.y è uguale a 0, che è la prima riga nel controllo DBGrid (l’area del titolo che mostra i titoli di colonna / campo).

procedura TForm1.DBGrid1MouseMove
(Mittente: TObject; Shift: TShiftState; X, Y: Integer);
var
pt: TGridcoord;
iniziare
pt: = DBGrid1.MouseCoord (x, y);
if pt.y = 0 poi
DBGrid1.Cursor: = crHandPoint
altro
DBGrid1.Cursor: = crDefault;
fine;

Ordina per colonna Fare clic e modificare il carattere del titolo della colonna

Se stai utilizzando l’approccio ADO per lo sviluppo del database Delphi e desideri ordinare i record nel set di dati, devi impostare la proprietà Sort del tuo AdoDataset (ADOQuery, AdoTable).

La proprietà Sort è il valore widestring che indica la parte “ORDER BY” della query SQL standard. Ovviamente, non è necessario scrivere la query SQL per poter utilizzare la proprietà Sort. È sufficiente impostare la proprietà Sort sul nome di un singolo campo o su un elenco di campi separati da virgole, ciascuno secondo l’ordinamento.

Ecco un esempio:

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

L’evento OnTitleClick del componente DBGrid dispone di un parametro di colonna che indica la colonna su cui ha fatto clic l’utente. Ogni colonna (oggetto di tipo TColumn) ha una proprietà Field che indica il campo (TField) rappresentato dalla colonna e il campo nella sua proprietà FieldName contiene il nome del campo nel dataset sottostante.

Pertanto, per ordinare un set di dati ADO per campo / colonna, è possibile utilizzare una semplice riga:

con TCustomADODataSet (DBGrid1.DataSource.DataSet) fare
Ordina: = Column.Field.FieldName; // + "ASC" o "DESC"

Di seguito è riportato il codice per il gestore uniforme di OnTitleClick che ordina i record in base al clic della colonna. Il codice, come sempre, estende l’idea.

Innanzitutto, vogliamo, in qualche modo, contrassegnare la colonna attualmente utilizzata per l’ordinamento. Successivamente, se si fa clic sul titolo di una colonna e il set di dati è già ordinato in base a quella colonna, si desidera modificare l’ordinamento da ASC (ascendente) a DESC (discendente) e viceversa. Infine, quando ordiniamo il set di dati in base a un’altra colonna, vogliamo rimuovere il segno dalla colonna selezionata in precedenza.

Per semplicità, per contrassegnare la colonna che “ordina” i record, cambieremo semplicemente lo stile del carattere del titolo della colonna in Grassetto e lo rimuoveremo quando il set di dati viene ordinato utilizzando un’altra colonna.

procedura TForm1.DBGrid1TitleClick (colonna: TColumn);
{$ J +}const PreviousColumnIndex: intero = -1;
{$ J-}
beginif DBGrid1.DataSource.DataSet is TCustomADODataSet quindi con TCustomADODataSet (DBGrid1.DataSource.DataSet) dobegintry
DBGrid1.Columns [PreviousColumnIndex] .title.Font.Style: =
DBGrid1.Columns [PreviousColumnIndex] .title.Font.Style - [fsBold];
tranne che;
Column.title.Font.Style: =
Column.title.Font.Style + [fsBold];
PreviousColumnIndex: = Column.Index;
if (Pos (Column.Field.FieldName, Sort) = 1)
e (Pos ('DESC', Sort) = 0) poi
Ordina: = Column.Field.FieldName + 'DESC'
altro
Ordina: = Column.Field.FieldName + 'ASC';
fine;
fine;

Il codice precedente utilizza le costanti digitate per preservare il valore della colonna “selezionata” in precedenza per l’ordinamento.