„Gerai, DBNavigatorius atlieka savo darbą naršydamas duomenis ir tvarkydamas įrašus. Deja, mano klientai nori patogesnės vartotojui patirties, pavyzdžiui, pasirinktinių mygtukų grafikos ir antraščių... “
Šį tyrimą pateikė a „Delphi“ kūrėjas ieškoma būdo, kaip padidinti DBNavigator komponento galią.
„DBNavigator“ yra puikus komponentas - jame yra į vaizdo grotuvą panaši sąsaja, skirta naršyti duomenis ir tvarkyti įrašus duomenų bazės programose. Įrašų naršymą suteikia mygtukai „Pirmas“, „Kitas“, „Prieš“ ir „Paskutinis“. Įrašų tvarkymą teikia mygtukai Redaguoti, Paskelbti, Atšaukti, Ištrinti, Įterpti ir Atnaujinti. Viename komponente „Delphi“ teikia viską, ko reikia jūsų duomenims valdyti.
Tačiau, kaip teigė ir el. Pašto užklausos autorius, „DBNavigator“ trūksta kai kurių funkcijų, pavyzdžiui, pasirinktinių brėžinių, mygtukų antraščių ir kitų.
Galingesnis DBNavigatorius
Daugelis „Delphi“ komponentų turi naudingų savybių ir metodų, kurie „Delphi“ kūrėjui yra pažymėti nematomais („apsaugotais“). Tikimės, kad norint pasiekti tokius apsaugotus komponento narius, galima naudoti paprastą metodą, vadinamą „apsaugotu įsilaužimu“.
Pirmiausia pridėsite antraštę prie kiekvieno „DBNavigator“ mygtuko, tada pridėsite tinkintos grafikos ir galiausiai „OnMouseUp“ įgalinsite kiekvieną mygtuką.
Iš „nuobodžiausio“ DBNavigatoriaus į bet kurį iš šių:
- Standartinė grafika ir pasirinktinės antraštės
- Tik antraštės
- Individualizuota grafika ir pasirinktos antraštės
Paleiskime '' ritinį
„DBNavigator“ turi apsaugotą mygtuką „Buttons“. Šis narys yra „TNavButton“, „TSpeedButton“ palikuonių, masyvas.
Kadangi kiekvienas šios saugomos nuosavybės mygtukas paveldimas iš „TSpeedButton“, jei pasieksite mūsų ranką, galėsite dirbti su tokiomis „standartinėmis“ „TSpeedButton“ savybėmis kaip: Antraštė (eilutė, identifikuojanti valdiklį vartotojui), „Glyph“ (bitų žemėlapis, kuris pasirodo mygtuke), „Layout“ (nustato, kur vaizdas ar tekstas rodomas mygtukas) ...
Iš „DBCtrls“ vieneto (kuriame apibrėžtas „DBNavigator“) jūs „perskaitėte“, kad saugomų mygtukų savybė yra deklaruojama kaip:
Mygtukai: masyvas[TNavigateBtn] apie TNavButton;
Kai „TNavButton“ paveldi iš „TSpeedButton“, o „TNavigateBtn“ yra sąrašas, apibrėžtas kaip:
TNavigateBtn =
(„nbFirst“, „nbPrior“, „nbNext“, „nbLast“, „nbInsert“, „
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Atminkite, kad „TNavigateBtn“ turi 10 verčių, kiekviena identifikuojanti skirtingą mygtuką TDBNavigator objekte. Dabar pažiūrėkime, kaip nulaužti DBNavigatorių:
Patobulintas DBNavigatorius
Pirmiausia nustatykite paprastą duomenų redagavimo „Delphi“ formą, įdėdami bent DBNavigator, a „DBGrid“, „DataSoure“ ir a Duomenų rinkinio objektas jūsų pasirinkta (ADO, BDE, dbExpres, ...). Įsitikinkite, kad visi komponentai yra „prijungti“.
Antra, nulaužkite DBNavigatorių, virš formos deklaracijos apibrėždami paveldėtą „manekeno“ klasę, kaip:
tipo THackDBNavigator = klasė(TDBNavigator);
tipo
TForm1 = klasė(TForm)
...
Tada, norėdami parodyti pasirinktines antraštes ir paveikslėlius ant kiekvieno DBNavigator mygtuko, turėsite juos nustatyti glifai. Galite naudoti „TImageList“ komponentą ir priskirti 10 paveikslėlių (.bmp arba .ico), kurių kiekvienas vaizduoja tam tikro DBNavigator mygtuko veiksmą.
Trečia, „OnCreate“ renginys dėl formos1 pridėkite tokį skambutį kaip:
procedūra TForm1.FormCreate (Siuntėjas: TObject);
„SetupHackedNavigator“ („DBNavigator1“, „ImageList1“);
galas;
Nepamirškite pridėti šios procedūros deklaracijos į privačią formos deklaracijos dalį, pavyzdžiui:
tipo
TForm1 = klasė(TForm)
...
privatus procesas „SetupHackedNavigator“ (const Navigatorius: TDBNavigator;
const Glyphs: TImageList);
...
Ketvirta, pridėkite „SetupHackedNavigator“ procedūrą. „SetupHackedNavigator“ procedūra prideda pasirinktinę grafiką prie kiekvieno mygtuko ir kiekvienam mygtukui priskiria pasirinktinę antraštę.
naudoja Sagos; //!!! nepamiršk
procedūra „TForm1.SetupHackedNavigator“
(const Navigatorius: TDBNavigator;
const Glyphs: TImageList);
const
Antraštės: masyvas[TNavigateBtn] stygų =
(„Pradinis“, „Ankstesnis“, „Vėliau“, „Galutinis“, „Pridėti“,
'Ištrinti', 'teisingai', 'siųsti', 'atsiimti', 'atgaivinti');
(*
Antraštės: eilutės = [TNavigateBtn] masyvas
(„Pirmasis“, „Ankstesnis“, „Kitas“, „Paskutinis“, „Įterpti“,
'Ištrinti', 'Redaguoti', 'Skelbti', 'Atšaukti', 'Atnaujinti');
Kroatijoje (lokalizuota):
Antraštės: eilutės = [TNavigateBtn] masyvas
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
‘Obrisi’, ‘Promjeni’, ‘Spremi’, ‘Odustani’, ‘Osvjezi’);
*)
var
btn: TNavigateBtn;
pradėti btn: = žemas („TNavigateBtn“) į Aukštas („TNavigateBtn“) daryti su „THackDBNavigator“ („Navigator“) .Magonai [btn] dobeginas// iš „Captions“ const masyvo
Antraštė: = Antraštės [btn];
// paveikslėlių skaičius nuosavybėje „Glyph“
„NumGlyphs“: = 1;
// Pašalinkite seną glifą.
Glifas: = nulis;
// Paskirkite pasirinktinį
Glifai. „GetBitmap“ (sveikasis skaičius (btn), „Glyph“);
// gylph virš teksto
Išdėstymas: = blGlyphTop;
// paaiškinta vėliau
„OnMouseUp“: = „HackNavMouseUp“;
galas;
galas; (* „SetupHackedNavigator“ *)
Gerai, paaiškinkime. Jūs kartojate visus „DBNavigator“ mygtukus. Prisiminkite, kad kiekvienas mygtukas yra prieinamas iš saugomos mygtukų masyvo savybės, todėl reikia „THackDBNavigator“ klasės. Kadangi mygtukų masyvo tipas yra TNavigateBtn, pereikite nuo „pirmojo“ (naudodami Žemas funkcijos) mygtuką iki "paskutinio" (naudojant Aukštas funkcija) viena. Kiekvienam mygtukui paprasčiausiai pašalinsite „seną“ grafiką, priskiriate naują (iš „Glyphs“ parametro), pridėsite antraštę iš „Captions“ masyvo ir pažymėsite glifo išdėstymą.
Atminkite, kad naudodami „VisibleButtons“ ypatybę galite valdyti, kuriuos mygtukus rodo DBNavigator (o ne nulaužtas). Kita ypatybė, kurios numatytąją vertę galite pakeisti, yra „Užuominos“ - naudokite ją pateikdami pagalbos patarimus, kuriuos pasirinkote individualiam naršyklės mygtukui. Galite valdyti patarimų rodymą redaguodami „ShowHints“ ypatybę.
Viskas. Štai kodėl jūs pasirinkote Delphi!
Duok daugiau!
Kodėl čia reikia sustoti? Jūs žinote, kad kai paspausite mygtuką „nbNext“, dabartinė duomenų rinkinio padėtis bus perkelta į kitą įrašą. Ką daryti, jei norite perkelti, tarkime, 5 įrašus į priekį, jei vartotojas paspaudžia mygtuką CTRL, o paspaudžia mygtuką? O kaip su tuo?
„Standartiniame“ DBNavigatoriuje nėra „OnMouseUp“ įvykio - to, kuriame yra „TShiftState“ „Shift“ parametras - tai leidžia jums patikrinti „Alt“, „Ctrl“ ir „Shift“ būsenas. „DBNavigator“ teikia „OnClick“ įvykį tik jums.
Tačiau „THackDBNavigator“ gali tiesiog atskleisti „OnMouseUp“ įvykį ir įgalindamas „pamatyti“ valdymo klavišų būseną ir net žymeklio padėtį virš konkretaus mygtuko spustelėjus!
„Ctrl“ + paspaudimas: = 5 eilutės į priekį
Norėdami parodyti „OnMouseUp“, tiesiog priskirkite pasirinktinę įvykių tvarkymo procedūrą prie „OnMouseUp“ įvykio, skirto nulaužto „DBNavigator“ mygtukui. Tiksliai tai jau padaryta naudojant „SetupHackedNavigator“ procedūrą:
„OnMouseUp“: = „HackNavMouseUp“;
Dabar „HackNavMouseUp“ procedūra gali atrodyti taip:
procedūra „TForm1.HackNavMouseUp“
(Siuntėjas: TObject; Mygtukas: „TMouseButton“;
„Shift“: „TShiftState“; X, Y: sveikasis skaičius);
const „MoveBy“: sveikasis skaičius = 5;
pradžiaNE (Siuntėjas yra „TNavButton“) tada Išeiti;
atvejis TNavButton (Siuntėjas) .Index apie
nbPrior:
jei („ssCtrl“ „Shift“) tada
TDBNavigator (TNavButton (Siuntėjas). Tėvas).
Duomenų šaltinis. „DataSet“. „MoveBy“ (-MoveBy);
nbNext:
jei („ssCtrl“ „Shift“) tada
TDBNavigator (TNavButton (Siuntėjas). Tėvas).
Duomenų šaltinis. „DataSet“. „MoveBy“ („MoveBy“);
galas;
galas; (* „HackNavMouseUp“ *)
Atminkite, kad privačią formos deklaracijos dalį (šalia „SetupHackedNavigator“ procedūros deklaracijos) turite pridėti „HackNavMouseUp“ procedūros parašą:
tipo
TForm1 = klasė(TForm)
...
privatus procesas „SetupHackedNavigator“ (const Navigatorius: TDBNavigator;
const Glyphs: TImageList);
procedūra „HackNavMouseUp“ (Siuntėjas: „TObject“; Mygtukas: „TMouseButton“;
„Shift“: „TShiftState“; X, Y: sveikasis skaičius);
...
Gerai, paaiškinkime, dar vieną kartą. Procedūra „HackNavMouseUp“ tvarko kiekvieno „DBNavigator“ mygtuko „OnMouseUp“ įvykį. Jei vartotojas laiko CTRL klavišą, o paspaudžia mygtuką „nbNext“, dabartinis susieto duomenų rinkinio įrašas yra perkeltas į „MoveBy“ (apibrėžtas kaip pastovus, kurio vertė yra 5) įrašus į priekį.
Ką? Per daug sudėtinga?
Taip. Nereikia jaustis dėl viso to, jei reikia tik patikrinti valdymo klavišų būseną, kai buvo spustelėtas mygtukas. Štai kaip tą patį padaryti „paprastu“ „OnClick“ įvykis „paprasto“ DBNavigatoriaus:
procedūra TForm1.DBNavigator1Spustelėkite
(Siuntėjas: TObject; Mygtukas: TNavigateBtn);
funkcija „CtrlDown“: Boolean;
var
Valstybė: „TKeyboardState“;
prasideda
„GetKeyboardState“ (valstija);
Rezultatas: = (((valstija [vk_Control] ir 128) 0);
galas;
const „MoveBy“: sveikasis skaičius = 5;
pradinis pavyzdys Mygtukas apie
nbPrior:
jei „CtrlDown“ tada
DBNavigator1.DataSource. „DataSet“. „MoveBy“ (-MoveBy);
nbNext:
jei „CtrlDown“ tada
DBNavigator1.DataSource. „DataSet“. „MoveBy“ („MoveBy“);
galas; //case
galas; (* DBNavigator2Click *)
Viskas draugužiai
Ir galiausiai projektas yra padarytas. Arba galite tęsti toliau. Štai jums scenarijus / užduotis / idėja:
Tarkime, kad norite „nbFirst“, „nbPrevable“, „nbNext“ ir „nbLast“ mygtukus pakeisti tik vienu mygtuku. Norėdami rasti žymeklio vietą, kai mygtukas buvo paleistas, „HackNavMouseUp“ procedūros viduje galite naudoti parametrus X ir Y. Dabar prie šio vieno mygtuko („valdyti juos visus“) galite pridėti paveikslėlį, kuriame yra 4 sritys, tarkime, kiekviena sritis imituoja vieną iš jūsų keičiamų mygtukų... gavai tašką?