Utwórz i dostosuj przyciski za pomocą DBNavigator

„Ok, DBNavigator ma za zadanie nawigację danych i zarządzanie rekordami. Niestety, moi klienci oczekują bardziej przyjaznej obsługi, takiej jak niestandardowe grafiki przycisków i podpisy... ”

To zapytanie pochodzi od Deweloper Delphi poszukiwanie sposobu na zwiększenie mocy komponentu DBNavigator.

DBNavigator to świetny komponent - zapewnia interfejs podobny do magnetowidu do nawigacji danych i zarządzania rekordami w aplikacjach bazodanowych. Nawigację po rekordach zapewniają przyciski Pierwszy, Następny, Poprzedni i Ostatni. Zarządzanie rekordami zapewniają przyciski Edytuj, Opublikuj, Anuluj, Usuń, Wstaw i Odśwież. W jednym komponencie Delphi zapewnia wszystko, czego potrzebujesz, aby operować na danych.

Jednak, jak stwierdził również autor zapytania e-mail, DBNavigator nie ma niektórych funkcji, takich jak niestandardowe glify, podpisy przycisków i inne.

Bardziej wydajny DBNavigator

Wiele komponentów Delphi ma użyteczne właściwości i metody, które są oznaczone jako niewidoczne („chronione”) dla programisty Delphi. Mamy nadzieję, że aby uzyskać dostęp do takich chronionych elementów komponentu, można zastosować prostą technikę zwaną „chronionym włamaniem”.

instagram viewer

Najpierw dodasz podpis do każdego przycisku DBNavigator, następnie dodasz niestandardową grafikę, a na końcu uaktywnisz OnMouseUp dla każdego przycisku.

Od „nudnego” DBNavigatora do jednego z:

  • Standardowa grafika i niestandardowe podpisy
  • Tylko podpisy
  • Niestandardowa grafika i niestandardowe podpisy

Let's Rock 'n' Roll

DBNavigator ma chronioną właściwość Buttons. Ten element jest tablicą TNavButton, potomka TSpeedButton.

Ponieważ każdy przycisk w tej chronionej właściwości dziedziczy po TSpeedButton, jeśli go dostaniesz, będziesz mógł pracować ze „standardowymi” właściwościami TSpeedButton, takimi jak: Podpis (ciąg identyfikujący kontrolę dla użytkownika), Glif (bitmapa wyświetlana na przycisku), Układ (określa, gdzie obraz lub tekst pojawia się na przycisk)...

Z jednostki DBCtrls (gdzie zdefiniowano DBNavigator) „czytasz”, że chroniona właściwość Buttons jest zadeklarowana jako:

Guziki: szyk[TNavigateBtn] z TNavButton;

Gdzie TNavButton dziedziczy po TSpeedButton, a TNavigateBtn jest wyliczeniem zdefiniowanym jako:

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

Zauważ, że TNavigateBtn posiada 10 wartości, z których każda identyfikuje inny przycisk na obiekcie TDBNavigator. Zobaczmy teraz, jak zhakować DBNavigator:

Ulepszony DBNavigator

Najpierw skonfiguruj prosty formularz do edycji danych Delphi, umieszczając przynajmniej DBNavigator, a DBGrid, DataSoure i a Obiekt zestawu danych do wyboru (ADO, BDE, dbExpres, ...). Upewnij się, że wszystkie komponenty są „połączone”.

Po drugie, zhakuj DBNavigator, definiując odziedziczoną klasę „obojętną” powyżej deklaracji Form, na przykład:

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

Następnie, aby móc wyświetlać niestandardowe podpisy i grafikę na każdym przycisku DBNavigator, musisz skonfigurować niektóre glify. Możesz użyć komponentu TImageList i przypisać 10 zdjęć (.bmp lub .ico), z których każde reprezentuje działanie określonego przycisku DBNavigator.

Po trzecie, w Zdarzenie OnCreate do formularza Form1 dodaj połączenie takie jak:

procedura TForm1.FormCreate (Sender: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
koniec;

Pamiętaj, aby dodać deklarację tej procedury w prywatnej części deklaracji formularza, na przykład:

rodzaj
TForm1 = klasa(TForm)
...
procedura prywatna SetupHackedNavigator (const Nawigator: TDBNavigator;
const Glify: TImageList);
...

Po czwarte, dodaj procedurę SetupHackedNavigator. Procedura SetupHackedNavigator dodaje niestandardową grafikę do każdego przycisku i przypisuje niestandardowy podpis do każdego przycisku.

wykorzystuje Guziki; //!!! nie zapomnij
procedura TForm1.SetupHackedNavigator
(const Nawigator: TDBNavigator;
const Glify: TImageList);
const
Podpisy: szyk[TNavigateBtn] sznurka =
(„Początkowy”, „Poprzedni”, „Później”, „Końcowy”, „Dodaj”,
„Usuń”, „Popraw”, „Wyślij”, „Wycofaj”, „Przywróć”);
(*
Podpisy: tablica [TNavigateBtn] ciągu =
(„Pierwszy”, „Przed”, „Następny”, „Ostatni”, „Wstaw”,
„Usuń”, „Edytuj”, „Opublikuj”, „Anuluj”, „Odśwież”);

w Chorwacji (zlokalizowane):
Podpisy: tablica [TNavigateBtn] ciągu =
(„Prvi”, „Prethodni”, „Slijedeci”, „Zadnji”, „Dodaj”,
„Obrisi”, „Promjeni”, „Spremi”, „Odustani”, „Osvjezi”);
*)
var
btn: TNavigateBtn;
beginfor btn: = Low (TNavigateBtn) do Wysoka (TNavigateBtn) zrobić z THackDBNavigator (Navigator). Przyciski [btn] dobegin// z tablicy Constions const
Caption: = Captions [btn];
// liczba obrazów we właściwości Glyph
NumGlyphs: = 1;
// Usuń stary glif.
Glif: = zero;
// Przypisz niestandardowy
Glify GetBitmap (Integer (btn), Glyph);
// Gylph nad tekstem
Układ: = blGlyphTop;
// wyjaśniono później
OnMouseUp: = HackNavMouseUp;
koniec;
koniec; (* SetupHackedNavigator *)

Ok, wyjaśnijmy. Iterujesz przez wszystkie przyciski DBNavigator. Przypomnij sobie, że każdy przycisk jest dostępny z chronionej właściwości tablicy Buttons - dlatego potrzeba klasy THackDBNavigator. Ponieważ typem tablicy Buttons jest TNavigateBtn, przechodzisz od „pierwszego” (używając Niska funkcja) do „ostatniego” (za pomocą Wysoki funkcja) jeden. Dla każdego przycisku wystarczy usunąć „stary” glif, przypisać nowy (z parametru Glify), dodać podpis z tablicy podpisów i zaznaczyć układ glifu.

Zauważ, że możesz kontrolować, które przyciski są wyświetlane przez DBNavigator (nie zahakowany) za pomocą jego właściwości VisibleButtons. Inną właściwością, której wartość domyślną możesz zmienić, są Podpowiedzi - użyj jej, aby podać wybrane podpowiedzi pomocy dla poszczególnych przycisków nawigacyjnych. Możesz kontrolować wyświetlanie podpowiedzi, edytując właściwość ShowHints.

Otóż ​​to. Właśnie dlatego wybrałeś Delphi!

Daj mi więcej!

Po co się tu zatrzymywać? Wiesz, że po kliknięciu przycisku „nbNext” bieżąca pozycja zestawu danych jest przenoszona do następnego rekordu. Co jeśli chcesz przenieść, powiedzmy, 5 rekordów do przodu, jeśli użytkownik przytrzymuje klawisz CTRL podczas naciskania przycisku? Co ty na to?

„Standardowy” DBNavigator nie ma zdarzenia OnMouseUp - tego, które przenosi parametr Shift w TShiftState - umożliwiając testowanie stanu klawiszy Alt, Ctrl i Shift. DBNavigator zapewnia tylko zdarzenie OnClick do obsługi.

Jednak THackDBNavigator może po prostu ujawnić zdarzenie OnMouseUp i umożliwić „zobaczenie” stanu klawiszy kontrolnych, a nawet pozycji kursora nad danym przyciskiem po kliknięciu!

Ctrl + kliknięcie: = 5 rzędów do przodu

Aby ujawnić OnMouseUp, wystarczy przypisać niestandardową procedurę obsługi zdarzeń do zdarzenia OnMouseUp dla przycisku zhakowanego DBNavigatora. To właśnie zostało już zrobione w procedurze SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Teraz procedura HackNavMouseUp może wyglądać następująco:

procedura TForm1.HackNavMouseUp
(Nadawca: TObject; Przycisk: TMouseButton;
Shift: TShiftState; X, Y: liczba całkowita);
const MoveBy: liczba całkowita = 5;
beginifNIE (Nadawca to TNavButton) następnie Wyjście;
walizka TNavButton (Sender) .Index z
nbPrior:
gdyby (ssCtrl w Shift) następnie
TDBNavigator (TNavButton (Sender) .Parent).
Źródło danych. DataSet. MoveBy (-MoveBy);
nbDalej:
gdyby (ssCtrl w Shift) następnie
TDBNavigator (TNavButton (Sender) .Parent).
Źródło danych. DataSet. MoveBy (MoveBy);
koniec;
koniec; (* HackNavMouseUp *)

Pamiętaj, że musisz dodać podpis procedury HackNavMouseUp w prywatnej części deklaracji formularza (w pobliżu deklaracji procedury SetupHackedNavigator):

rodzaj
TForm1 = klasa(TForm)
...
procedura prywatna SetupHackedNavigator (const Nawigator: TDBNavigator;
const Glify: TImageList);
procedura HackNavMouseUp (Sender: TObject; Przycisk: TMouseButton;
Shift: TShiftState; X, Y: liczba całkowita);
...

Ok, wyjaśnijmy jeszcze raz. Procedura HackNavMouseUp obsługuje zdarzenie OnMouseUp dla każdego przycisku DBNavigator. Jeśli użytkownik przytrzymuje klawisz CTRL podczas klikania przycisku nbNext, bieżący rekord dla połączonego zestawu danych zostanie przeniesiony do przodu „MoveBy” (zdefiniowany jako stały o wartości 5).

Co? Zbyt skomplikowane?

Tak. Nie musisz z tym bałaganu, jeśli musisz tylko sprawdzić stan klawiszy kontrolnych po kliknięciu przycisku. Oto jak to zrobić w „zwykłym” Zdarzenie OnClick „zwykłego” DBNavigatora:

procedura TForm1.DBNavigator1Click
(Nadawca: TObject; Przycisk: TNavigateBtn);
funkcjonować CtrlDown: Boolean;
var
Stan: TKeyboardState;
zaczynać
GetKeyboardState (stan);
Wynik: = ((stan [vk_Control] i 128) 0);
koniec;
const MoveBy: liczba całkowita = 5;
startcase Przycisk z
nbPrior:
gdyby CtrlDown następnie
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbDalej:
gdyby CtrlDown następnie
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
koniec; //case
koniec; (* DBNavigator2Click *)

To wszyscy ludzie

I wreszcie projekt jest skończony. Lub możesz kontynuować. Oto scenariusz / zadanie / pomysł dla Ciebie:

Załóżmy, że chcesz, aby tylko jeden przycisk zastąpił przyciski nbFirst, nbPrevious, nbNext i nbLast. Możesz użyć parametrów X i Y wewnątrz procedury HackNavMouseUp, aby znaleźć pozycję kursora po zwolnieniu przycisku. Teraz do tego jednego przycisku („aby rządzić nimi wszystkimi”) możesz dołączyć zdjęcie, które ma 4 obszary, każdy obszar ma naśladować jeden z zastępowanych przycisków... rozumiesz?