Създайте и персонализирайте бутони с DBNavigator

click fraud protection

„Добре, DBNavigator върши своята работа по навигация на данни и управление на записи. За съжаление, клиентите ми искат по-удобно изживяване като потребителска графика и надписи с бутони,... "

Това запитване дойде от Делфи разработчик търсене на начин за повишаване на мощността на компонента DBNavigator.

DBNavigator е чудесен компонент - осигурява VCR-подобен интерфейс за навигация на данни и управление на записи в приложения на база данни. Навигацията за запис се осигурява от бутоните Първа, Следваща, Приоритетна и Последна. Управлението на записа се осигурява от бутоните Редактиране, Публикуване, Отказ, Изтриване, Вмъкване и Обновяване. В един компонент Delphi предоставя всичко необходимо за работа с вашите данни.

Както обаче авторът на запитването по електронната поща също заяви, DBNavigator няма някои функции като персонализирани глифове, надписи на бутони и други.

По-мощен DBNavigator

Много компоненти на Delphi имат полезни свойства и методи, които са маркирани невидими („защитени“) за разработчика на Delphi. Да се ​​надяваме, че за достъп до такива защитени членове на компонент може да се използва проста техника, наречена "защитен хак".

instagram viewer

Първо ще добавите надпис към всеки бутон на DBNavigator, след това ще добавите персонализирана графика и накрая ще активирате OnMouseUp всеки бутон.

От "скучния" DBNavigator до който и да е от:

  • Стандартна графика и персонализирани надписи
  • Само надписи
  • Персонализирана графика и персонализирани надписи

Нека рок-н-рол

DBNavigator има свойство защитени бутони. Този член е масив от TNavButton, потомък на TSpeedButton.

Тъй като всеки бутон в тази защитена собственост наследява от TSpeedButton, ако получите нашите ръце, ще можете да работите със "стандартни" свойства на TSpeedButton като: Надпис (низ, който идентифицира контрола за потребителя), Glyph (растерната карта, която се появява на бутона), Layout (определя къде се показва изображението или текстът на бутон) ...

От DBCtrls единицата (където е дефиниран DBNavigator) вие "четете", че свойството на защитените бутони е декларирано като:

Бутони: масив[TNavigateBtn] на TNavButton;

Когато TNavButton наследява от TSpeedButton, а TNavigateBtn е изброяване, дефинирано като:

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

Обърнете внимание, че TNavigateBtn съдържа 10 стойности, всяка идентифицираща различен бутон на обект TDBNavigator. Сега, нека да видим как да хакнете DBNavigator:

Подобрен DBNavigator

Първо, настройте проста форма за редактиране на данни Delphi, като поставите поне DBNavigator, a DBGrid, DataSoure и a Обект от набор данни по ваш избор (ADO, BDE, dbExpres, ...). Уверете се, че всички компоненти са "свързани".

Второ, хакнете DBNavigator, като дефинирате наследен клас "манекен" над декларацията за формуляр, като:

Тип THackDBNavigator = клас(TDBNavigator);
Тип
TForm1 = клас(TForm)
...

На следващо място, за да можете да показвате персонализирани надписи и графики на всеки бутон на DBNavigator, ще трябва да настроите някои глифове. Можете да използвате компонента TImageList и да зададете 10 снимки (.bmp или .ico), всяка от които представлява действие на определен бутон на DBNavigator.

Трето, в OnCreate събитие за Form1 добавете обаждане като:

процедура TForm1.FormCreate (подател: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
край;

Уверете се, че добавяте декларацията на тази процедура в частната част на декларацията на формуляра, като:

Тип
TForm1 = клас(TForm)
...
privateprocedure SetupHackedNavigator (конст Навигатор: TDBNavigator;
конст Глифи: TImageList);
...

Четвърто, добавете процедурата SetupHackedNavigator. Процедурата SetupHackedNavigator добавя персонализирана графика към всеки бутон и присвоява персонализирана надпис на всеки бутон.

употреби Бутони; //!!! не забравяй
процедура TForm1.SetupHackedNavigator
(конст Навигатор: TDBNavigator;
конст Глифи: TImageList);
конст
Надписи: масив[TNavigateBtn] на низ =
(„Първоначално“, „Предишен“, „По-късно“, „Финал“, „Добавяне“,
„Изтриване“, „Правилно“, „Изпращане“, „Оттегляне“, „Съживяване“);
(*
Надписи: масив [TNavigateBtn] от string =
(„Първо“, „Приоритет“, „Напред“, „Последно“, „Вмъкване“,
„Изтриване“, „Редактиране“, „Публикуване“, „Отказ“, „Обновяване“);

в Хърватия (локализиран):
Надписи: масив [TNavigateBtn] от string =
(„Първи“, „Предишни“, „Слидеци“, „Задни“, „Добавяне“,
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
Var
btn: TNavigateBtn;
beginfor btn: = ниско (TNavigateBtn) да се Висока (TNavigateBtn) направи го с THackDBNavigator (Navigator). Бутони [btn] dobegin// от масива на надписите Captions
Надпис: = Надписи [btn];
// броя на изображенията в свойството Glyph
NumGlyphs: = 1;
// Премахнете стария глиф.
Глиф: = нула;
// Задайте персонализиран
Глифове. GetBitmap (Integer (btn), Glyph);
// гилф над текста
Оформление: = blGlyphTop;
// обяснено по-късно
OnMouseUp: = HackNavMouseUp;
край;
край; (* SetupHackedNavigator *)

Добре, нека обясним. Повтаряте през всички бутони в DBNavigator. Спомнете си, че всеки бутон е достъпен от защитеното свойство на масивите Buttons - следователно необходимостта от клас THackDBNavigator. Тъй като типът масив Buttons е TNavigateBtn, преминавате от "първия" (използвайки ниско функция) бутон до "последното" (с помощта на Високо функция) един. За всеки бутон просто премахвате "стария" глиф, присвоявате новия (от параметъра Glyphs), добавяте надписа от масива Captions и маркирате оформлението на глифа.

Имайте предвид, че можете да контролирате кои бутони се показват от DBNavigator (а не от хаквания) чрез свойството VisibleButtons. Друго свойство, чиято стойност по подразбиране може да искате да промените, е Съвети - използвайте го, за да предоставите помощни съвети по ваш избор за отделния бутон на навигатора. Можете да контролирате показването на съветите, като редактирате свойството ShowHints.

Това е. Ето защо сте избрали Delphi!

Дай ми още!

Защо да се спрем тук? Знаете, че когато щракнете върху бутона 'nbNext', текущата позиция на набора от данни се придвижва към следващия запис. Какво ще стане, ако искате да преместите, да речем, 5 записа напред, ако потребителят държи клавиша CTRL, докато натиска бутона? Какво ще кажете за това?

"Стандартният" DBNavigator няма събитието OnMouseUp - това, което носи параметъра Shift на TShiftState - което ви позволява да тествате състоянието на клавишите Alt, Ctrl и Shift. DBNavigator предоставя само събитието OnClick, за да се справите.

Въпреки това THackDBNavigator може просто да изложи събитието OnMouseUp и да ви позволи да "видите" състоянието на контролните клавиши и дори позицията на курсора над конкретния бутон при натискане!

Ctrl + Кликнете: = 5 реда отпред

За да изложите OnMouseUp, просто присвоявате вашата персонализирана процедура за обработка на събития на събитието OnMouseUp за бутона на хакнатия DBNavigator. Точно това вече е направено в процедурата на SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Сега процедурата HackNavMouseUp може да изглежда така:

процедура TForm1.HackNavMouseUp
(Подател: TObject; Бутон: TMouseButton;
Shift: TShiftState; X, Y: цяло число);
конст MoveBy: цяло число = 5;
beginifНЕ (Подателят е TNavButton) тогава Exit;
случай TNavButton (Sender) .Index на
nbPrior:
ако (ssCtrl в Shift) тогава
TDBNavigator (TNavButton (Sender) .Parent).
Източник на данни. Набор от данни. MoveBy (-MoveBy);
nbNext:
ако (ssCtrl в Shift) тогава
TDBNavigator (TNavButton (Sender) .Parent).
Източник на данни. Набор от данни. MoveBy (MoveBy);
край;
край(* HackNavMouseUp *)

Обърнете внимание, че трябва да добавите подписа на процедурата HackNavMouseUp вътре в частната част на декларацията на формуляра (близо до декларацията на процедурата SetupHackedNavigator):

Тип
TForm1 = клас(TForm)
...
privateprocedure SetupHackedNavigator (конст Навигатор: TDBNavigator;
конст Глифи: TImageList);
процедура HackNavMouseUp (Подател: TObject; Бутон: TMouseButton;
Shift: TShiftState; X, Y: цяло число);
...

Добре, да обясним, още един път. Процедурата HackNavMouseUp обработва събитието OnMouseUp за всеки бутон DBNavigator. Ако потребителят държи клавиша CTRL, докато натисне бутона nbNext, текущият запис за свързания набор от данни се премества "MoveBy" (дефиниран като постоянен със стойността на 5) напред.

Какво? Прекалено сложно?

Да. Не е необходимо да се забърквате с всичко това, ако трябва само да проверите състоянието на контролните клавиши, когато натиснете бутона. Ето как да направите същото в „обикновения“ OnClick събитие на "обикновения" DBNavigator:

процедура TForm1.DBNavigator1Click
(Подател: TObject; Бутон: TNavigateBtn);
функция CtrlDown: Булев;
Var
Състояние: TKeyboardState;
започвам
GetKeyboardState (състояние);
Резултат: = ((Състояние [vk_Control] И 128) 0);
край;
конст MoveBy: цяло число = 5;
begincase бутон на
nbPrior:
ако CtrlDown тогава
DBNavigator1.DataSource. Набор от данни. MoveBy (-MoveBy);
nbNext:
ако CtrlDown тогава
DBNavigator1.DataSource. Набор от данни. MoveBy (MoveBy);
край; //case
край(* DBNavigator2Click *)

Това е всичко приятели

И накрая проектът е изпълнен. Или можете да продължите. Ето сценарий / задача / идея за вас:

Да приемем, че искате само един бутон да замени бутоните nbFirst, nbPrevious, nbNext и nbLast. Можете да използвате параметрите X и Y вътре в процедурата HackNavMouseUp, за да намерите позицията на курсора при освобождаване на бутона. Сега към този един бутон ("за да ги управлявам всички") можете да прикачите снимка, която има 4 области, като всяка област трябва да имитира един от бутоните, които замествате... имам смисъл?

instagram story viewer