Nuppude loomine ja kohandamine DBNavigatoriga

"Ok, DBNavigator teeb oma tööd andmete navigeerimisel ja dokumentide haldamisel. Kahjuks soovivad minu kliendid kasutajasõbralikumat kogemust, näiteks kohandatud nuppude graafikat ja pealdisi... "

See päring pärines a Delphi arendaja DBNavigatori komponendi võimsuse suurendamise viisi otsimine.

DBNavigator on suurepärane komponent - see pakub videomakilaadset liidest andmete navigeerimiseks ja kirjete haldamiseks andmebaasirakendustes. Kirjenavigeerimine toimub nuppude Esimene, Järgmine, Eelmine ja Viimane abil. Kirjehaldust pakuvad nupud Redigeerimine, Postitamine, Tühistamine, Kustutamine, Lisamine ja Värskendamine. Delphi pakub ühes komponendis kõike, mida vajate oma andmetega töötamiseks.

Nagu e-kirjapärimise autor ka väitis, puuduvad DBNavigatoril mõned funktsioonid, nagu kohandatud glüfid, nuppude pealdised ja muud.

Võimsam DBNavigator

Paljudel Delphi komponentidel on kasulikud omadused ja meetodid, mis on tähistatud Delphi arendajale nähtamatuks ("kaitstud"). Loodetavasti saab komponendi sellistele kaitstud liikmetele juurdepääsu saamiseks kasutada lihtsat tehnikat, mida nimetatakse kaitstud häkkimiseks.

instagram viewer

Esiteks lisate pealdise igale DBNavigatori nupule, seejärel lisate kohandatud graafika ja lõpuks lubate iga nupu OnMouseUp.

Alates "igavast" DBNavigatorist ühele järgmistest:

  • Tavaline graafika ja kohandatud pealdised
  • Ainult pealdised
  • Kohandatud graafika ja pealkirjad

Laske rokkida

DBNavigatoril on kaitstud nupud. See liige on TNpeButtoni massiivi, kes on TSpeedButtoni järeltulija.

Kuna selle kaitstud atribuudi kõik nupud pärivad TSpeedButtonilt, saate meie käsutuses olles töötada selliste "tavaliste" TSpeedButtoni omadustega nagu: Tiitrid (string, mis tuvastab kasutaja juhtelemendi), Glyph (nupul kuvatav bittkaart), Layout (määrab pildi või teksti kuvamiskoha nuppu) ...

Üksusest DBCtrls (kus DBNavigator on määratletud) "lugesite", et kaitstud nuppude omadus kuulutatakse järgmiselt:

Nupud: massiiv[TNavigateBtn] of TNavButton;

Kui TNavButton pärib TSpeedButtonilt ja TNavigateBtn on loend, mis on määratletud järgmiselt:

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

Pange tähele, et TNavigateBtn omab 10 väärtust, millest igaüks identifitseerib erineva nupu TDBNavigator objektil. Vaatame nüüd, kuidas hävitada DBNavigatorit:

Täiustatud DBNavigator

Esmalt seadke üles lihtne andmete redigeerimise vorm Delphi, pannes vähemalt DBNavigaatori, a DBGrid, DataSoure ja a Andmekogumi objekt teie valitud (ADO, BDE, dbExpres, ...). Veenduge, et kõik komponendid oleks "ühendatud".

Teiseks häkkida DBNavigatorit, määratledes vormideklaratsiooni kohal päriliku mannekeeni klassi, näiteks:

tüüp THackDBNavigator = klass(TDBNavigator);
tüüp
TForm1 = klass(TForm)
...

Järgmisena, et saaksite kuvada kohandatud pealdisi ja graafikaid igal DBNavigatori nupul, peate need seadistama glüüfid. Võite kasutada komponenti TImageList ja määrata 10 pilti (.bmp või .ico), millest igaüks tähistab DBNavigaatori konkreetse nupu toimingut.

Kolmandaks - OnCreate'i sündmus vormi 1 jaoks lisage kõne nagu:

protseduur TForm1.FormCreate (saatja: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
lõpp;

Lisage kindlasti selle protseduuri deklaratsioon vormi deklaratsiooni privaatsesse ossa, näiteks:

tüüp
TForm1 = klass(TForm)
...
eraprotsess SetupHackedNavigator (const Navigaator: TDBNavigator;
const Glüüfid: TImageList);
...

Neljandaks lisage protseduur SetupHackedNavigator. Protseduur SetupHackedNavigator lisab igale nupule kohandatud graafika ja määrab igale nupule kohandatud pealdise.

kasutab Nööbid; //!!! ära unusta
protseduur TForm1.SetupHackedNavigator
(const Navigaator: TDBNavigator;
const Glüüfid: TImageList);
const
Tiitrid: massiiv[TNavigateBtn] nöörist =
('Algne', 'Eelmine', 'Hiljem', 'Lõplik', 'Lisa',
'Kustuta', 'Õige', 'Saada', 'Loobu', 'Revive');
(*
Tiitrid: massiivi [TNavigateBtn] string =
('Esimene', 'Eelmine', 'Järgmine', 'Viimane', 'Lisa',
'Kustuta', 'Redigeeri', 'Postita', 'Tühista', 'Värskenda');

Horvaatias (lokaliseeritud):
Tiitrid: massiivi [TNavigateBtn] string =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
alustama btn: = madal (TNavigateBtn) kuni Kõrge (TNavigateBtn) dowith THackDBNavigator (Navigator) .Nupud [btn] dobegin// Captions const massiivist
Tiitrid: = Tiitrid [btn];
// piltide arv atribuudis Glyph
NumGlyphs: = 1;
// eemaldage vana glüüf.
Glüüf: = null;
// Määrake kohandatud
Glüüfid. GetBitmap (täisarv (btn), glüüf);
// gylph teksti kohal
Paigutus: = blGlyphTop;
// hiljem selgitatud
OnMouseUp: = HackNavMouseUp;
lõpp;
lõpp; (* SetupHackedNavigator *)

Ok, selgitame. Te itreerite läbi kõigi DBNavigatori nuppude. Tuletage meelde, et igale nupule pääseb juurde kaitstud nuppude massiivi atribuudilt - seega on vaja THackDBNavigatori klassi. Kuna nuppude massiivi tüüp on TNavigateBtn, lähete te esimesest peale (kasutades Madal funktsiooni) nuppu "viimasele" (kasutades Kõrge funktsioon) üks. Iga nupu jaoks eemaldate lihtsalt "vana" glüüfi, määrake uus (parameetrist Glyphs), lisage pealdis tiitrite massiivi ja märkige glüüfi paigutus.

Pange tähele, et atribuudi VisibleButtons kaudu saate kontrollida, milliseid nuppe DBNavigator (mitte häkkinud nuppu) kuvab. Veel üks omadus, mille vaikeväärtust võiksite muuta, on Hints (vihjed) - kasutage seda individuaalsete navigaatorinuppude jaoks valitud spikrinäpunäidete kuvamiseks. Vihjete kuvamist saate juhtida atribuudi ShowHints redigeerimisel.

See selleks. Seetõttu valisite Delphi!

Anna mulle veel!

Miks siin peatuda? Teate, et kui klõpsate nuppu nbNext, liigutatakse andmekogumi praegune asukoht järgmise kirje juurde. Mis siis, kui soovite liikuda, oletame, et 5 kirjet on ees, kui kasutaja hoiab nuppu vajutades CTRL-klahvi? Kuidas oleks?

"Standardsel" DBNavigatoril pole sündmust OnMouseUp - see, mis kannab TShiftState'i Shift parameetrit - mis võimaldab teil testida klahvide Alt, Ctrl ja Shift olekut. DBNavigator pakub teie käsutuses ainult OnClicki sündmust.

Kuid THackDBNavigator võib lihtsalt OnMouseUpi sündmuse paljastada ja võimaldab teil klõpsamisel "näha" juhtklahvide olekut ja isegi kursori asukohta konkreetse nupu kohal!

Ctrl + klõps: = 5 rida ülespoole

OnMouseUpi paljastamiseks määrake häkitud DBNavigatori nupule lihtsalt kohandatud sündmuste käitlemise protseduur OnMouseUpi sündmuse jaoks. Täpselt seda on juba tehtud ka SetupHackedNavigatori protseduuris:
OnMouseUp: = HackNavMouseUp;

Nüüd võiks HackNavMouseUp protseduur välja näha järgmiselt:

protseduur TForm1.HackNavMouseUp
(Saatja: TObject; Nupp: TMouseButton;
Shift: TShiftState; X, Y: täisarv);
const MoveBy: täisarv = 5;
algavMITTE (Saatja on TNavButton) siis Väljapääs;
juhtum TNavButton (saatja) .Index of
nbPrior:
kui (ssCtrl vahetuses) siis
TDBNavigator (TNavButton (saatja). Vanem).
Andmeallikas. DataSet. MoveBy (-MoveBy);
nbNext:
kui (ssCtrl vahetuses) siis
TDBNavigator (TNavButton (saatja). Vanem).
Andmeallikas. DataSet. MoveBy (MoveBy);
lõpp;
lõpp; (* HackNavMouseUp *)

Pange tähele, et peate vormideklaratsiooni privaatsesse ossa (protseduuri SetupHackedNavigator deklaratsiooni lähedal) lisama protseduuri HackNavMouseUp allkirja:

tüüp
TForm1 = klass(TForm)
...
eraprotsess SetupHackedNavigator (const Navigaator: TDBNavigator;
const Glüüfid: TImageList);
protseduur HackNavMouseUp (saatja: TObject; Nupp: TMouseButton;
Shift: TShiftState; X, Y: täisarv);
...

Ok, selgitame veel ühe korra. Protseduur HackNavMouseUp haldab OnMouseUp sündmust iga DBNavigatori nupu jaoks. Kui kasutaja hoiab all nuppu nbNext, klõpsates CTRL-klahvi, teisaldatakse lingitud andmestiku praegune kirje "MoveBy" (määratletud kui konstantne väärtusega 5).

Mida? Liialt keeruline?

Jep. Selle kõigega ei pea jama, kui peate kontrollklahvide olekut kontrollima ainult nupule klõpsamise ajal. Siit saate teada, kuidas sama teha tavalises OnClicki sündmus tavalise DBNavigaatori

protseduur TForm1.DBNavigator1Kliki
(Saatja: TObject; Nupp: TNavigateBtn);
funktsiooni CtrlDown: Boolean;
var
Olek: TKeyboardState;
alustada
GetKeyboardState (osariik);
Tulemus: = ((olek [vk_Control] ja 128) 0);
lõpp;
const MoveBy: täisarv = 5;
algustäht Nupp of
nbPrior:
kui CtrlDown siis
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
kui CtrlDown siis
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
lõpp; //case
lõpp; (* DBNavigator2Click *)

See on kõik

Ja lõpuks on projekt tehtud. Või võite jätkata. Siin on teile stsenaarium / ülesanne / idee:

Oletame, et soovite nuppu nbFirst, nbPrevable, nbNext ja nbLast asendada ainult ühe nupuga. Kursori asukoha leidmiseks nupu vabastamisel saate protseduuri HackNavMouseUp sees kasutada parameetreid X ja Y. Sellele ühele nupule ("et neid kõiki reguleerida") saate lisada pildi, millel on 4 ala, oletatavasti jäljendab iga piirkond ühte nuppudest, mida te asendate... said asja?