Ustvarite in prilagodite gumbe z DBNavigatorjem

"Ok, DBNavigator opravlja svojo nalogo krmarjenja podatkov in upravljanja zapisov. Žal moje stranke želijo uporabnikom bolj prijazno izkušnjo, na primer grafiko gumbov in napisov po meri,... "

To vprašanje je prišlo od Razvijalec Delphi iskanje načina za povečanje moči komponente DBNavigator.

DBNavigator je odlična komponenta - ponuja VCR podoben vmesnik za krmarjenje po podatkih in upravljanje zapisov v aplikacijah baz podatkov. Navigacija po snemanju omogoča gumbe Prva, Naslednja, Predhodna in Zadnja. Upravljanje zapisov omogočajo gumbi Uredi, Objavi, Prekliči, Zbriši, Vstavi in ​​Osveži. V eni komponenti Delphi zagotavlja vse, kar potrebujete za delovanje svojih podatkov.

Kot pa je navedel tudi avtor poizvedbe po e-pošti, DBNavigator nima nekaterih funkcij, kot so glifi po meri, napisi gumbov in druge.

Zmogljivejši DBNavigator

Številne komponente Delphi imajo uporabne lastnosti in metode, ki jih razvijalcu Delphi označijo nevidno ("zaščiteno"). Upajmo, da lahko za dostop do takšnih zaščitenih članov komponente uporabimo preprosto tehniko, imenovano "zaščiten kramp".

instagram viewer

Najprej boste dodali napis v vsak gumb DBNavigator, nato boste dodali grafiko po meri in na koncu boste omogočili OnMouseUp za vsak gumb.

Od "dolgočasnega" DBNavigatorja do katerega koli od:

  • Standardna grafika in napisi po meri
  • Samo napise
  • Grafika po meri in napise po meri

Let's Rock 'n' Roll

DBNavigator ima zaščiteno lastnost gumbov. Ta član je niz TNavButton, potomcev TSpeedButtona.

Ker vsak gumb v tej zaščiteni lastnini podeduje od TSpeedButton, če ga bomo dobili, bomo lahko delali s "standardnimi" lastnostmi TSpeedButton, kot so: Napis (niz, ki uporabniku identificira nadzor), Glyph (bitna slika, ki se prikaže na gumbu), postavitev (določa, kje se slika ali besedilo prikaže na gumb) ...

V enoti DBCtrls (kjer je definirano DBNavigator) "preberete", da je lastnost zaščitenih gumbov deklarirana kot:

Gumbi: matrika[TNavigateBtn] od TNavButton;

Če TNavButton podeduje od TSpeedButton, TNavigateBtn pa je naštevanje, opredeljeno kot:

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

Upoštevajte, da ima TNavigateBtn 10 vrednosti, pri čemer vsak identificira drugačen gumb na TDBNavigator predmetu. Zdaj pa poglejmo, kako vstaviti DBNavigator:

Izboljšan DBNavigator

Najprej nastavite preprost obrazec za urejanje podatkov Delphi tako, da vstavite vsaj DBNavigator, a DBGrid, DataSoure in a Predmet nabora podatkov po vaši izbiri (ADO, BDE, dbExpres, ...). Prepričajte se, da so vse komponente "povezane".

Drugič, vstavite DBNavigator tako, da nad izjavo obrazca določite podedovani razred "lutka", kot:

tip THackDBNavigator = razred(TDBNavigator);
tip
TForm1 = razred(TForm)
...

Nato boste morali prikazovati napise in grafike po meri na vsakem gumbu DBNavigator, zato jih morate nastaviti glifi. Uporabite lahko komponento TImageList in dodelite 10 slik (.bmp ali .ico), od katerih vsaka predstavlja dejanje določenega gumba DBNavigator.

Tretjič, v OnCreate dogodek za Form1 dodajte klic kot:

postopek TForm1.FormCreate (Pošiljatelj: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
konec;

Prepričajte se, da dodate izjavo tega postopka v zasebnem delu izjave obrazca, na primer:

tip
TForm1 = razred(TForm)
...
zasebni postopek SetupHackedNavigator (konst Navigator: TDBNavigator;
konst Glifi: TImageList);
...

Četrtič, dodajte postopek SetupHackedNavigator. Postopek SetupHackedNavigator vsakemu gumbu doda grafiko po meri in vsakemu gumbu dodeli napis.

uporablja Gumbi; //!!! ne pozabi
postopek TForm1.SetupHackedNavigator
(konst Navigator: TDBNavigator;
konst Glifi: TImageList);
konst
Napisi: matrika[TNavigateBtn] od niza =
("Začetno", "Prejšnje", "Kasneje", "Končno", "Dodaj",
'Zbriši', 'Pravilno', 'Pošlji', 'Umik', 'Poživi');
(*
Napisi: matrika [TNavigateBtn] niza =
('Prva', 'Predhodna', 'Naprej', 'Zadnja', 'Vstavi',
'Delete', 'Edit', 'Objavi', 'Cancel', 'Refresh');

na Hrvaškem (lokalizirano):
Napisi: matrika [TNavigateBtn] niza =
('Prvi', 'Prejšnji', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
startfor btn: = nizka (TNavigateBtn) do Visoka (TNavigateBtn) naredi z THackDBNavigator (Navigator). Gumbi [btn] dobegin// iz matrike const napisov
Napis: = napisi [btn];
// število slik v lastnosti Glyph
NumGlifi: = 1;
// Odstranite stari glif.
Glif: = nič;
// Dodeli po meri
Glifi. GetBitmap (Integer (btn), Glyph);
// gilf nad besedilom
Postavitev: = blGlyphTop;
// razloženo pozneje
OnMouseUp: = HackNavMouseUp;
konec;
konec; (* SetupHackedNavigator *)

Ok, razložimo. Ponovite vse gumbe v DBNavigatorju. Spomnimo se, da je vsak gumb dostopen iz zaščitene lastnosti matrične tipke - torej potreba po razredu THackDBNavigator. Ker je tip matrične tipke TNavigateBtn, greste iz "prvega" (z uporabo Nizka funkcijo) tipko do "zadnjega" (z uporabo Visoka funkcijo) eno. Za vsak gumb preprosto odstranite "stari" glif, dodelite novega (iz parametra Glyphs), dodate napis iz matrike Captions in označite postavitev glifa.

Upoštevajte, da lahko prek lastnosti VisibleButtons nadzorujete, katere gumbe prikazuje DBNavigator (ne tisti, ki jih krasi). Druga lastnost, katere privzeto vrednost boste morda želeli spremeniti, so Namigi - z njo uporabite namigi za pomoč, ki jih izberete za posamezni gumb za krmarjenje. Prikaz namigov lahko nadzorujete z urejanjem lastnosti ShowHints.

To je to. Zato ste izbrali Delphi!

Daj mi več!

Zakaj bi se ustavili tukaj? Veste, da ko kliknete gumb 'nbNext', trenutni položaj nabora podatkov preide na naslednji zapis. Kaj, če želite premakniti, recimo, 5 zapisov naprej, če uporabnik med pritiskom na gumb drži tipko CTRL? Kaj pa to?

"Standardni" DBNavigator nima dogodka OnMouseUp - tistega, ki nosi parameter Shift TShiftState -, ki bi vam omogočil preizkus stanja tipk Alt, Ctrl in Shift. DBNavigator ponuja samo dogodek OnClick, ki ga lahko upravljate.

Vendar lahko THackDBNavigator preprosto izpostavi dogodek OnMouseUp in vam omogoči, da ob kliku "vidite" stanje nadzornih tipk in celo položaj kazalca nad določenim gumbom!

Ctrl + klik: = 5 vrstic naprej

Če želite izpostaviti OnMouseUp, preprosto dodelite svoj postopek ravnanja z dogodki po meri dogodku OnMouseUp za gumb vdrtega DBNavigatorja. Točno je že storjeno v postopku SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Zdaj bi lahko postopek HackNavMouseUp izgledal tako:

postopek TForm1.HackNavMouseUp
(Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
konst MoveBy: celo število = 5;
beginifNE (Pošiljatelj je TNavButton) torej Izhod;
Ovitek TNavButton (pošiljatelj) .Index od
nbPrior:
če (ssCtrl v Shift) torej
TDBNavigator (TNavButton (pošiljatelj) .Parent).
Vir podatkov. DataSet. MoveBy (-MoveBy);
nbNaslednje:
če (ssCtrl v Shift) torej
TDBNavigator (TNavButton (pošiljatelj) .Parent).
Vir podatkov. DataSet. MoveBy (MoveBy);
konec;
konec; (* HackNavMouseUp *)

Upoštevajte, da morate v zasebni del izjave obrazca (blizu izjave postopka SetupHackedNavigator) dodati podpis postopka HackNavMouseUp:

tip
TForm1 = razred(TForm)
...
zasebni postopek SetupHackedNavigator (konst Navigator: TDBNavigator;
konst Glifi: TImageList);
postopek HackNavMouseUp (Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
...

Ok, razložimo še enkrat. Postopek HackNavMouseUp obravnava dogodek OnMouseUp za vsak gumb DBNavigator. Če uporabnik med pritiskom na gumb nbNext drži tipko CTRL, se trenutni zapis za povezani nabor podatkov premakne "MoveBy" (opredeljen kot konstanten z vrednostjo 5).

Kaj? Prekomplicirano?

Ja. Z vsem tem se vam ni treba zmešati, če morate le preveriti stanje nadzornih tipk, ko ste kliknili gumb. Takole lahko naredite enako v "običajnem" Dogodek OnClick "navadnega" DBNavigatorja:

postopek TForm1.DBNavigator1Click
(Pošiljatelj: TObject; Gumb: TNavigateBtn);
funkcijo CtrlDown: Boolean;
var
Stanje: TKeyboardState;
začeti
GetKeyboardState (država);
Rezultat: = ((stanje [vk_Control] in 128) 0);
konec;
konst MoveBy: celo število = 5;
začetnica Gumb od
nbPrior:
če CtrlDown torej
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNaslednje:
če CtrlDown torej
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
konec; //case
konec; (* DBNavigator2Click *)

To so vsi ljudje

In končno je projekt končan. Ali pa lahko nadaljujete. Tukaj je scenarij / naloga / ideja za vas:

Recimo, da želite samo en gumb zamenjati gumbe nbFirst, nbPrevious, nbNext in nbLast. Lahko uporabite parametre X in Y znotraj postopka HackNavMouseUp, da poiščete položaj kurzorja ob sprostitvi gumba. Zdaj lahko na ta en gumb ("da jih vsem vladam") priložite sliko s 4 območji, vsako območje pa naj bi posnemalo enega od gumbov, ki jih nadomeščate... imaš smisel?