"Labi, ka DBNavigator veic savu darbu - navigē datos un pārvalda ierakstus. Diemžēl mani klienti vēlas lietotājiem ērtāku pieredzi, piemēram, pielāgotu pogu grafiku un parakstus... "
Šī informācija nāca no a Delphi izstrādātājs meklējot veidu, kā uzlabot DBNavigator komponenta jaudu.
DBNavigator ir lielisks komponents - tas nodrošina videomagnetofonam līdzīgu interfeisu datu navigācijai un ierakstu pārvaldībai datu bāzes lietojumprogrammās. Ierakstu navigāciju nodrošina pogas Pirmais, Nākamais, Iepriekšējais un Pēdējais. Ierakstu pārvaldību nodrošina pogas Rediģēt, Izlikt, Atcelt, Dzēst, Ievietot un Atsvaidzināt. Vienā komponentā Delphi nodrošina visu nepieciešamo darbam ar jūsu datiem.
Tomēr, kā norādījis arī e-pasta pieprasījuma autors, DBNavigator trūkst dažas funkcijas, piemēram, pielāgoti attēli, pogu paraksti un citas.
Jaudīgāks DBNavigators
Daudziem Delphi komponentiem ir noderīgas īpašības un metodes, kas Delphi izstrādātājam tiek apzīmētas kā neredzamas ("aizsargātas"). Cerams, ka, lai piekļūtu šādiem aizsargātajiem komponenta locekļiem, var izmantot vienkāršu paņēmienu, ko sauc par "aizsargātu kapāt".
Pirmkārt, katrai DBNavigator pogai pievienosit parakstu, tad pievienosit pielāgotu grafiku un visbeidzot, katrai pogai iespējot OnMouseUp.
No “garlaicīgā” DBNavigator līdz vienam no:
- Standarta grafika un pielāgoti paraksti
- Tikai paraksti
- Pielāgota grafika un paraksti
Rokāsim 'n' Roll
DBNavigator ir aizsargāts Buttons īpašums. Šis loceklis ir TNavButton, TSpeedButton pēcnācēja, masīvs.
Tā kā katra šī aizsargātā rekvizīta poga tiek mantota no TSpeedButton, tad, ja jums tā pietrūks, jūs varēsit strādāt ar tādām "standarta" TSpeedButton īpašībām kā: Paraksts (virkne, kas lietotājam identificē vadības ierīci), Glyph (bitu karte, kas parādās uz pogas), Layout (nosaka, kur attēls vai teksts parādās poga) ...
No vienības DBCtrls (kur definēts DBNavigator) jūs "lasījāt", ka aizsargāto pogu Buttons reklamēšana ir šāda:
Pogas: masīvs[TNavigateBtn] no TNavButtons;
Kur TNavButton manto no TSpeedButton, un TNavigateBtn ir uzskaitījums, kas definēts kā:
TNavigateBtn =
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Ņemiet vērā, ka TNavigateBtn pieder 10 vērtības, katra identificējot atšķirīgu pogu TDBNavigator objektā. Tagad redzēsim, kā uzlauzt DBNavigator:
Uzlabotais DBNavigator
Vispirms iestatiet vienkāršu datu rediģēšanas Delphi formu, ievietojot vismaz DBNavigator, a DBGrid, DataSoure un a Datu kopas objekts pēc jūsu izvēles (ADO, BDE, dbExpres, ...). Pārliecinieties, ka visas sastāvdaļas ir "savienotas".
Otrkārt, uzlauziet DBNavigatoru, iepriekš veidlapas deklarācijā definējot iedzimtu “fiktīvu” klasi, piemēram:
tips THackDBNavigator = klase(TDBNavigators);
tips
TForm1 = klase(TForm)
...
Pēc tam, lai uz katras DBNavigator pogas varētu parādīt pielāgotos parakstus un grafiku, jums tie būs jāiestata glifi. Jūs varat izmantot komponentu TImageList un piešķirt 10 attēlus (.bmp vai .ico), katrs attēlojot DBNavigator noteiktas pogas darbību.
Treškārt, OnCreate pasākums 1. veidlapai pievienojiet šādu zvanu:
procedūra TForm1.FormCreate (Sūtītājs: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
beigas;
Noteikti pievienojiet šīs procedūras deklarāciju veidlapas deklarācijas privātajā daļā, piemēram:
tips
TForm1 = klase(TForm)
...
privātsprocedūra SetupHackedNavigator (const Navigators: TDBNavigator;
const Glifi: TImageList);
...
Ceturtkārt, pievienojiet SetupHackedNavigator procedūru. Procedūra SetupHackedNavigator katrai pogai pievieno pielāgotu grafiku un katrai pogai piešķir pielāgotu parakstu.
izmanto Pogas; //!!! neaizmirsti
procedūra TForm1.SetupHackedNavigator
(const Navigators: TDBNavigator;
const Glifi: TImageList);
const
Paraksti: masīvs[TNavigateBtn] no stīgas =
('Sākotnējais', 'Iepriekšējais', 'Vēlāk', 'Galīgais', 'Pievienot',
'Dzēst', 'Labot', 'Sūtīt', 'Izņemt', 'Atdzīvināt');
(*
Paraksti: masīvs [TNavigateBtn] no string =
('Pirmais', 'Iepriekš', 'Nākamais', 'Pēdējais', 'Ievietot',
'Dzēst', 'Rediģēt', 'Izlikt', 'Atcelt', 'Atsvaidzināt');
Horvātijā (lokalizēts):
Paraksti: masīvs [TNavigateBtn] no string =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
sākt btn: = zems (TNavigateBtn) uz Augsts (TNavigateBtn) darīt ar THackDBNavigator (Navigator) .Buttons [btn] dobegin// no Parakstu const masīva
Paraksts: = Paraksti [btn];
// attēlu skaits īpašībā Glyph
NumGlyphs: = 1;
// Noņem veco glifu.
Glifs: = nulle;
// Piešķiriet pielāgoto
Glifi. GetBitmap (vesels skaitlis (btn), glifs);
// gylph virs teksta
Izkārtojums: = blGlyphTop;
// paskaidrots vēlāk
OnMouseUp: = HackNavMouseUp;
beigas;
beigas; (* SetupHackedNavigator *)
Ok, paskaidrosim. Jūs atkārtojat visas pogas DBNavigator. Atgādiniet, ka katrai pogai var piekļūt no aizsargātā Buttons masīva īpašuma, tāpēc ir nepieciešama THackDBNavigator klase. Tā kā Buttons masīva tips ir TNavigateBtn, pārejiet no "pirmās" (izmantojot Zems funkcija) līdz "pēdējam" (izmantojot Augsts funkcija) viena. Katrai pogai vienkārši noņemiet “veco” glifu, piešķiriet jaunu (no parametra Glyphs), pievienojiet parakstu no Captions masīva un atzīmējiet glifa izkārtojumu.
Ņemiet vērā, ka jūs varat kontrolēt, kuras pogas parāda DBNavigator (nevis uzlauztais), izmantojot tās VisibleButtons rekvizītu. Vēl viens īpašums, kura noklusējuma vērtību, iespējams, vēlēsities mainīt, ir Ieteikumi - izmantojiet to, lai sniegtu Palīdzības padomus, kurus esat izvēlējies individuālajam navigatoram. Jūs varat kontrolēt ieteikumu parādīšanu, rediģējot rekvizītu ShowHints.
Tieši tā. Tas ir iemesls, kāpēc jūs esat izvēlējies Delphi!
Dod man vairāk!
Kāpēc apstāties šeit? Jūs zināt, ka, noklikšķinot uz pogas “nbNext”, datu kopas pašreizējā atrašanās vieta tiek pārvietota uz nākamo ierakstu. Ko darīt, ja vēlaties pārvietot, teiksim, 5 ierakstus uz priekšu, ja lietotājs turot taustiņu CTRL, vienlaikus nospiežot pogu? Kā būtu ar to?
"Standarta" DBNavigatorā nav OnMouseUp notikuma - tā, kas satur TShiftState Shift parametru -, kas ļauj jums pārbaudīt taustiņu Alt, Ctrl un Shift stāvokli. DBNavigator nodrošina tikai OnClick notikumu, lai jūs varētu rīkoties.
Tomēr THackDBNavigator var vienkārši pakļaut OnMouseUp notikumu un ļaut jums "redzēt" vadības taustiņu stāvokli un pat kursora stāvokli virs konkrētās pogas, kad uzklikšķina!
Ctrl + klikšķis: = 5 rindas uz priekšu
Lai pakļautu OnMouseUp, jūs vienkārši jāpiešķir pielāgoto notikumu apstrādes procedūru OnMouseUp notikumam uzlauztā DBNavigator pogai. Tas precīzi jau ir izdarīts SetupHackedNavigator procedūrā:
OnMouseUp: = HackNavMouseUp;
Tagad HackNavMouseUp procedūra varētu izskatīties šādi:
procedūra TForm1.HackNavMouseUp
(Sūtītājs: TObject; Poga: TMouseButton;
Shift: TShiftState; X, Y: vesels skaitlis);
const MoveBy: vesels skaitlis = 5;
iesākumsNAV (Sūtītājs ir TNavButton) tad Izeja;
lietu TNavButton (Sūtītājs) .Index no
nbPrior:
ja (ssCtrl maiņā) tad
TDBNavigator (TNavButton (Sūtītājs). Vecāks).
Datu avots. DataSet. MoveBy (-MoveBy);
nbNext:
ja (ssCtrl maiņā) tad
TDBNavigator (TNavButton (Sūtītājs). Vecāks).
Datu avots. DataSet. MoveBy (MoveBy);
beigas;
beigas; (* HackNavMouseUp *)
Ņemiet vērā, ka veidlapas deklarācijas privātajā daļā (netālu no SetupHackedNavigator procedūras deklarācijas) jāpievieno procedūras HackNavMouseUp paraksts:
tips
TForm1 = klase(TForm)
...
privātsprocedūra SetupHackedNavigator (const Navigators: TDBNavigator;
const Glifi: TImageList);
procedūra HackNavMouseUp (Sūtītājs: TObject; Poga: TMouseButton;
Shift: TShiftState; X, Y: vesels skaitlis);
...
Ok, paskaidrosim vēl vienu reizi. Procedūra HackNavMouseUp apstrādā OnMouseUp notikumu katrai DBNavigator pogai. Ja lietotājs tur CTRL taustiņu, kamēr noklikšķina uz pogas nbNext, pašreizējais saistītās datu kopas ieraksts tiek pārvietots uz priekšu "MoveBy" (definēts kā nemainīgs ar 5 vērtību).
Kas? Pārlieku sarežģīti?
Jā. Jums tas viss nav jājauc, ja jums tikai jāpārbauda vadības taustiņu stāvoklis, kad poga tika noklikšķināta. Lūk, kā izdarīt to pašu “parastajā” OnClick pasākums "parastā" DBNavigator:
procedūra TForm1.DBNavigator1Click
(Sūtītājs: TObject; Poga: TNavigateBtn);
funkcija CtrlDown: Būla;
var
Stāvoklis: TKeyboardState;
sākt
GetKeyboardState (štats);
Rezultāts: = (((štats [vk_Control] un 128) 0);
beigas;
const MoveBy: vesels skaitlis = 5;
sākumlapa Poga no
nbPrior:
ja CtrlDown tad
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
ja CtrlDown tad
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
beigas; //case
beigas; (* DBNavigator2Click *)
Tas ir viss ļaudis
Un, visbeidzot, projekts ir paveikts. Vai arī jūs varat turpināt iet. Piedāvājam jums scenāriju / uzdevumu / ideju:
Teiksim, ka vēlaties tikai vienu pogu, lai aizstātu pogas nbFirst, nbPrevable, nbNext un nbLast. Lai atrastu kursora pozīciju, kad poga tika atbrīvota, procedūras HackNavMouseUp iekšpusē varat izmantot parametrus X un Y. Tagad šai vienai pogai ("lai tos visus pārvaldītu") varat pievienot attēlu, kurā ir 4 laukumi, domājams, ka katrs apgabals atdarina vienu no pogām, kuras jūs maināt... dabūjāt punktu?