So sortieren Sie Datensätze in Delphi DBGrid

Delphi DBGrid ist eine so leistungsstarke Komponente, dass Sie sie wahrscheinlich jeden Tag verwenden, wenn Sie datenbewusste Anwendungen entwickeln. Im Folgenden erfahren Sie, wie Sie Ihren Datenbankanwendungen einige weitere Funktionen hinzufügen, die Ihre Benutzer sicher lieben werden.

In Anlehnung an die im Handbuch für Anfänger zur Delphi-Datenbankprogrammierung beschriebenen Konzepte werden in den folgenden Beispielen ADO-Komponenten (AdoQuery / AdoTable mit ADOConnection verbunden, DBGrid mit AdoQuery über DataSource verbunden) verwendet, um die Datensätze aus einer Datenbanktabelle in einer DBGrid-Komponente anzuzeigen.

Alle Komponentennamen wurden so belassen, wie Delphi sie beim Ablegen im Formular benannt hat (DBGrid1, ADOQuery1, AdoTable1 usw.)..

Maus bewegt sich über DBGrid-Titelbereich

Lassen Sie uns zunächst sehen, wie Sie den Mauszeiger ändern, während er sich über den DBGrid-Titelbereich bewegt. Sie müssen lediglich den Code zum OnMouseMove-Ereignis für die DBGrid-Komponente hinzufügen.

Der folgende Code verwendet einfach die MouseCoord-Eigenschaft der DBGrid-Komponente, um zu "berechnen", wo sich der Mauszeiger befindet. Wenn es sich über dem DGBrid-Titelbereich befindet, ist pt.y gleich 0, was die erste Zeile im DBGrid ist (der Titelbereich, in dem Spalten- / Feldtitel angezeigt werden)..

Verfahren TForm1.DBGrid1MouseMove
(Absender: TObject; Shift: TShiftState; X, Y: Integer);
var
pt: TGridcoord;
Start
pt: = DBGrid1.MouseCoord (x, y);
wenn pt.y = 0 dann
DBGrid1.Cursor: = crHandPoint
sonst
DBGrid1.Cursor: = crDefault;
Ende;

Nach Spalte sortieren Klicken Sie auf und ändern Sie die Schriftart für den Spaltentitel

Wenn Sie den ADO-Ansatz für die Delphi-Datenbankentwicklung verwenden und die Datensätze im Dataset sortieren möchten, müssen Sie die Sort-Eigenschaft Ihres AdoDataset (ADOQuery, AdoTable) festlegen..

Die Sort-Eigenschaft ist der breiteste Wert, der den "ORDER BY" -Teil der Standard-SQL-Abfrage angibt. Natürlich müssen Sie die SQL-Abfrage nicht schreiben, um die Sort-Eigenschaft verwenden zu können. Legen Sie einfach die Sortiereigenschaft auf den Namen eines einzelnen Felds oder auf eine durch Kommas getrennte Liste von Feldern fest, die jeweils der Sortierreihenfolge folgen.

Hier ist ein Beispiel:

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

Das OnTitleClick-Ereignis der DBGrid-Komponente verfügt über einen Column-Parameter, der die Spalte angibt, auf die der Benutzer geklickt hat. Jede Spalte (Objekt vom Typ TColumn) verfügt über eine Feldeigenschaft, die das von der Spalte dargestellte Feld (TField) angibt, und das Feld in seiner Eigenschaft FieldName enthält den Namen des Felds im zugrunde liegenden Dataset.

Um ein ADO-Dataset nach Feld / Spalte zu sortieren, kann daher eine einfache Zeile verwendet werden:

mit TCustomADODataSet (DBGrid1.DataSource.DataSet) ausführen
Sortieren: = Column.Field.FieldName; // + 'ASC' oder 'DESC'

Unten ist der Code für den OnTitleClick-Even-Handler, der die Datensätze nach Spaltenklick sortiert. Der Code erweitert wie immer die Idee.

Zunächst möchten wir auf irgendeine Weise die Spalte markieren, die derzeit für die Sortierreihenfolge verwendet wird. Wenn Sie auf einen Spaltentitel klicken und der Datensatz bereits nach dieser Spalte sortiert ist, möchten Sie die Sortierreihenfolge von ASC (aufsteigend) in DESC (absteigend) und umgekehrt ändern. Wenn wir schließlich den Datensatz nach einer anderen Spalte sortieren, möchten wir die Markierung aus der zuvor ausgewählten Spalte entfernen.

Um der Einfachheit halber die Spalte zu markieren, die die Datensätze "sortiert", ändern wir einfach den Schriftstil des Spaltentitels in Fett und entfernen ihn, wenn das Dataset nach einer anderen Spalte sortiert wird.

Verfahren TForm1.DBGrid1TitleClick (Spalte: TColumn);
$ J +const PreviousColumnIndex: integer = -1;
$ J-
beginif DBGrid1.DataSource.DataSet ist TCustomADODataSet dann mit TCustomADODataSet (DBGrid1.DataSource.DataSet) Dobegintrie
DBGrid1.Columns [PreviousColumnIndex] .title.Font.Style: =
DBGrid1.Columns [PreviousColumnIndex] .title.Font.Style - [fsBold];
Ausnahme;
Column.title.Font.Style: =
Column.title.Font.Style + [fsBold];
PreviousColumnIndex: = Column.Index;
wenn (Pos (Column.Field.FieldName, Sort) = 1)
und (Pos ('DESC', Sort) = 0) dann
Sortieren: = Column.Field.FieldName + 'DESC'
sonst
Sortieren: = Column.Field.FieldName + 'ASC';
Ende;
Ende;

Der obige Code verwendet typisierte Konstanten, um den Wert der zuvor "ausgewählten" Spalte für die Sortierreihenfolge beizubehalten.