Gombok létrehozása és testreszabása a DBNavigator segítségével

"Rendben, a DBNavigator elvégzi az adatok navigálását és a rekordok kezelését. Sajnos ügyfeleim felhasználóbarátabb élményt akarnak, mint például az egyedi gombgrafikák és feliratok... "

Ezt a kérdést egy a Delphi fejlesztő keressen módot a DBNavigator összetevő teljesítményének növelésére.

A DBNavigator nagyszerű elem - videomagnó-szerű felületet biztosít az adatok navigálásához és az adatbázis-alkalmazások rekordjainak kezeléséhez. A rekordok navigációját az Első, Következő, Előző és Utolsó gombok biztosítják. A rekordkezelést a Szerkesztés, Hozzászólás, Mégse, Törlés, Beszúrás és Frissítés gombok biztosítják. Az egyik összetevőben a Delphi mindent megad, amire szüksége van az adatok kezeléséhez.

Mint azonban az e-mail megkeresés szerzője is kijelentette, a DBNavigatornak hiányzik néhány funkciója, például az egyedi karakterjelek, a gomb feliratok és mások.

Nagyobb teljesítményű DBNavigator

Számos Delphi komponens olyan hasznos tulajdonságokkal és módszerekkel rendelkezik, amelyeket láthatatlannak ("védettnek") jelölnek egy Delphi fejlesztő számára. Remélhetőleg egy komponens ilyen védett tagjaihoz való hozzáféréshez egy egyszerű technikát, úgynevezett "védett hack" -ot lehet használni.

instagram viewer

Először minden DBNavigator gombhoz hozzáfűz egy feliratot, majd hozzáad egyéni grafikákat, és végül az OnMouseUp engedélyez minden gombot.

A "unalmas" DBNavigatortól a következők egyikéig:

  • Normál grafika és egyéni feliratok
  • Csak feliratok
  • Egyéni grafika és feliratok

Nézzük a rock 'n' roll-ot

A DBNavigator védett Buttons tulajdonsággal rendelkezik. Ez a tag a TNavButton, a TSpeedButton leszármazottjának tömbje.

Mivel a védett tulajdonság minden gombja a TSpeedButton-tól örököl, ha megkapja a kezünket, akkor képes lesz olyan "standard" TSpeedButton-tulajdonságokkal dolgozni, mint például: Felirat (karakterlánc, amely azonosítja a vezérlőt a felhasználó számára), Glyph (a gombbal megjelenő bitkép), Layout (meghatározza, hogy a kép vagy szöveg hol jelenjen meg a gomb)...

A DBCtrls egységből (ahol a DBNavigator meghatározása megtörtént) "elolvasta", hogy a védett gombok tulajdonságot a következőképpen deklarálják:

gombok: sor[TNavigateBtn] nak,-nek TNavButton;

Ahol a TNavButton a TSpeedButton-tól örököl, és a TNavigateBtn egy felsorolás, amelyet a következőképpen határozunk meg:

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

Vegye figyelembe, hogy a TNavigateBtn 10 értéket tárol, mindegyik eltérő gombot azonosítva a TDBNavigator objektumon. Most lássuk, hogyan lehet feltörni egy DBNavigator-ot:

Továbbfejlesztett DBNavigator

Először állítson be egy egyszerű adatszerkesztő Delphi űrlapot legalább egy DBNavigator elhelyezésével, a DBGrid, a DataSoure és a Adatkészlet-objektum választott (ADO, BDE, dbExpres, ...). Ellenőrizze, hogy minden alkatrész "csatlakoztatva van".

Másodszor, csapkodjon be egy DBNavigatorba úgy, hogy az űrlapnyilatkozat fölött meghatározza az örökölt "dummy" osztályt, például:

típus THackDBNavigator = osztály(TDBNavigator);
típus
TForm1 = osztály(TForm)
...

Ezután az egyéni feliratok és grafikák megjelenítéséhez az egyes DBNavigator gombokon be kell állítania néhányat glyphek. Használhatja a TImageList összetevőt, és 10 képet rendelhet (.bmp vagy .ico), mindegyik a DBNavigator adott gombjának műveletét jelképezi.

Harmadszor, a OnCreate esemény az 1. űrlaphoz adjon hozzá egy olyan hívást, mint:

eljárás TForm1.FormCreate (küldő: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
vég;

Ügyeljen arra, hogy az űrlapnyilatkozat magán részéhez adja hozzá az eljárás bejelentését, például:

típus
TForm1 = osztály(TForm)
...
privateprocedure SetupHackedNavigator (const Navigátor: TDBNavigator;
const Karakterjelek: TImageList);
...

Negyedszer, adja hozzá a SetupHackedNavigator eljárást. A SetupHackedNavigator eljárás hozzáad egyéni grafikákat minden gombhoz, és minden egyes gombhoz hozzárendel egy egyéni feliratot.

felhasználások gombok; //!!! ne felejtsd el
eljárás TForm1.SetupHackedNavigator
(const Navigátor: TDBNavigator;
const Karakterjelek: TImageList);
const
Feliratok: sor[TNavigateBtn] húr =
(„Kezdeti”, „Előző”, „Később”, „Végleges”, „Hozzáadás”,
'Törlés', 'Helyes', 'Küldés', 'Visszavonás', 'Revive');
(*
Feliratok: sor = [TNavigateBtn] tömbje
('Első', 'Előző', 'Következő', 'Utolsó', 'Beszúrás',
'Törlés', 'Szerkesztés', 'Hozzászólás', 'Mégse', 'Frissítés');

Horvátországban (lokalizált):
Feliratok: sor = [TNavigateBtn] tömbje
(„Prvi”, „Prethodni”, „Slijedeci”, „Zadnji”, „Dodaj”,
„Obrisi”, „Promjeni”, „Spremi”, „Odustani”, „Osvjezi”);
*)
var
btn: TNavigateBtn;
beginfor btn: = alacsony (TNavigateBtn) nak nek Magas (TNavigateBtn) csinálni vele THackDBNavigator (Navigátor) .Gombok [btn] dobegin// a Captions const tömbből
Felirat: = Feliratok [btn];
// a Glyph tulajdonságban lévő képek száma
NumGlyph: = 1;
// Távolítsa el a régi karakterláncot.
Glyph: = nulla;
// Rendeljen hozzá az egyéni
Jelek. GetBitmap (egész szám (btn), karakterjel);
// gylph a szöveg felett
Elrendezés: = blGlyphTop;
// magyarázat később
OnMouseUp: = HackNavMouseUp;
vég;
vég; (* SetupHackedNavigator *)

Oké, magyarázzuk el. A DBNavigator összes gombján keresztül ismétlődik. Emlékezzünk arra, hogy minden gomb elérhető a védett Buttons tömb tulajdonságból - ezért szükség van a THackDBNavigator osztályra. Mivel a Buttons tömb típusa a TNavigateBtn, az "első" -től indul (a Alacsony funkció) gombot az "utolsó" gombra (a Magas funkció) egy. Minden gombhoz egyszerűen eltávolítja a "régi" karakterjelet, hozzárendel egy újat (a Glyphs paraméterből), hozzáadja a képaláírást a Captions tömbből, és megjelöli a karakterjel elrendezését.

Vegye figyelembe, hogy a VisibleButtons tulajdonságon keresztül vezérelheti, mely gombok jelennek meg a DBNavigator (nem a feltört gombok) részén. Egy másik tulajdonság, amelynek alapértelmezett értékét érdemes megváltoztatni, a Tippek - használja azt az egyedi navigátor gombra választott Súgó tippek biztosításához. A Tipp megjelenítését a ShowHints tulajdonság szerkesztésével vezérelheti.

Ez az. Ez az, amiért kiválasztotta a Delphit!

Adj többet!

Miért áll meg itt? Tudod, hogy amikor rákattint az 'nbNext' gombra, az adatkészlet jelenlegi helyzete a következő rekordhoz kerül. Mi lenne, ha át akarja mozgatni, mondjuk, 5 rekordot előre, ha a felhasználó a CTRL gombot tartja nyomva a gomb lenyomásakor? Mit szólsz?

A "standard" DBNavigatornak nincs az OnMouseUp esemény - az egyik, amely a TShiftState Shift paraméterét hordozza - lehetővé teszi az Alt, Ctrl és Shift gombok állapotának tesztelését. A DBNavigator csak az OnClick eseményt biztosítja az Ön számára.

A THackDBNavigator azonban egyszerűen feltárhatja az OnMouseUp eseményt, és lehetővé teszi, hogy kattintással "láthassa" a vezérlőgombok állapotát és akár a kurzor helyzetét az adott gomb felett!

Ctrl + kattintás: = 5 sor előre

Az OnMouseUp megjelenítéséhez egyszerűen hozzá kell rendelnie az egyedi eseménykezelési eljárást az OnMouseUp eseményhez a feltörött DBNavigator gombhoz. Pontosan ezt már megtette a SetupHackedNavigator eljárásban:
OnMouseUp: = HackNavMouseUp;

A HackNavMouseUp eljárás így nézhet ki:

eljárás TForm1.HackNavMouseUp
(Feladó: TObject; Gomb: TMouseButton;
Shift: TShiftState; X, Y: egész szám);
const MoveBy: egész szám = 5;
beginifNEM (A feladó TNavButton) azután Kijárat;
ügy TNavButton (feladó) .Index nak,-nek
nbPrior:
ha (ssCtrl a Shiftben) azután
TDBNavigator (TNavButton (Feladó). Szülő).
Adatforrás. DataSet. MoveBy (-MoveBy);
nbNext:
ha (ssCtrl a Shiftben) azután
TDBNavigator (TNavButton (Feladó). Szülő).
Adatforrás. DataSet. MoveBy (MoveBy);
vég;
vég; (* HackNavMouseUp *)

Vegye figyelembe, hogy a űrlapnyilatkozat privát részébe (a SetupHackedNavigator eljárás deklarációjának közelében) hozzá kell adnia a HackNavMouseUp eljárás aláírását:

típus
TForm1 = osztály(TForm)
...
privateprocedure SetupHackedNavigator (const Navigátor: TDBNavigator;
const Karakterjelek: TImageList);
eljárás HackNavMouseUp (Feladó: TObject; Gomb: TMouseButton;
Shift: TShiftState; X, Y: egész szám);
...

Ok, magyarázzuk meg még egyszer. A HackNavMouseUp eljárás kezeli az OnMouseUp eseményt minden egyes DBNavigator gombnál. Ha a felhasználó tartja a CTRL gombot, miközben az nbNext gombra kattint, akkor a kapcsolt adatkészlet aktuális rekordja "MoveBy" -re kerül (az 5-ös értékkel állandónak tekinthető) rekordok előre.

Mit? Túlbonyolított?

Igen. Nem kell mindent összezavarnia, ha csak a gomb kattintásakor kell ellenőriznie a vezérlőgombok állapotát. Itt van, hogyan kell ugyanezt tenni a "rendes" OnClick esemény "rendes" DBNavigator

eljárás TForm1.DBNavigator1Click
(Feladó: TObject; Gomb: TNavigateBtn);
funkció CtrlDown: logikai;
var
Állam: TKeyboardState;
kezdődik
GetKeyboardState (állam);
Eredmény: = (((állapot [vk_Control] és 128) 0);
vég;
const MoveBy: egész szám = 5;
begincase Gomb nak,-nek
nbPrior:
ha CtrlDown azután
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
ha CtrlDown azután
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
vég; //case
vég; (* DBNavigator2Click *)

Ez van, srácok

És végül, a projekt elkészült. Vagy folytathatja. Íme egy forgatókönyv / feladat / ötlet az Ön számára:

Tegyük fel, hogy csak egy gombot szeretne cserélni az nbFirst, nbPrevable, nbNext és nbLast gombokra. Az X és Y paraméterek segítségével a HackNavMouseUp eljárásban megkeresheti a kurzor helyzetét a gomb elengedésekor. Most ehhez az egy gombhoz ("hogy mindet szabályozzuk") csatolhatunk egy képet, amelynek 4 területe van, minden egyes terület valószínűleg utánozza a kicserélt gombok egyikét... érted?

instagram story viewer