Hoe records in Delphi DBGrid te sorteren

Delphi DBGrid is zo'n krachtig onderdeel dat u het waarschijnlijk elke dag gebruikt als u gegevensbewuste toepassingen ontwikkelt. Hieronder bekijken we hoe u nog meer functies kunt toevoegen aan uw database-applicaties die uw gebruikers zeker zullen waarderen.

Na de concepten beschreven in de Beginnershandleiding voor Delphi Database Programming, gebruiken de onderstaande voorbeelden ADO-componenten (AdoQuery / AdoTable verbonden met ADOConnection, DBGrid verbonden met AdoQuery via DataSource) om de records van een databasetabel in een DBGrid-component weer te geven.

Alle componentnamen bleven achter zoals Delphi ze noemde toen ze op het formulier werden geplaatst (DBGrid1, ADOQuery1, AdoTable1, etc.).

Muis beweegt over DBGrid-titelgebied

Laten we eerst kijken hoe we de muisaanwijzer kunnen wijzigen terwijl deze over het DBGrid-titelgebied beweegt. Het enige wat u hoeft te doen is de code toevoegen aan de OnMouseMove-gebeurtenis voor de DBGrid-component.

De onderstaande code gebruikt eenvoudig de eigenschap MouseCoord van de component DBGrid om te "berekenen" waar de muisaanwijzer zich bevindt. Als het zich boven het DGBrid-titelgebied bevindt, is pt.y gelijk aan 0, wat de eerste rij in de DBGrid is (het titelgebied dat kolom- / veldtitels weergeeft).

procedure TForm1.DBGrid1MouseMove
(Afzender: TObject; Shift: TShiftState; X, Y: geheel getal);
var
pt: TGridcoord;
beginnen
pt: = DBGrid1.MouseCoord (x, y);
als pt.y = 0 vervolgens
DBGrid1.Cursor: = crHandPoint
anders
DBGrid1.Cursor: = crDefault;
einde;

Sorteren op kolom Klik en wijzig het lettertype van de kolomtitel

Als u de ADO-benadering voor de ontwikkeling van de Delphi-database gebruikt en de records in de gegevensset wilt sorteren, moet u de eigenschap Sort van uw AdoDataset instellen (ADOQuery, AdoTable).

De eigenschap Sort is de breedste waarde die het "ORDER BY" -gedeelte van de standaard SQL-query aangeeft. Natuurlijk hoeft u de SQL-query niet te schrijven om de eigenschap Sort te kunnen gebruiken. Stel eenvoudigweg de eigenschap Sorteren in op de naam van een enkel veld of op een door komma's gescheiden lijst met velden, elk volgens de sorteervolgorde.

Hier is een voorbeeld:

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

De OnTitleClick-gebeurtenis van de DBGrid-component heeft een parameter Column die de kolom aangeeft waarop de gebruiker heeft geklikt. Elke kolom (object van het type TColumn) heeft een eigenschap Field die het veld (TField) aangeeft dat wordt vertegenwoordigd door de kolom en het veld in de eigenschap FieldName bevat de naam van het veld in de onderliggende gegevensset.

Daarom kan een eenvoudige regel worden gebruikt om een ​​ADO-gegevensset op veld / kolom te sorteren:

met TCustomADODataSet (DBGrid1.DataSource.DataSet) doen
Sorteren: = Column.Field.FieldName; // + 'ASC' of 'DESC'

Hieronder staat de code voor de OnTitleClick even-handler die de records sorteert op kolomklik. Zoals altijd breidt de code het idee uit.

Eerst willen we op een bepaalde manier de kolom markeren die momenteel wordt gebruikt voor de sorteervolgorde. Als we vervolgens op een kolomtitel klikken en de gegevensset al op die kolom is gesorteerd, willen we de sorteervolgorde wijzigen van ASC (oplopend) in DESC (aflopend) en vice versa. Als we ten slotte de gegevensset op een andere kolom sorteren, willen we het teken uit de eerder geselecteerde kolom verwijderen.

Om de kolom die de records "sorteert" te markeren, zullen we voor de eenvoud de lettertypestijl van de kolomtitel wijzigen in Vet en deze verwijderen wanneer de gegevensset is gesorteerd met een andere kolom.

procedure TForm1.DBGrid1TitleClick (kolom: TColumn);
$ J +const VorigeColumnIndex: geheel getal = -1;
$ J-
beginif DBGrid1.DataSource.DataSet is TCustomADODataSet thenwith TCustomADODataSet (DBGrid1.DataSource.DataSet) dobegintry
DBGrid1.Columns [VorigeColumnIndex] .title.Font.Style: =
DBGrid1.Columns [PreviousColumnIndex] .title.Font.Style - [fsBold];
exceptend;
Column.title.Font.Style: =
Column.title.Font.Style + [fsBold];
VorigeColumnIndex: = Column.Index;
als (Pos (Column.Field.FieldName, Sort) = 1)
en (Pos ('DESC', Sort) = 0) vervolgens
Sorteren: = Column.Field.FieldName + 'DESC'
anders
Sorteren: = Column.Field.FieldName + 'ASC';
einde;
einde;

De bovenstaande code gebruikt getypte constanten om de waarde van de eerder "geselecteerde" kolom voor sorteervolgorde te behouden.