Stvaranje i prilagođavanje gumba s DBNavigatorom

"U redu, DBNavigator radi svoj posao navigacije podataka i upravljanja zapisima. Nažalost, moji kupci žele više korisničko iskustvo, poput prilagođene grafike i naslova gumba,... "

Ovaj je upit došao od Delphi programer tražeći način da poboljšaju snagu DBNavigator komponente.

DBNavigator je sjajna komponenta - pruža sučelje poput videorekordera za navigaciju podataka i upravljanje zapisima u aplikacijama baze podataka. Navigacija snimanjem omogućena je tipkama Prvi, Sljedeći, Prethodni i Zadnji. Upravljanje snimkama omogućeno je tipkama Uredi, Objavi, Otkaži, Izbriši, Umetni i Osvježi. U jednoj komponenti Delphi pruža sve što vam je potrebno za rad na vašim podacima.

Međutim, kako je naveo i autor upita za e-poštu, DBNavigator nema neke značajke poput prilagođenih glifova, natpisa s gumbima i drugih.

Snažniji DBNavigator

Mnoge Delphi komponente imaju korisna svojstva i metode koje su označene nevidljivim ("zaštićenim") za razvojne programere tvrtke Delphi. Nadamo se da se za pristup takvim zaštićenim članovima komponente može koristiti jednostavna tehnika koja se zove "zaštićeni hack".

instagram viewer

Prvo ćete dodati tipku na svaki gumb DBNavigator, zatim ćete dodati prilagođenu grafiku i na kraju ćete svaki gumb omogućiti na OnMouseUp.

Od "dosadnog" DBNavigatora do bilo kojeg od:

  • Standardna grafika i prilagođeni naslovi
  • Samo naslovi
  • Prilagođena grafika i prilagođeni naslovi

Let's rock 'n' Roll

DBNavigator ima svojstvo zaštićenih gumba. Ovaj član je niz TNavButton, potomak TSpeedButtona.

Budući da svaki gumb u ovom zaštićenom entitetu nasljeđuje TSpeedButton, ako ga se snađemo, moći ćete raditi sa "standardnim" TSpeedButton svojstvima kao što su: Natpis (niz koji korisniku identificira kontrolu), Glyph (bitmap koji se pojavljuje na gumbu), izgled (određuje gdje se slika ili tekst pojavljuju na dugme)...

Iz jedinice DBCtrls (gdje je definiran DBNavigator) "čitate" da je svojstvo zaštićenih gumba deklarirano kao:

tipke: red[TNavigateBtn] od TNavButton;

Tamo gdje TNavButton nasljeđuje od TSpeedButton, a TNavigateBtn je nabrajanje, definirano kao:

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

Imajte na umu da TNavigateBtn sadrži 10 vrijednosti, a svaka identificira različite tipke na TDBNavigator objektu. Sada, da vidimo kako hakirati DBNavigator:

Poboljšani DBNavigator

Prvo postavite jednostavan Delphi obrazac za uređivanje podataka tako što ćete staviti najmanje DBNavigator, a DBGrid, DataSoure i a Objekt skupa podataka po vašem izboru (ADO, BDE, dbExpres, ...). Provjerite jesu li sve komponente "povezane".

Drugo, hakirajte DBNavigator definiranjem naslijeđene klase "lutke", iznad deklaracije obrasca, kao:

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

Zatim, kako biste mogli prikazati prilagođene naslove i grafike na svakom gumbu DBNavigator, morat ćete ih postaviti simboli. Možete koristiti komponentu TImageList i dodijeliti 10 slika (.bmp ili .ico), od kojih svaka predstavlja radnju određenog gumba DBNavigator.

Treće, u OnCreate događaj za Form1 dodajte poziv poput:

postupak TForm1.FormCreate (pošiljalac: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
kraj;

Obavezno dodajte izjavu ovog postupka u privatni dio izjave obrasca, kao što je:

tip
TForm1 = klasa(TForm)
...
privateprocedure SetupHackedNavigator (const Navigator: TDBNavigator;
const Glifi: TImageList);
...

Četvrto, dodajte postupak SetupHackedNavigator. Postupak SetupHackedNavigator svakom gumbu dodaje prilagođenu grafiku i svakom gumbu dodjeljuje prilagođeni naslov.

namjene tipke; //!!! ne zaboravi
postupak TForm1.SetupHackedNavigator
(const Navigator: TDBNavigator;
const Glifi: TImageList);
const
Naslovi: red[TNavigateBtn] od niza =
("Početno", "Prethodno", "Kasnije", "Završno", "Dodaj",
'Izbrisati', 'ispraviti', 'poslati', 'povući', 'oživjeti');
(*
Opisi: niz [TNavigateBtn] od niza
("Prvo", "Prior", "Dalje", "Zadnje", "Umetni",
'Delete', 'Edit', 'Post', 'Cancel', 'Refresh');

u Hrvatskoj (lokalizirano):
Opisi: niz [TNavigateBtn] od niza
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
beginfor btn: = niska (TNavigateBtn) do Visoka (TNavigateBtn) dowith THackDBNavigator (Navigator). Tipke [btn] dobegin// iz niza Captions const
Opis: = Natpisi [btn];
// broj slika u svojstvu Glyph
NumGlyphs: = 1;
// Uklonite stari glif.
Glif: = nula;
// Dodijelite prilagođeni
Simboli. GetBitmap (Integer (btn), Glyph);
// gif iznad teksta
Izgled: = blGlyphTop;
// objašnjeno kasnije
OnMouseUp: = HackNavMouseUp;
kraj;
kraj; (* SetupHackedNavigator *)

Ok, objasnimo. Ponovite sve gumbe u DBNavigatoru. Podsjetite da je svaki gumb dostupan iz svojstva zaštićenog niza Gumbi - dakle potreba za THAckDBNavigator klasom. Budući da je tip niza Buttons TNavigateBtn, prelazite iz "prvog" (koristeći nizak funkciju) tipku do "zadnjeg" (pomoću visok funkcija) jedan. Za svaki gumb jednostavno uklonite "stari" glif, dodijelite novi (iz parametra Glyphs), dodajte naslov iz arhive Captions i označite izgled glifa.

Imajte na umu da možete kontrolirati koje gumbe prikazuje DBNavigator (a ne hakirani) putem svojstva VisibleButtons. Drugo svojstvo čiju bi zadanu vrijednost možda željeli izmijeniti su Savjeti - koristite ih za davanje savjeta pomoći za svoj odabir pojedinačnog gumba za navigaciju. Prikaz savjeta možete kontrolirati uređivanjem svojstva ShowHints.

To je to. Zbog toga ste odabrali Delphi!

Daj mi još!

Zašto se ovdje zaustaviti? Znate da kada kliknete gumb 'nbNext' trenutni položaj skupa podataka prelazi na sljedeći zapis. Što ako želite prijeći, recimo, 5 zapisa unaprijed ako korisnik drži tipku CTRL dok pritisne gumb? Što kažete na to?

"Standardni" DBNavigator nema događaj OnMouseUp - onaj koji sadrži Shift parametar TShiftState - koji omogućava testiranje stanja tipki Alt, Ctrl i Shift. DBNavigator pruža samo događaj OnClick za vas koji možete rukovati.

Međutim, THackDBNavigator može jednostavno izložiti događaj OnMouseUp i omogućiti vam da "kliknete" stanje kontrolnih tipki, pa čak i položaj pokazivača iznad određenog gumba kad se klikne!

Ctrl + klik: = 5 redaka unaprijed

Da biste otkrili OnMouseUp, jednostavno dodijelite svoj prilagođeni postupak rukovanja događajem OnMouseUp događajem za gumb hakiranog DBNavigatora. Točno se već radi u postupku SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Sada bi postupak HackNavMouseUp mogao izgledati:

postupak TForm1.HackNavMouseUp
(Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const MoveBy: cijeli broj = 5;
beginifNE (Pošiljalac je TNavButton) zatim Izlaz;
slučaj TNavButton (pošiljatelj) .Index od
nbPrior:
ako (ssCtrl in Shift) zatim
TDBNavigator (TNavButton (pošiljatelj) .Parent).
Izvor podataka. Podataka. MoveBy (-MoveBy);
nbNext:
ako (ssCtrl in Shift) zatim
TDBNavigator (TNavButton (pošiljatelj) .Parent).
Izvor podataka. Podataka. MoveBy (MoveBy);
kraj;
kraj(* HackNavMouseUp *)

Imajte na umu da morate dodati potpis HackNavMouseUp postupka unutar privatnog dijela deklaracije obrasca (blizu izjave postupka SetupHackedNavigator):

tip
TForm1 = klasa(TForm)
...
privateprocedure SetupHackedNavigator (const Navigator: TDBNavigator;
const Glifi: TImageList);
postupak HackNavMouseUp (Pošiljatelj: TObject; Gumb: TMouseButton;
Shift: TShiftState; X, Y: Integer);
...

Ok, objasnimo, još jednom. Postupak HackNavMouseUp rukovodi događajem OnMouseUp za svaki gumb DBNavigator. Ako korisnik drži tipku CTRL dok klikne gumb nbNext, trenutni zapis za povezani skup pomiče se "MoveBy" (definiran kao konstanta s vrijednošću od 5) ispred.

Što? Overcomplicated?

Da. Ne trebate se zabrljati sa svim tim ako trebate samo provjeriti stanje upravljačkih tipki tek kad se klikne gumb. Evo kako to učiniti u "običnom" OnClick događaj "običnog" DBNavigator:

postupak TForm1.DBNavigator1Click
(Pošiljatelj: TObject; Gumb: TNavigateBtn);
funkcija CtrlDown: Boolean;
var
Stanje: TKeyboardState;
početi
GetKeyboardState (država);
Rezultat: = ((država [vk_Control] I 128) 0);
kraj;
const MoveBy: cijeli broj = 5;
begincase Dugme od
nbPrior:
ako CtrlDown zatim
DBNavigator1.DataSource. Podataka. MoveBy (-MoveBy);
nbNext:
ako CtrlDown zatim
DBNavigator1.DataSource. Podataka. MoveBy (MoveBy);
kraj; //case
kraj(* DBNavigator2Click *)

To je sve narode

I na kraju projekt je gotov. Ili možete nastaviti dalje. Evo scenarija / zadatka / ideje za vas:

Recimo da želite da samo jedan gumb zamijeni gumbe nbFirst, nbPrevious, nbNext i nbLast. Možete koristiti parametre X i Y unutar postupka HackNavMouseUp da biste pronašli položaj pokazivača kada se gumb otpusti. Sada, na ovaj jedan gumb ("da im vladate svima") možete priložiti sliku koja ima 4 područja, a svako područje pretpostavlja da oponaša jedan od gumba koje zamjenjujete... imaš smisla?