Vytváření a přizpůsobení tlačítek pomocí DBNavigator

„Dobře, DBNavigator provádí svou práci v navigaci dat a správě záznamů. Moji zákazníci bohužel chtějí více uživatelsky přívětivějšího zážitku, například vlastní grafiku tlačítek a titulky,... “

Tento dotaz přišel od a Vývojář Delphi hledání způsobu, jak zvýšit výkon komponenty DBNavigator.

DBNavigator je skvělá součást - poskytuje rozhraní podobné videorekordéru pro navigaci dat a správu záznamů v databázových aplikacích. Navigace v záznamu je zajištěna pomocí tlačítek První, Další, Předchozí a Poslední. Správa záznamů je zajištěna pomocí tlačítek Upravit, Odeslat, Zrušit, Odstranit, Vložit a Obnovit. V jedné komponentě Delphi poskytuje vše, co potřebujete, abyste mohli pracovat s vašimi daty.

Jak však uvedl také autor e-mailového dotazu, DBNavigator postrádá některé funkce, jako jsou vlastní glyfy, titulky tlačítek a další.

Výkonnější DBNavigator

Mnoho komponent Delphi má užitečné vlastnosti a metody, které jsou pro vývojáře Delphi označeny jako neviditelné („chráněné“). Doufejme, že pro přístup k takto chráněným členům komponenty lze použít jednoduchou techniku ​​zvanou „chráněný hack“.

instagram viewer

Nejprve přidáte titulek ke každému tlačítku DBNavigator, pak přidáte vlastní grafiku a nakonec budete moci každé tlačítko aktivovat pomocí OnMouseUp.

Od „nudného“ DBNavigatoru k jednomu z:

  • Standardní grafika a vlastní titulky
  • Pouze titulky
  • Vlastní grafika a vlastní titulky

Pojďme Rock 'n' Roll

DBNavigator má chráněnou vlastnost Buttons. Tento člen je pole TNavButton, potomek TSpeedButton.

Vzhledem k tomu, že každé tlačítko v této chráněné vlastnosti zdědí od TSpeedButton, budete-li na to mít ruce, budete moci pracovat se „standardními“ vlastnostmi TSpeedButton, jako jsou: Titulek (řetězec, který identifikuje ovládací prvek pro uživatele), glyf (bitmapa, která se objeví na tlačítku), rozložení (určuje, kde se obrázek nebo text objeví na knoflík)...

Z jednotky DBCtrls (kde je definován DBNavigator) jste „přečetli“, že vlastnost chráněných tlačítek je deklarována jako:

Tlačítka: pole[TNavigateBtn] z TNavButton;

Kde TNavButton zdědí od TSpeedButton a TNavigateBtn je výčet, definovaný jako:

TNavigateBtn = 
(nbPrvní, nbPrior, nbDalší, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);

Všimněte si, že TNavigateBtn obsahuje 10 hodnot, z nichž každá identifikuje jiné tlačítko na objektu TDBNavigator. Nyní se podívejme, jak hacknout DBNavigator:

Vylepšený DBNavigator

Nejprve vytvořte jednoduchý formulář pro editaci dat Delphi umístěním alespoň DBNavigator, a DBGrid, DataSoure a Objekt datové sady dle vašeho výběru (ADO, BDE, dbExpres, ...). Ujistěte se, že jsou všechny komponenty „připojeny“.

Za druhé, hackněte DBNavigator definováním zděděné třídy „figuríny“ nad deklarací formuláře, například:

typ THackDBNavigator = třída(TDBNavigator);
typ
TForm1 = třída(TForm)
...

Dále, abyste mohli na každém tlačítku DBNavigator zobrazovat vlastní titulky a grafiku, musíte si některé nastavit glyfy. Můžete použít komponentu TImageList a přiřadit 10 obrázků (. BMP nebo .ico), z nichž každý představuje akci určitého tlačítka DBNavigátoru.

Zatřetí v Událost OnCreate pro Form1 přidejte hovor jako:

postup TForm1.FormCreate (Sender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
konec;

Nezapomeňte přidat prohlášení o tomto postupu do soukromé části prohlášení formuláře, například:

typ
TForm1 = třída(TForm)
...
soukromý postup SetupHackedNavigator (konst Navigátor: TDBNavigator;
konst Glyfy: TImageList);
...

Začtvrté, přidejte postup SetupHackedNavigator. Procedura SetupHackedNavigator přidá každému grafiku vlastní grafiku a každému tlačítku přiřadí vlastní titulek.

použití Knoflíky; //!!! nezapomeň
postup TForm1.SetupHackedNavigator
(konst Navigátor: TDBNavigator;
konst Glyfy: TImageList);
konst
Titulky: pole[TNavigateBtn] řetězce =
(„Počáteční“, „Předchozí“, „Později“, „Konečná“, „Přidat“,
„Vymazat“, „Opravit“, „Odeslat“, „Vybrat“, „Obnovit“);
(*
Titulky: pole [TNavigateBtn] řetězce =
(„První“, „Předchozí“, „Další“, „Poslední“, „Vložit“,
„Smazat“, „Upravit“, „Odeslat“, „Zrušit“, „Obnovit“);

v Chorvatsku (lokalizováno):
Titulky: pole [TNavigateBtn] řetězce =
(„Prvi“, „Prethodni“, „Slijedeci“, „Zadnji“, „Dodaj“,
„Obrisi“, „Promjeni“, „Spremi“, „Odustani“, „Osvjezi“);
*)
var
btn: TNavigateBtn;
začátek btn: = Nízká (TNavigateBtn) na Vysoká (TNavigateBtn) dělat s THackDBNavigator (Navigator) .Tlačítka [btn] dobegin// z pole const Captions
Titulek: = Tituly [btn];
// počet obrázků ve vlastnosti glyf
NumGlyphs: = 1;
// Odstraňte starý glyf.
Glyph: = nula;
// Přiřaďte vlastní
Glyfy. GetBitmap (Integer (btn), Glyph);
// gylph nad textem
Rozložení: = blGlyphTop;
// vysvětleno později
OnMouseUp: = HackNavMouseUp;
konec;
konec; (* SetupHackedNavigator *)

Dobře, vysvětlíme. Provedete iteraci všemi tlačítky v DBNavigátoru. Připomeňme si, že každé tlačítko je přístupné z chráněné vlastnosti pole Buttons - tedy potřeba třídy THackDBNavigator. Vzhledem k tomu, že typ pole Buttons je TNavigateBtn, přecházíte z "first" (pomocí Nízký funkce) na "poslední" (pomocí Vysoký funkce) jedna. Pro každé tlačítko jednoduše odstraníte „starý“ glyf, přiřadíte nový (z parametru Glyfy), přidáte titulek z pole Titulky a označíte rozložení glyfu.

Všimněte si, že pomocí vlastnosti VisibleButtons můžete ovládat, která tlačítka se zobrazí DBNavigatorem (nikoli hacknutým). Další vlastnost, jejíž výchozí hodnotu můžete chtít změnit, je Rady - použijte ji k poskytnutí nápovědy podle vašeho výběru pro jednotlivé tlačítko navigátoru. Zobrazení tipů můžete ovládat úpravou vlastnosti ShowHints.

A je to. Proto jste si vybrali Delphi!

Dej mi víc!

Proč se zastavit? Víte, že když kliknete na tlačítko „nbNext“, aktuální pozice datové sady se posune na další záznam. Co když se chcete přesunout, řekněme, 5 záznamů dopředu, pokud uživatel drží stisknutou klávesu CTRL a zároveň stiskne tlačítko? Co takhle?

„Standardní“ DBNavigator nemá událost OnMouseUp - ta, která nese parametr Shift v TShiftState - umožňuje vám otestovat stav kláves Alt, Ctrl a Shift. DBNavigator poskytuje pouze událost OnClick, kterou můžete zpracovat.

THackDBNavigator však může jednoduše odhalit událost OnMouseUp a po kliknutí na ni můžete „zobrazit“ stav ovládacích kláves a dokonce i polohu kurzoru nad konkrétním tlačítkem!

Ctrl + Click: = 5 řádků dopředu

Chcete-li vystavit OnMouseUp, jednoduše přiřadíte vlastní postup zpracování události události OnMouseUp pro tlačítko hacknutého DBNavigator. To je přesně provedeno v proceduře SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Nyní by procedura HackNavMouseUp mohla vypadat takto:

postup TForm1.HackNavMouseUp
(Odesílatel: TObject; Tlačítko: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
konst MoveBy: celé číslo = 5;
začátekNE (Odesílatel je TNavButton) pak Výstup;
pouzdro TNavButton (odesílatel) .Index z
nbPrior:
-li (ssCtrl v Shift) pak
TDBNavigator (TNavButton (Sender) .Parent).
Zdroj dat. DataSet. MoveBy (-MoveBy);
nbDalší:
-li (ssCtrl v Shift) pak
TDBNavigator (TNavButton (Sender) .Parent).
Zdroj dat. DataSet. MoveBy (MoveBy);
konec;
konec; (* HackNavMouseUp *)

Je třeba přidat podpis procedury HackNavMouseUp do soukromé části deklarace formuláře (poblíž deklarace procedury SetupHackedNavigator):

typ
TForm1 = třída(TForm)
...
soukromý postup SetupHackedNavigator (konst Navigátor: TDBNavigator;
konst Glyfy: TImageList);
postup HackNavMouseUp (odesílatel: TObject; Tlačítko: TMouseButton;
Shift: TShiftState; X, Y: celé číslo);
...

Dobře, ještě jednou vysvětlíme. Procedura HackNavMouseUp zpracovává událost OnMouseUp pro každé tlačítko DBNavigator. Pokud uživatel drží tlačítko CTRL při klepnutí na tlačítko nbNext, aktuální záznam propojeného datového souboru se přesune o záznamy „MoveBy“ (definované jako konstanta s hodnotou 5) dopředu.

Co? Příliš komplikované?

Ano. Nemusíte si s tím vším pohrávat, pokud potřebujete pouze zkontrolovat stav ovládacích kláves po kliknutí na tlačítko. Zde je návod, jak udělat to samé v „obyčejném“ Událost OnClick „obyčejného“ DBNavigátoru:

postup TForm1.DBNavigator1Click
(Odesílatel: TObject; Tlačítko: TNavigateBtn);
funkce CtrlDown: Boolean;
var
Stav: TKeyboardState;
začít
GetKeyboardState (State);
Výsledek: = ((State [vk_Control] A 128) 0);
konec;
konst MoveBy: celé číslo = 5;
začátečník Knoflík z
nbPrior:
-li CtrlDown pak
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbDalší:
-li CtrlDown pak
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
konec; //case
konec; (* DBNavigator2Click *)

To jsou všichni lidé

A konečně je projekt hotový. Nebo můžete pokračovat. Zde je scénář / úkol / nápad:

Řekněme, že chcete, aby tlačítka nbFirst, nbPrevious, nbNext a nbLast byla nahrazena pouze jedním tlačítkem. Pomocí parametrů X a Y uvnitř procedury HackNavMouseUp můžete najít pozici kurzoru, když bylo tlačítko uvolněno. Nyní k tomuto jednom tlačítku („ovládat je všechny“) můžete připojit obrázek, který má 4 oblasti, každá oblast má napodobovat jedno z tlačítek, které nahrazujete... chápeš to?