„Dobre, DBNavigator vykonáva svoju prácu v navigácii údajov a správe záznamov. Moji zákazníci, žiaľ, chcú viac užívateľsky príjemnejšej skúsenosti, napríklad prispôsobenú grafiku tlačidiel a titulky,... “
Tento dopyt prišiel od a Vývojár spoločnosti Delphi hľadanie spôsobu, ako zvýšiť výkon komponentu DBNavigator.
DBNavigator je vynikajúci komponent - poskytuje rozhranie podobné videorekordéru na navigáciu údajov a správu záznamov v databázových aplikáciách. Navigácia v zázname je zabezpečená pomocou tlačidiel First, Next, Prior a Last. Správa záznamov je zabezpečená pomocou tlačidiel Edit, Post, Cancel, Delete, Insert a Refresh. V jednom komponente spoločnosť Delphi poskytuje všetko, čo potrebujete, aby ste mohli pracovať s vašimi údajmi.
Ako však uviedol aj autor e-mailového dotazu, DBNavigator nemá niektoré funkcie, ako sú vlastné glyfy, titulky tlačidiel a ďalšie.
Výkonnejší DBNavigator
Mnoho komponentov Delphi má užitočné vlastnosti a metódy, ktoré sú pre vývojárov Delphi označené ako „neviditeľné“ („chránené“). Dúfajme, že na prístup k takým chráneným členom komponentu sa dá použiť jednoduchá technika nazývaná „chránený hack“.
Najprv pridáte popis ku každému tlačidlu DBNavigator, potom pridáte vlastnú grafiku a nakoniec každé tlačidlo zapnete pomocou OnMouseUp.
Z „nudného“ DBNavigátora na jeden z:
- Štandardná grafika a vlastné titulky
- Iba titulky
- Vlastná grafika a vlastné titulky
Poďme Rock 'n' Roll
DBNavigator má chránenú vlastnosť Buttons. Tento člen je pole TNavButton, potomok TSpeedButton.
Pretože každé tlačidlo v tomto chránenom vlastníctve zdedí od TSpeedButton, ak sa naň dostanete, budete môcť pracovať so „štandardnými“ vlastnosťami TSpeedButton, ako sú: Titulok (reťazec, ktorý identifikuje ovládač pre používateľa), glyf (bitmapa, ktorá sa objaví na tlačidle), rozloženie (určuje, kde sa obrázok alebo text objaví na Tlačidlo) ...
Z jednotky DBCtrls (kde je definovaný DBNavigator) „čítate“, že vlastnosť chránených tlačidiel je deklarovaná ako:
tlačidlá: rad[TNavigateBtn] z TNavButton;
Ak TNavButton zdedí od TSpeedButton a TNavigateBtn je výpočet, definovaný ako:
TNavigateBtn =
(nbPrvé, nbPrior, nbĎalšie, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Všimnite si, že TNavigateBtn obsahuje 10 hodnôt, z ktorých každá identifikuje odlišné tlačidlo na objekte TDBNavigator. Teraz sa pozrime, ako hacknúť DBNavigator:
Vylepšený DBNavigator
Najskôr vytvorte jednoduchý formulár na úpravu údajov v Delphi umiestnením aspoň DBNavigátora, a DBGrid, DataSoure a Objekt množiny údajov podľa vášho výberu (ADO, BDE, dbExpres, ...). Uistite sa, že všetky komponenty sú „pripojené“.
Po druhé, prelomte DBNavigator definovaním zdedenej triedy „figuríny“ nad vyhlásením formulára, napríklad:
typ THackDBNavigator = trieda(TDBNavigator);
typ
TForm1 = trieda(TForm)
...
Ďalej, ak chcete na každom tlačidle DBNavigator zobraziť vlastné titulky a grafiku, budete musieť niektoré nastaviť piktogramy. Môžete použiť komponent TImageList a priradiť 10 obrázkov (. Bmp alebo .ico), z ktorých každý predstavuje akciu konkrétneho tlačidla DBNavigátora.
Po tretie, v USA Udalosť OnCreate pre Form1 pridajte hovor ako:
procedúra TForm1.FormCreate (Sender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
koniec;
Nezabudnite pridať vyhlásenie o tomto postupe do súkromnej časti formulára vyhlásenia, napríklad:
typ
TForm1 = trieda(TForm)
...
privateprocedure SetupHackedNavigator (const Navigátor: TDBNavigator;
const Glyphs: TImageList);
...
Po štvrté, pridajte postup SetupHackedNavigator. Procedúra SetupHackedNavigator pridá každému tlačidlu vlastnú grafiku a každému tlačidlu priradí vlastný nadpis.
použitie gombíky; //!!! nezabudni
procedúra TForm1.SetupHackedNavigator
(const Navigátor: TDBNavigator;
const Glyphs: TImageList);
const
titulky: rad[TNavigateBtn] reťazca =
(„Počiatočné“, „Predchádzajúce“, „Neskôr“, „Konečné“, „Pridať“,
„Vymazať“, „Opraviť“, „Poslať“, „Vybrať“, „Obnoviť“);
(*
Titulky: pole [TNavigateBtn] reťazca =
(„Prvá“, „Predchádzajúca“, „Ďalšia“, „Posledná“, „Vložiť“,
„Odstrániť“, „Upraviť“, „Zverejniť“, „Zrušiť“, „Obnoviť“);
v Chorvátsku (lokalizované):
Titulky: pole [TNavigateBtn] reťazca =
(„Prvi“, „Prethodni“, „Slijedeci“, „Zadnji“, „Dodaj“,
„Obrisi“, „Promjeni“, „Spremi“, „Odustani“, „Osvjezi“);
*)
var
btn: TNavigateBtn;
beginfor btn: = Nízka (TNavigateBtn) na Vysoká (TNavigateBtn) robiť s THackDBNavigator (Navigator) .Tlačidlá [btn] dobegin// z konštantného poľa Captions
Titulok: = Titulky [btn];
// počet obrázkov vo vlastníctve glyfov
NumGlyphs: = 1;
// Odstráňte starý glyf.
Glyph: = nula;
// Priradenie vlastného
. Piktogramy GetBitmap (celé číslo (btn), glyf);
// gylph nad textom
Usporiadanie: = blGlyphTop;
// vysvetlené neskôr
OnMouseUp: = HackNavMouseUp;
koniec;
koniec; (* SetupHackedNavigator *)
Ok, poďme to vysvetliť. Môžete iterovať cez všetky tlačidlá v DBNavigator. Pripomeňme si, že každé tlačidlo je prístupné z vlastnosti chráneného poľa Buttons - preto je potrebná trieda THackDBNavigator. Pretože typ poľa Buttons je TNavigateBtn, idete od "prvého" (pomocou nízky funkcie) na "posledný" (pomocou vysoký funkcie) jeden. Pre každé tlačidlo jednoducho odstránite „starý“ glyf, priradíte nový (z parametra Glyphs), pridáte popis z poľa Titulky a označíte rozloženie glyfu.
Upozorňujeme, že pomocou vlastnosti VisibleButtons môžete ovládať, ktoré tlačidlá sa zobrazia v DBNavigator (nie v hacknutom režime). Ďalšou vlastnosťou, ktorej predvolenú hodnotu možno budete chcieť zmeniť, sú Rady - použite ju na poskytnutie pomocných tipov podľa vášho výberu pre jednotlivé tlačidlo navigátora. Zobrazenie tipov môžete ovládať úpravou vlastnosti ShowHints.
To je všetko. Preto ste si vybrali spoločnosť Delphi!
Daj mi viac!
Prečo tu zastaviť? Viete, že keď kliknete na tlačidlo „nbNext“, aktuálna pozícia súboru údajov sa presunie na ďalší záznam. Čo ak sa chcete pohnúť, povedzme, 5 záznamov dopredu, ak používateľ drží stlačený kláves CTRL a zároveň drží stlačené tlačidlo? Čo takhle?
„Štandardný“ DBNavigator nemá udalosť OnMouseUp - tú, ktorá nesie parameter Shift v TShiftState - umožňuje vám otestovať stav klávesov Alt, Ctrl a Shift. DBNavigator poskytuje iba udalosť OnClick, ktorú môžete spracovať.
THackDBNavigator však môže jednoducho odhaliť udalosť OnMouseUp a umožní vám po kliknutí zobraziť stav ovládacích klávesov a dokonca aj polohu kurzora nad príslušným tlačidlom!
Ctrl + Click: = 5 riadkov dopredu
Na odhalenie OnMouseUp jednoducho priradíte svoju vlastnú procedúru spracovania udalosti udalosti OnMouseUp pre tlačidlo hacknutého DBNavigator. Toto sa už presne robí v postupe SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;
Teraz by postup HackNavMouseUp mohol vyzerať takto:
procedúra TForm1.HackNavMouseUp
(Odosielateľ: TObject; Tlačidlo: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
const MoveBy: celé číslo = 5;
beginifNOT (Odosielateľ je TNavButton) potom Východ;
púzdro TNavButton (Sender) .Index z
nbPrior:
ak (ssCtrl v Shift) potom
TDBNavigator (TNavButton (Sender) .Parent).
Dátový zdroj. Množina údajov. MoveBy (-MoveBy);
nbNext:
ak (ssCtrl v Shift) potom
TDBNavigator (TNavButton (Sender) .Parent).
Dátový zdroj. Množina údajov. MoveBy (MoveBy);
koniec;
koniec(* HackNavMouseUp *)
Všimnite si, že musíte pridať podpis postupu HackNavMouseUp do súkromnej časti formulára vyhlásenia (blízko vyhlásenia procedúry SetupHackedNavigator):
typ
TForm1 = trieda(TForm)
...
privateprocedure SetupHackedNavigator (const Navigátor: TDBNavigator;
const Glyphs: TImageList);
procedúra HackNavMouseUp (odosielateľ: TObject; Tlačidlo: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
...
Ok, ešte raz to vysvetlíme. Procedúra HackNavMouseUp spracováva udalosť OnMouseUp pre každé tlačidlo DBNavigator. Ak používateľ drží kláves CTRL pri kliknutí na tlačidlo nbNext, aktuálny záznam prepojeného súboru údajov sa presunie o záznamy „MoveBy“ (definované ako konštantná hodnota 5).
Čo? Zložitá?
Jo. Nemusíte sa tým zaoberať, ak potrebujete skontrolovať stav ovládacích klávesov iba po kliknutí na tlačidlo. Tu je návod, ako to isté urobiť v „bežných“ Udalosť OnClick „obyčajného“ DBNavigátora:
procedúra TForm1.DBNavigator1Click
(Odosielateľ: TObject; Tlačidlo: TNavigateBtn);
funkcie CtrlDown: Boolean;
var
Stav: TKeyboardState;
začať
GetKeyboardState (štát);
Výsledok: = ((štát [vk_Control] a 128) 0);
koniec;
const MoveBy: celé číslo = 5;
begincase gombík z
nbPrior:
ak CtrlDown potom
DBNavigator1.DataSource. Množina údajov. MoveBy (-MoveBy);
nbNext:
ak CtrlDown potom
DBNavigator1.DataSource. Množina údajov. MoveBy (MoveBy);
koniec; //case
koniec(* DBNavigator2Click *)
To je všetko priatelia
A nakoniec je projekt hotový. Alebo môžete pokračovať. Tu je scenár / úloha / nápad:
Povedzme, že chcete nahradiť iba tlačidlá nbFirst, nbPrevious, nbNext a nbLast. Pomocou parametrov X a Y v rámci postupu HackNavMouseUp môžete nájsť pozíciu kurzora po uvoľnení tlačidla. Teraz môžete k tomuto jednému tlačidlu („vládnuť im všetky“) priložiť obrázok, ktorý má 4 oblasti, pričom každá oblasť má napodobňovať jedno z tlačidiel, ktoré nahrádzajú... chápeš to?