Een rij in een DBGrid selecteren en markeren

Heb je ooit een menu- of tabelkolom of rij met een andere kleur gemarkeerd zien wanneer je muis erover zweeft? Dat is wat ons doel is: een rij laten uitlichten wanneer de muisaanwijzer binnen bereik is.

De TDBGrid Delphi-component is een van de juwelen van de VCL. Ontworpen om een ​​gebruiker in staat te stellen gegevens in een tabelraster te bekijken en te bewerken, biedt de DBGrid verschillende manieren om de manier aan te passen waarop het zijn eigen gegevens weergeeft. Als u bijvoorbeeld kleur toevoegt aan uw databaseroosters, wordt het uiterlijk verbeterd en wordt het belang van bepaalde rijen of kolommen in de database onderscheiden.

Laat u echter niet misleiden door te simplistische tutorials over dit onderwerp. Het lijkt misschien eenvoudig genoeg om de dgRowSelect eigendom, maar onthoud dat wanneer dgRowSelect is opgenomen in opties, de dgEditing vlag wordt genegeerd, wat betekent dat het bewerken van de gegevens met behulp van het raster is uitgeschakeld.

Hieronder vindt u een uitleg over het inschakelen van OnMouseOver type gebeurtenis voor een DBGrid-rij, zodat de muis wordt opgenomen en gelokaliseerd, waardoor het record actief wordt om de overeenkomstige rij in een DBGrid te markeren.

Hoe te werken met OnMouseOver- en Delphi-componenten

De eerste opdracht is het schrijven van code voor de onMouseMove gebeurtenis in een TDBGrid-component zodat deze de rij en kolom (cel) van de DBGrid kan lokaliseren waar de muis over zweeft.

Als de muis zich boven het rooster bevindt (verwerkt in de onMouseMove event handler), kunt u de moveBy methode van een DataSet-component om het huidige record in te stellen op het record dat "onder" de muiscursor wordt weergegeven.

type THackDBGrid = klasse(TDBGrid);
...
procedure TForm1.DBGrid1MouseMove
(Afzender: TObject; Shift: TShiftState; X, Y: geheel getal);
var
gc: TGridCoord;
beginnen
gc: = DBGrid1.MouseCoord (x, y);
als (gc.X> 0) EN (gc.Y> 0) thenbegin
DBGrid1.DataSource.DataSet.MoveBy
(gc.Y - THackDBGrid (DBGrid1) .Row);
einde;
einde;

Soortgelijke code kan worden gebruikt om aan te geven op welke cel de muisaanwijzer staat en om de cursor te wijzigen wanneer deze zich boven de titelbalk bevindt.

Om het actieve record correct in te stellen, moet je een DBGrid hacken en de beschermde handen in handen krijgen Rij eigendom. De Rij eigendom van een TCustomDBGrid component bevat de verwijzing naar de momenteel actieve rij.

Veel Delphi-componenten hebben nuttige eigenschappen en methoden die voor een Delphi-ontwikkelaar als onzichtbaar of beschermd zijn gemarkeerd. Hopelijk kan, om toegang te krijgen tot dergelijke beschermde leden van een component, een eenvoudige techniek genaamd de "beschermde hack" worden gebruikt.

Met de bovenstaande code, wanneer u de muis over het raster beweegt, is het geselecteerde record degene die wordt weergegeven in het raster "onder" de muiscursor. U hoeft niet op het raster te klikken om het huidige record te wijzigen.

Laat de actieve rij markeren om de gebruikerservaring te verbeteren:

procedure TForm1.DBGrid1DrawColumnCell
(Afzender: TObject; const Rect: TRect; DataCol: Integer;
Kolom: TColumn; Staat: TGridDrawState);
beginif (THackDBGrid (DBGrid1) .DataLink.ActiveRecord + 1 =
THackDBGrid (DBGrid1) .Row)
of (gdFocused in State) of (gd Geselecteerd in staat) thenbegin
DBGrid1.Canvas.Brush.Color: = clSkyBlue;
DBGrid1.Canvas.Font.Style: = DBGrid1.Canvas.Font.Style + [fsBold];
DBGrid1.Canvas.Font.Color: = clRed;
einde;
einde;

De OnDrawColumnCell gebeurtenis wordt gebruikt om de behoefte aan een aangepaste tekening voor de gegevens in de cellen van het raster af te handelen.

U kunt een kleine truc gebruiken om de geselecteerde rij te onderscheiden van alle andere rijen. Overweeg dat de Rij eigenschap (geheel getal) is gelijk aan de ActiveRecord (+1) eigendom van de DataLink object dat de geselecteerde rij gaat schilderen.

U wilt dit gedrag waarschijnlijk uitschakelen (de moveBy methode in onMouseMove event handler) wanneer DataSet verbonden met een DBGrid is binnen Bewerk of invoegen mode.