Luo ja mukauta painikkeita DBNavigatorilla

"Ok, DBNavigator suorittaa tehtävänsä selata tietoja ja hallita tietoja. Valitettavasti asiakkaani haluavat käyttäjäystävällisemmän kokemuksen, kuten mukautetut painikegrafiikat ja tekstitykset... "

Tämä kysely tuli a Delphin kehittäjä etsimällä tapaa parantaa DBNavigator-komponentin tehoa.

DBNavigator on loistava komponentti - se tarjoaa videonauhurin kaltaisen käyttöliittymän tietojen navigoimiseen ja tietueiden hallintaan tietokantasovelluksissa. Äänitysnavigointi tapahtuu painikkeilla Ensimmäinen, Seuraava, Ennen ja Viimeinen. Tietueiden hallinta tapahtuu Muokkaa-, Lähetä-, Peruuta-, Poista-, Lisää- ja Päivitä-painikkeilla. Yhdessä komponentissa Delphi tarjoaa kaiken tarvitsemasi tietojen käyttämiseen.

Kuten sähköpostikyselyn kirjoittaja myös totesi, DBNavigatorista puuttuu joitain ominaisuuksia, kuten mukautetut kuviot, painikkeiden kuvateksti ja muut.

Tehokkaampi DBNavigator

Monilla Delphi-komponenteilla on hyödyllisiä ominaisuuksia ja menetelmiä, jotka on merkitty näkymättömiksi ("suojatuiksi") Delphi-kehittäjälle. Toivottavasti pääsyyn komponentin tällaisiin suojattuihin jäseniin voidaan käyttää yksinkertaista tekniikkaa, jota kutsutaan "suojatuksi hakataksi".

instagram viewer

Lisää ensin kuvateksti jokaiseen DBNavigator-painikkeeseen, lisää sitten mukautettuja grafiikoita ja lopuksi otat OnMouseUp-toiminnon käyttöön jokaisen painikkeen.

"Tylsestä" DBNavigatorista jompaan kumpaan seuraavista:

  • Vakiografiikka ja mukautetut tekstitykset
  • Vain tekstitykset
  • Muokatut grafiikat ja kuvatekstit

Let's rock 'n' roll

DBNavigatorilla on suojattu painikkeet -ominaisuus. Tämä jäsen on joukko TNavButtonia, TSpeedButtonin jälkeläisiä.

Koska jokainen tämän suojatun ominaisuuden painike perii TSpeedButtonilta, voit saada käskemme siihen, joten voit työskennellä "vakio" TSpeedButton -ominaisuuksien kanssa, kuten: Kuvateksti (merkkijono, joka tunnistaa käyttäjän ohjauksen), Glyph (painikkeessa näkyvä bittikartta), Asettelu (määrittää, missä kuva tai teksti näkyy painike) ...

DBCtrls-yksiköstä (jossa DBNavigator on määritelty) "luet", että suojatut painikkeet -ominaisuus ilmoitetaan:

painikkeet: ryhmä[TNavigateBtn] of TNavButton;

Kun TNavButton perii TSpeedButtonilta ja TNavigateBtn on luettelo, joka määritetään seuraavasti:

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

Huomaa, että TNavigateBtn sisältää 10 arvoa, joista kukin identifioi eri painikkeet TDBNavigator-objektissa. Katsotaanpa nyt kuinka hakkeroida DBNavigator:

Parannettu DBNavigator

Asenna ensin yksinkertainen Delphi-lomake tietojen muokkaamiseksi asettamalla ainakin DBNavigator, a DBGrid, DataSoure ja a Tietojoukko-objekti valintasi mukaan (ADO, BDE, dbExpres, ...). Varmista, että kaikki komponentit on "kytketty".

Toiseksi hakkeroi DBNavigaattori määrittelemällä peritty "nuken" luokka lomakeilmoituksen yläpuolelle, kuten:

tyyppi THackDBNavigator = luokka(TDBNavigator);
tyyppi
TForm1 = luokka(TForm)
...

Seuraavaksi, jotta pystyt näyttämään mukautettuja kuvatekstejä ja grafiikkaa jokaisessa DBNavigator-painikkeessa, sinun on määritettävä joitain kuvioita. Voit käyttää TImageList-komponenttia ja määrittää 10 kuvaa (.bmp tai .ico), joista kukin edustaa DBNavigatorin tietyn painikkeen toimintoa.

Kolmanneksi OnCreate-tapahtuma lisää lomakkeelle 1 puhelu kuten:

menettely TForm1.FormCreate (Lähettäjä: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
pää;

Muista lisätä tämän menettelytavan ilmoitus lomakkeen yksityiseen osaan, kuten:

tyyppi
TForm1 = luokka(TForm)
...
privateprocedure SetupHackedNavigator (const Navigaattori: TDBNavigator;
const Kuviot: TImageList);
...

Neljänneksi, lisää SetupHackedNavigator -menettely. SetupHackedNavigator -toiminto lisää mukautetut grafiikat jokaiselle painikkeelle ja määrittää mukautetun kuvatekstin jokaiselle painikkeelle.

käyttötarkoitukset napit; //!!! älä unohda
menettely TForm1.SetupHackedNavigator
(const Navigaattori: TDBNavigator;
const Kuviot: TImageList);
const
kuvatekstit: ryhmä[TNavigateBtn] merkkijono =
('Alkuperäinen', 'Edellinen', 'Myöhemmin', 'Lopullinen', 'Lisää',
'Poista', 'Oikea', 'Lähetä', 'Peruuta', 'Revive');
(*
Tekstitykset: taulukon [TNavigateBtn] merkkijono =
('Ensimmäinen', 'Ennen', 'Seuraava', 'Viimeinen', 'Lisää',
'Poista', 'Muokkaa', 'Lähetä', 'Peruuta', 'Päivitä');

Kroatiassa (paikallisesti):
Tekstitykset: taulukon [TNavigateBtn] merkkijono =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
beginfor btn: = alhainen (TNavigateBtn) että Korkea (TNavigateBtn) tehdä jollain THackDBNavigator (Navigator) .Painikkeet [btn] dobegin// Kuvatekstien const-taulukosta
Kuvateksti: = Kuvateksti [btn];
// Glyph-ominaisuuden kuvien lukumäärä
NumGlyphs: = 1;
// Poista vanha kuvio.
Glyph: = nolla;
// Määritä mukautettu
Kuvioita. GetBitmap (kokonaisluku (btn), Glyph);
// gylph tekstin yläpuolella
Asettelu: = blGlyphTop;
// selitetty myöhemmin
OnMouseUp: = HackNavMouseUp;
pää;
pää; (* SetupHackedNavigator *)

Ok, selitetään. Toistat kaikki DBNavigator-painikkeet. Muista, että jokaiseen painikkeeseen pääsee suojatusta Buttons array -ominaisuudesta - siksi THackDBNavigator-luokan tarve. Koska Painikkeet-ryhmän tyyppi on TNavigateBtn, siirryt "ensimmäisestä" (käyttämällä Matala toiminto) -painiketta "viimeiseen" (painikkeella Korkea toiminto) yksi. Kustakin painikkeesta voit poistaa "vanhan" kuvion, määrittää uuden (Glyphs-parametrista), lisätä kuvatekstin Tekstitykset-taulukosta ja merkitä kuvion asettelun.

Huomaa, että voit hallita, mitä painikkeita DBNavigator (ei hakkeroitu) näyttää VisibleButtons-ominaisuuden kautta. Toinen ominaisuus, jonka oletusarvoa haluat ehkä muuttaa, on Vihjeet. Käytä sitä toimittamaan yksittäisen navigointipainikkeen valitsemasi ohjeohjeet. Voit hallita Vihjeiden näyttöä muokkaamalla ShowHints-ominaisuutta.

Se siitä. Siksi olet valinnut Delphin!

Anna minulle lisää!

Miksi lopettaa täällä? Tiedät, että kun napsautat 'nbNext' -painiketta, tietojoukon nykyinen sijainti siirretään seuraavaan tietueeseen. Entä jos haluat siirtää, sanotaan, 5 tietuetta eteenpäin, jos käyttäjä pitää CTRL-näppäintä painettuna painiketta? Entä se?

"Tavallisessa" DBNavigatorissa ei ole OnMouseUp-tapahtumaa - joka sisältää TShiftState-vaihtoparametrin -, jonka avulla voit testata Alt-, Ctrl- ja Shift-näppäinten tilaa. DBNavigator tarjoaa vain OnClick-tapahtuman, jota voit käsitellä.

THackDBNavigator voi kuitenkin vain paljastaa OnMouseUp-tapahtuman ja antaa sinun "nähdä" ohjausnäppäimien tilan ja jopa kohdistimen sijainnin tietyn painikkeen yläpuolella napsautettaessa!

Ctrl + napsautus: = 5 riviä eteenpäin

Voit paljastaa OnMouseUp-sovelluksen määrittämällä mukautetun tapahtumien käsittelymenettelyn hakkeroidun DBNavigator-painikkeen OnMouseUp-tapahtumaan. Tämä tarkalleen on jo tehty SetupHackedNavigator-menettelyssä:
OnMouseUp: = HackNavMouseUp;

Nyt HackNavMouseUp-menettely voisi näyttää:

menettely TForm1.HackNavMouseUp
(Lähettäjä: TObject; Painike: TMouseButton;
Vaihto: TShiftState; X, Y: kokonaisluku);
const MoveBy: kokonaisluku = 5;
beginifEI (Lähettäjä on TNavButton) sitten exit;
tapaus TNavButton (lähettäjä) .Index of
nbPrior:
jos (ssCtrl vuorossa) sitten
TDBNavigator (TNavButton (lähettäjä). Vanhempi).
Tietolähde. DataSet. MoveBy (-MoveBy);
nbNext:
jos (ssCtrl vuorossa) sitten
TDBNavigator (TNavButton (lähettäjä). Vanhempi).
Tietolähde. DataSet. MoveBy (MoveBy);
pää;
pää; (* HackNavMouseUp *)

Huomaa, että sinun on lisättävä HackNavMouseUp-menettelyn allekirjoitus lomakkeen ilmoituksen yksityiseen osaan (lähellä SetupHackedNavigator -proseduurin ilmoitusta):

tyyppi
TForm1 = luokka(TForm)
...
privateprocedure SetupHackedNavigator (const Navigaattori: TDBNavigator;
const Kuviot: TImageList);
menettely HackNavMouseUp (Lähettäjä: TObject; Painike: TMouseButton;
Vaihto: TShiftState; X, Y: kokonaisluku);
...

Ok, selitetään vielä kerran. HackNavMouseUp-menettely käsittelee OnMouseUp-tapahtuman jokaiselle DBNavigator-painikkeelle. Jos käyttäjä pitää CTRL-näppäintä samalla kun napsauttaa nbNext-painiketta, linkitetyn tietojoukon nykyinen tietue siirretään eteenpäin "MoveBy" (määritelty vakiona arvolla 5).

Mitä? Liian monimutkainen?

Jep. Sinun ei tarvitse sekoittaa tätä kaikkea, jos sinun on tarkistettava ohjausnäppäimien tila vain, kun painiketta napsautettiin. Näin voit tehdä saman "tavallisessa" OnClick-tapahtuma "tavallisesta" DBNavigatorista:

menettely TForm1.DBNavigator1Click
(Lähettäjä: TObject; Painike: TNavigateBtn);
toimia CtrlDown: Boolen;
var
Tila: TKeyboardState;
alkaa
GetKeyboardState (osavaltio);
Tulos: = ((tila [vk_Control] ja 128) 0);
pää;
const MoveBy: kokonaisluku = 5;
begincase nappi of
nbPrior:
jos CtrlDown sitten
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
jos CtrlDown sitten
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
pää; //case
pää; (* DBNavigator2Click *)

Siinä kaikki ihmiset

Ja lopuksi projekti on valmis. Tai voit jatkaa. Tässä on skenaario / tehtävä / idea sinulle:

Oletetaan, että haluat vain yhden painikkeen korvata nbFirst-, nbPrevable-, nbNext- ja nbLast-painikkeet. Voit käyttää HackNavMouseUp-menettelyn sisällä olevia X- ja Y-parametreja kohdistimen sijainnin löytämiseksi, kun painike vapautettiin. Nyt tähän yhteen painikkeeseen ("hallita niitä kaikkia") voit kiinnittää kuvan, jolla on 4 aluetta. Jokaisen alueen oletetaan jäljittelevän jotain vaihdettavista painikkeista... sai pisteen?