Auswählen und Markieren einer Zeile in einem DBGrid

Haben Sie jemals eine Menü- oder Tabellenspalte oder -zeile in einer anderen Farbe hervorgehoben gesehen, wenn Sie mit der Maus darüber gefahren sind? Genau das ist unser Ziel: Wenn sich der Mauszeiger in Reichweite befindet, soll eine Zeile hervorgehoben werden.

Die TDBGrid Delphi-Komponente ist eines der Juwelen der VCL. DBGrid wurde entwickelt, um Benutzern das Anzeigen und Bearbeiten von Daten in einem Tabellenraster zu ermöglichen. Es bietet verschiedene Möglichkeiten zum Anpassen der Darstellung der eigenen Daten. Wenn Sie beispielsweise Ihren Datenbankrastern Farben hinzufügen, wird das Erscheinungsbild verbessert und die Wichtigkeit bestimmter Zeilen oder Spalten in der Datenbank differenziert.

Lassen Sie sich jedoch nicht von zu simplen Tutorials zu diesem Thema täuschen. Es mag einfach genug erscheinen, nur das zu setzen dgRowSelect Eigentum, aber denken Sie daran, wenn dgRowSelect ist enthalten in Optionen, das dgEditing flag wird ignoriert, was bedeutet, dass das Bearbeiten der Daten mithilfe des Rasters deaktiviert ist.

Was Sie unten finden, ist eine Erklärung, wie Sie das aktivieren OnMouseOver Ereignistyp für eine DBGrid-Zeile, sodass die Maus aufgezeichnet und lokalisiert wird, wodurch der Datensatz aktiviert wird, um die entsprechende Zeile in einem DBGrid hervorzuheben.

Arbeiten mit OnMouseOver- und Delphi-Komponenten

Die erste Aufgabe ist das Schreiben von Code für die OnMouseMove Ereignis in einer TDBGrid-Komponente, damit sie die Zeile und Spalte (Zelle) des DBGrid finden kann, über die die Maus schwebt.

Befindet sich die Maus über dem Raster (wird im OnMouseMove Eventhandler), können Sie den MoveBy Methode einer DataSet-Komponente, um den aktuellen Datensatz auf den unter dem Mauszeiger angezeigten Datensatz zu setzen.

Art THackDBGrid = Klasse(TDBGrid);

Verfahren TForm1.DBGrid1MouseMove
(Absender: TObject; Shift: TShiftState; X, Y: Integer);
var
gc: TGridCoord;
Start
gc: = DBGrid1.MouseCoord (x, y);
wenn (gc.X> 0) UND (gc.Y> 0) dann fange an
DBGrid1.DataSource.DataSet.MoveBy
(gc.Y - THackDBGrid (DBGrid1) .Row);
Ende;
Ende;

Ein ähnlicher Code kann verwendet werden, um anzuzeigen, über welche Zelle sich die Maus befindet, und um den Cursor zu ändern, wenn er sich über der Titelleiste befindet.

Um den aktiven Datensatz korrekt festzulegen, müssen Sie ein DBGrid hacken und den geschützten Datensatz in die Hände bekommen Reihe Eigentum. Das Reihe Eigentum von a TCustomDBGrid Komponente enthält den Verweis auf die aktuell aktive Zeile.

Viele Delphi-Komponenten verfügen über nützliche Eigenschaften und Methoden, die für einen Delphi-Entwickler als unsichtbar oder geschützt gekennzeichnet sind. Um auf solche geschützten Elemente einer Komponente zuzugreifen, kann hoffentlich eine einfache Technik verwendet werden, die als "geschützter Hack" bezeichnet wird.

Wenn Sie mit dem Code über das Raster fahren, wird der ausgewählte Datensatz im Raster "unter" dem Mauszeiger angezeigt. Sie müssen nicht auf das Raster klicken, um den aktuellen Datensatz zu ändern.

Lassen Sie die aktive Zeile hervorheben, um die Benutzererfahrung zu verbessern:

Verfahren TForm1.DBGrid1DrawColumnCell
(Absender: TObject; const Rect: TRect; DataCol: Integer;
Spalte: TColumn; Zustand: TGridDrawState);
beginif (THackDBGrid (DBGrid1) .DataLink.ActiveRecord + 1 =
THackDBGrid (DBGrid1) .Row)
oder (gdFocused in State) oder (gdSelected in State) dann fange an
DBGrid1.Canvas.Brush.Color: = clSkyBlue;
DBGrid1.Canvas.Font.Style: = DBGrid1.Canvas.Font.Style + [fsBold];
DBGrid1.Canvas.Font.Color: = clRed;
Ende;
Ende;

Das OnDrawColumnCell event wird verwendet, um die Notwendigkeit einer benutzerdefinierten Zeichnung für die Daten in den Zellen des Rasters zu behandeln.

Mit einem kleinen Trick können Sie die ausgewählte Zeile von allen anderen Zeilen unterscheiden. Bedenken Sie, dass die Reihe property (integer) ist gleich Aktiver Rekord (+1) Eigentum der Datenverbindung Objekt, das die ausgewählte Zeile gezeichnet werden soll.

Möglicherweise möchten Sie dieses Verhalten deaktivieren (die MoveBy Methode in OnMouseMove Ereignishandler), wenn DataSet verbunden mit einem DBGrid ist in Bearbeiten oder Einfügen Modus.