Opret og tilpas knapper med DBNavigator

click fraud protection

”Ok, DBNavigator gør sit job med at navigere i data og administrere poster. Desværre ønsker mine kunder en mere brugervenlig oplevelse, som brugerdefineret knapgrafik og billedtekst,... "

Denne forespørgsel kom fra a Delphi-udvikler søger efter en måde at forbedre kraften i DBNavigator-komponenten.

DBNavigator er en fantastisk komponent - den giver en VCR-lignende interface til at navigere i data og styre poster i databaseapplikationer. Record navigation leveres af knapperne First, Next, Prior og Last. Optagestyring leveres af knapperne Rediger, Indsæt, Annuller, Slet, Indsæt og Opdater. I en komponent leverer Delphi alt hvad du har brug for, til at betjene dine data.

Som forfatteren af ​​e-mail-undersøgelsen også sagde, mangler DBNavigator nogle funktioner som brugerdefinerede glyfer, knappetekster og andre.

En mere kraftfuld DBNavigator

Mange Delphi-komponenter har nyttige egenskaber og metoder, der er markeret usynlige ("beskyttet") for en Delphi-udvikler. Forhåbentlig, til at få adgang til sådanne beskyttede medlemmer af en komponent, kan en simpel teknik kaldet "beskyttet hack" bruges.

instagram viewer

Først tilføjer du en billedtekst til hver DBNavigator-knap, derefter tilføjer du brugerdefineret grafik, og til sidst aktiverer du OnMouseUp hver knap.

Fra den "kedelige" DBNavigator til en af:

  • Standard grafik og brugerdefinerede billedtekster
  • Kun billedtekster
  • Tilpasset grafik og brugerdefinerede billedtekster

Lad os rocke 'n' roll

DBNavigator har en beskyttet knapsejendom. Dette medlem er en række TNavButton, en efterkommer af TSpeedButton.

Da hver knap i denne beskyttede ejendom arver fra TSpeedButton, hvis du får fat i det, vil du være i stand til at arbejde med "standard" TSpeedButton egenskaber som: Billedtekst (en streng, der identificerer kontrollen til brugeren), Glyph (bitmap, der vises på knappen), Layout (bestemmer hvor billedet eller teksten vises på knap)...

Fra DBCtrls-enheden (hvor DBNavigator er defineret) "læser" du, at den beskyttede knapper-egenskab er erklæret som:

Knapper: matrix[TNavigateBtn] af TNavButton;

Hvor TNavButton arver fra TSpeedButton og TNavigateBtn er en opregning, defineret som:

TNavigateBtn = 
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);

Bemærk, at TNavigateBtn har 10 værdier, der hver identificerer forskellige knapper på et TDBNavigator-objekt. Lad os nu se, hvordan du hacker en DBNavigator:

Forbedret DBNavigator

Indstil først en simpel dataredigeringsdelphi-form ved mindst at placere en DBNavigator, en DBGrid, en DataSoure og en Datasæt-objekt efter dit valg (ADO, BDE, dbExpres, ...). Sørg for, at alle komponenter er "tilsluttet".

For det andet, hack en DBNavigator ved at definere en arvet "dummy" -klasse over formularerklæringen, som:

type THackDBNavigator = klasse(TDBNavigator);
type
TForm1 = klasse(TForm)
...

For at kunne vise brugerdefinerede billedtekster og grafik på hver DBNavigator-knap skal du konfigurere nogle glyffer. Du kan bruge TImageList-komponenten og tildele 10 billeder (.bmp eller .ico), der hver repræsenterer en handling for en bestemt knap i en DBNavigator.

For det tredje i OnCreate-begivenhed til Form1, tilføj et opkald som:

procedure TForm1.FormCreate (Afsender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
ende;

Sørg for at tilføje erklæringen for denne procedure i den private del af formularerklæringen, som:

type
TForm1 = klasse(TForm)
...
privateprocedure SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphs: TImageList);
...

For det fjerde skal du tilføje SetupHackedNavigator-proceduren. SetupHackedNavigator-proceduren tilføjer tilpasset grafik til hver knap og tildeler en brugerdefineret billedtekst til hver knap.

anvendelser Knapper; //!!! glem ikke
procedure TForm1.SetupHackedNavigator
(const Navigator: TDBNavigator;
const Glyphs: TImageList);
const
Billedtekster: matrix[TNavigateBtn] af streng =
('Initial', 'Forrige', 'Senere', 'Endelig', 'Tilføj',
'Slet', 'Korrekt', 'Send', 'Tilbagetræk', 'Genoplive');
(*
Billedtekster: array [TNavigateBtn] of string =
('Første', 'Forud', 'Næste', 'Sidste', 'Indsæt',
'Slet', 'Rediger', 'Send', 'Annuller', 'Opdater');

i Kroatien (lokaliseret):
Billedtekster: array [TNavigateBtn] of string =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
Var
btn: TNavigateBtn;
beginfor btn: = Lav (TNavigateBtn) til Høj (TNavigateBtn) gøre med THackDBNavigator (Navigator) .Knapper [btn] dobegin// fra billedtekstens konst array
Billedtekst: = Billedtekster [btn];
// antallet af billeder i egenskaben Glyph
NumGlyphs: = 1;
// Fjern den gamle glyph.
Glyph: = nul;
// Tildel den tilpassede
Glyffer. GetBitmap (heltal (btn), Glyph);
// gylph ovenfor tekst
Layout: = blGlyphTop;
// forklaret senere
OnMouseUp: = HackNavMouseUp;
ende;
ende; (* SetupHackedNavigator *)

Ok, lad os forklare. Du itererer gennem alle knapperne i DBNavigator. Husk, at hver knap er tilgængelig fra den beskyttede knappe-array-egenskab - derfor behovet for THackDBNavigator-klassen. Da typen af ​​knapper array er TNavigateBtn, går du fra den "første" (ved hjælp af Lav funktion) -knappen til "sidste" (ved hjælp af Høj funktion) en. For hver knap fjerner du simpelthen den "gamle" glyph, tildeler den nye (fra Glyphs-parameteren), tilføjer billedtekst fra billedtekst-arrayet og markerer layout for glyph.

Bemærk, at du kan kontrollere, hvilke knapper der vises af en DBNavigator (ikke den hacket) gennem dens VisibleButtons-egenskab. En anden egenskab, hvis standardværdi du muligvis vil ændre, er Tip - brug den til at levere Hjælp-tip, du vælger for den enkelte navigatorknap. Du kan kontrollere visningen af ​​tip ved at redigere egenskaben ShowHints.

Det er det. Dette er grunden til, at du har valgt Delphi!

Giv mig mere!

Hvorfor stoppe her? Du ved, at når du klikker på 'nbNæste' -knappen, er datasætets aktuelle position fremskrevet til næste post. Hvad hvis du vil flytte, lad os sige, 5 poster fremad, hvis brugeren holder CTRL-tasten, mens han trykker på knappen? Hvad med det?

Den "standard" DBNavigator har ikke OnMouseUp-hændelsen - den, der bærer Shift-parameteren i TShiftState - hvilket gør det muligt for dig at teste tilstanden Alt, Ctrl og Shift. DBNavigator leverer kun OnClick-begivenheden, som du kan håndtere.

THackDBNavigator kan imidlertid blot eksponere OnMouseUp-begivenheden og give dig mulighed for at "se" status på kontroltasterne og endda placeringen af ​​markøren over den bestemte knap, når du klikker!

Ctrl + Klik: = 5 rader foran

For at afsløre OnMouseUp tildeler du simpelthen din brugerdefinerede begivenhedshåndteringsprocedure til OnMouseUp-hændelsen til knappen på den hacket DBNavigator. Dette er nøjagtigt allerede gjort i SetupHackedNavigator-proceduren:
OnMouseUp: = HackNavMouseUp;

Nu kan HackNavMouseUp-proceduren se ud:

procedure TForm1.HackNavMouseUp
(Afsender: TObject; Knap: TMouseButton;
Skift: TShiftState; X, Y: heltal);
const MoveBy: heltal = 5;
beginifIKKE (Afsender er TNavButton) derefter Afslut;
sag TNavButton (Afsender) .Index af
nbPrior:
hvis (ssCtrl i Shift) derefter
TDBNavigator (TNavButton (afsender). Forælder).
Datakilde. DataSet. MoveBy (-MoveBy);
nbNext:
hvis (ssCtrl i Shift) derefter
TDBNavigator (TNavButton (afsender). Forælder).
Datakilde. DataSet. MoveBy (MoveBy);
ende;
ende(* HackNavMouseUp *)

Bemærk, at du skal tilføje underskriften på HackNavMouseUp-proceduren i den private del af formularerklæringen (nær erklæringen fra SetupHackedNavigator-proceduren):

type
TForm1 = klasse(TForm)
...
privateprocedure SetupHackedNavigator (const Navigator: TDBNavigator;
const Glyphs: TImageList);
procedure HackNavMouseUp (Afsender: TObject; Knap: TMouseButton;
Skift: TShiftState; X, Y: heltal);
...

Ok, lad os forklare endnu en gang. HackNavMouseUp-proceduren håndterer OnMouseUp-hændelsen for hver DBNavigator-knap. Hvis brugeren holder CTRL-tasten, mens han klikker på nbNæste-knappen, flyttes den aktuelle post for det tilknyttede datasæt "MoveBy" (defineret som konstant med værdien på 5) poster fremad.

Hvad? Kompliceret?

Yep. Du behøver ikke rod med alt dette, hvis du kun behøver at kontrollere tilstanden af ​​kontroltasterne, når der blev klikket på knappen. Sådan gør du det samme i den "almindelige" OnClick-begivenhed af den "almindelige" DBNavigator:

procedure TForm1.DBNavigator1Click
(Afsender: TObject; Knap: TNavigateBtn);
fungere CtrlDown: Boolean;
Var
Stat: TKeyboardState;
begynde
GetKeyboardState (stat);
Resultat: = ((tilstand [vk_Control] og 128) 0);
ende;
const MoveBy: heltal = 5;
begincase Knap af
nbPrior:
hvis CtrlDown derefter
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
hvis CtrlDown derefter
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
ende; //case
ende(* DBNavigator2Click *)

Det var alt folkens

Og til sidst er projektet færdigt. Eller du kan fortsætte. Her er et scenarie / opgave / idé til dig:

Lad os sige, at du kun vil have en knap til at erstatte knapperne nbFirst, nbPrevious, nbNext og nbLast. Du kan bruge X- og Y-parametrene i HackNavMouseUp-proceduren til at finde placeringen af ​​markøren, når knappen blev frigivet. Til denne ene knap ("for at styre dem alle") kan du nu vedhæfte et billede, der har 4 områder, hvert område antager at efterligne en af ​​de knapper, du udskifter... har du pointen?

instagram story viewer