Hur man sorterar poster i Delphi DBGrid

Delphi DBGrid är en så kraftfull komponent att du antagligen använder den varje dag om du utvecklar datainvetna applikationer. Nedan tittar vi på hur du lägger till några fler funktioner i dina databasapplikationer som dina användare säkert kommer att älska.

Följande begrepp som beskrivs i nybörjarhandboken för Delphi-databasprogrammering använder exemplen nedan ADO-komponenter (AdoQuery / AdoTable ansluten till ADOConnection, DBGrid ansluten till AdoQuery via DataSource) för att visa poster från en databastabell i en DBGrid-komponent.

Alla komponentnamn lämnades när Delphi namngav dem när de tappades på formuläret (DBGrid1, ADOQuery1, AdoTable1, etc.).

Musen rör sig över DBGrid-titelområdet

Låt oss först se hur du ändrar muspekaren medan den rör sig över DBGrid-titelområdet. Allt du behöver göra är att lägga till koden till OnMouseMove-händelsen för DBGrid-komponenten.

Koden nedan använder helt enkelt MouseCoord-egenskapen för DBGrid-komponenten för att "beräkna" var muspekaren är. Om det är över DGBrid-titelområdet, är pt.y lika med 0, vilket är den första raden i DBGrid (titelområdet som visar kolumn / fälttitlar).

procedur TForm1.DBGrid1MouseMove
(Avsändare: TObject; Skift: TShiftState; X, Y: Heltal);
var
pt: TGridcoord;
Börja
pt: = DBGrid1.MouseCoord (x, y);
om pt.y = 0 sedan
DBGrid1.Cursor: = crHandPoint
annan
DBGrid1.Cursor: = crDefault;
slutet;

Sortera på kolumn Klicka och ändra teckensnitt för kolumntitel

Om du använder ADO-metoden för Delphi-databasutveckling och vill sortera posterna i datasatsen måste du ställa in egenskapen Sortera för din AdoDataset (ADOQuery, AdoTable).

Egenskapen Sortera är det bredaste värdet som indikerar "ORDER BY" -delen i standard SQL-frågan. Naturligtvis behöver du inte skriva SQL-frågan för att kunna använda egenskapen Sortera. Ställ bara in egenskapen Sortera till namnet på ett enda fält eller till en kommaseparerad lista med fält, var och en följer sorteringsordningen.

Här är ett exempel:

ADOTable1.Sort: = 'År DESC, ArticleDate ASC'

Händelsen OnTitleClick för DBGrid-komponenten har en kolumnparameter som indikerar den kolumn som användaren har klickat på. Varje kolumn (objekt av typen TColumn) har en fältegenskap som indikerar fältet (TField) representerat av kolumnen, och fältet i dess fältnamnegenskap har namnet på fältet i det underliggande datasättet.

För att sortera ett ADO-datasätt efter fält / kolumn kan därför en enkel rad användas:

med TCustomADODataSet (DBGrid1.DataSource.DataSet) gör
Sortera: = Column.Field.FieldName; // + 'ASC' eller 'DESC'

Nedan är koden för OnTitleClick till och med hanteraren som sorterar posterna med kolumnklick. Koden utökar som alltid idén.

Först vill vi på något sätt markera den kolumn som för närvarande används för sorteringsordning. Nästa, om vi klickar på en kolumntitel och datasättet redan är sorterat efter den kolumnen, vill vi ändra sorteringsordningen från ASC (stigande) till DESC (fallande), och vice versa. Slutligen, när vi sorterar datasatsen efter en annan kolumn, vill vi ta bort märket från den tidigare valda kolumnen.

För enkelhetens skull, för att markera kolumnen som "sorterar" posterna, kommer vi bara att ändra typsnittet för kolumnens titel till Fet, och ta bort den när datasatsen sorteras med en annan kolumn.

procedur TForm1.DBGrid1TitleClick (kolumn: TColumn);
$ J +const Föregående kolumnindex: heltal = -1;
$ J-
beginif DBGrid1.DataSource.DataSet är TCustomADODataSet thenwith TCustomADODataSet (DBGrid1.DataSource.DataSet) dobegintry
DBGrid1.Columner [PreviousColumnIndex] .title.Font.Style: =
DBGrid1.Columner [PreviousColumnIndex] .title.Font.Style - [fsBold];
exceptend;
Column.title.Font.Style: =
Column.title.Font.Style + [fsBold];
PreviousColumnIndex: = Column.Index;
om (Pos (Column.Field.FieldName, Sort) = 1)
och (Pos ('DESC', Sort) = 0) sedan
Sortera: = Column.Field.FieldName + 'DESC'
annan
Sortera: = Column.Field.FieldName + 'ASC';
slutet;
slutet;

Ovanstående kod använder typade konstanter för att bevara värdet på den tidigare "valda" kolumnen för sorteringsordning.