Skapa en musfärgad markering med Delphi

Har du någonsin sett en meny- eller tabellkolumn eller radhöjdpunkt till en annan färg när musen svävar över den? Det är vad vårt mål är här: att få en rad att markeras när muspekaren är inom räckhåll.

TDBGrid Delphi-komponenten är en av juvelerna i VCL. DBGrid är utformad för att göra det möjligt för en användare att se och redigera data i ett tabellnät, och erbjuder olika sätt att anpassa hur det representerar sina egna data. Till exempel, lägga till färg till din databas rutnät kommer att förbättra utseendet och skilja vikten av vissa rader eller kolumner i databasen.

Låt dig dock inte luras av överförenklade tutorials om detta ämne. Det kan verka enkelt nog att bara ställa in dgRowSelect egendom, men kom ihåg att när dgRowSelect ingår i alternativ, dgEditing flaggan ignoreras, vilket innebär att redigering av data med rutnätet är inaktiverad.

Vad du hittar nedan är en förklaring om hur du aktiverar onMouseOver sorts händelse för en DBGrid-rad, så att musen spelas in och lokaliseras, vilket gör posten aktiv så att den markerar raden i en DBGrid.

instagram viewer

Hur man arbetar med OnMouseOver och Delphi-komponenter

Den första ordern är skriva kod för onMouseMove händelse i en TDBGrid-komponent så att den kan hitta DBGrids rad och kolumn (cell) som musen svävar över.

Om musen är över rutnätet (hanteras i onMouseMove event handler), kan du använda MoveBy metod för en DataSet-komponent för att ställa in den aktuella posten till den som visas "nedanför" muspekaren.

typ THackDBGrid = klass(TDBGrid);
...
procedur TForm1.DBGrid1MouseMove
(Avsändare: TObject; Skift: TShiftState; X, Y: heltal);
var
gc: TGridCoord;
Börja
gc: = DBGrid1.MouseCoord (x, y);
om (Gc. X> 0) OCH (Gc. Y> 0) thenbegin
DBGrid1.DataSource. DataSet. MoveBy
(Gc. Y - THackDBGrid (DBGrid1). Rad);
slutet;
slutet;

Liknande kod kan användas för att visa vilken cell musen svävar över och för att ändra markören när den är över titelraden.

För att korrekt sätta den aktiva posten måste du hacka en DBGrid och få händerna på det skyddade Rad fast egendom. De Rad egendom hos a TCustomDBGrid komponenten har referensen till den nuvarande aktiva raden.

Många Delphi-komponenter har användbara egenskaper och metoder som är markerade osynliga eller skyddade för en Delphi-utvecklare. Förhoppningsvis, för att få tillgång till sådana skyddade medlemmar av en komponent, kan en enkel teknik som kallas "skyddad hack" användas.

Med koden ovan, när du flyttar musen över rutnätet, är den valda posten den som visas i rutnätet "nedanför" muspekaren. Du behöver inte klicka på rutnätet för att ändra den aktuella posten.

Låt den aktiva raden markeras för att förbättra användarens upplevelse:

procedur TForm1.DBGrid1DrawColumnCell
(Avsändare: TObject; const Rect: TRect; DataCol: heltal;
Kolumn: TColumn; Tillstånd: TGridDrawState);
beginif (THackDBGrid (DBGrid1) .DataLink. ActiveRecord + 1 =
THackDBGrid (DBGrid1). Rad)
eller (gdFokuserad i staten) eller (gdValt i stat) thenbegin
DBGrid1.Canvas. Borsta. Färg: = clSkyBlue;
DBGrid1.Canvas. Font. Stil: = DBGrid1.Canvas. Font. Style + [fsFet];
DBGrid1.Canvas. Font. Färg: = clRed;
slutet;
slutet;

De OnDrawColumnCell händelse används för att hantera behovet av en anpassad ritning för data i cellerna i rutnätet.

Du kan använda ett litet trick för att skilja den valda raden från alla andra rader. Tänk på att Rad fast egendom (heltal) är lika med Active (+1) Data länk objekt att den valda raden är på väg att måla.

Du vill förmodligen inaktivera detta beteende ( MoveBy metod i onMouseMove händelsehanterare) när DataSet ansluten till en DBGrid är i Redigera eller Föra in läge.