Нов

Как да персонализирате DBNavigator

Как да персонализирате DBNavigator

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

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

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

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

По-мощен DBNavigator

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

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

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

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

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

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

Тъй като всеки бутон в тази защитена собственост наследява от TSpeedButton, ако получите нашите ръце, ще можете да работите със "стандартни" свойства на TSpeedButton като: Caption (низ, който идентифицира контрола за потребителя), Glyph (the растерна карта, която се появява на бутона), 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, DBGrid, DataSoure и обект от набор данни по ваш избор (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 на низ =
(„Първоначално“, „Предишен“, „По-късно“, „Финал“, „Добавяне“,
„Изтриване“, „Правилно“, „Изпращане“, „Оттегляне“, „Съживяване“);
(*
Надписи: arrayTNavigateBtn от string =
(„Първо“, „Приоритет“, „Напред“, „Последно“, „Вмъкване“,
„Изтриване“, „Редактиране“, „Публикуване“, „Отказ“, „Обновяване“);

в Хърватия (локализиран):
Надписи: arrayTNavigateBtn от string =
('Prvi', 'Предиni', 'Slijedeci', 'Zadnji', 'Add',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
Var
btn: TNavigateBtn;
beginfor btn: = ниско (TNavigateBtn) да се Висока (TNavigateBtn) направи го с THackDBNavigator (Navigator) .Buttonsbtn dobegin// от масива на надписите надписи
Надпис: = Captionsbtn;
// броя на изображенията в свойството Glyph
NumGlyphs: = 1;
// Премахнете стария глиф.
Глиф: = нула;
// Задайте персонализиран
Glyphs.GetBitmap (цяло число (BTN), Glyph);
// гилф над текста
Оформление: = blGlyphTop;
// обяснено по-късно
OnMouseUp: = HackNavMouseUp;
край;
край; (* SetupHackedNavigator *)

Добре, да обясним. Повтаряте през всички бутони в DBNavigator. Спомнете си, че всеки бутон е достъпен от защитеното свойство на масивите Buttons - следователно необходимостта от класа THackDBNavigator. Тъй като типът масив Buttons е TNavigateBtn, преминавате от бутона "първи" (използвайки функцията Low) към "последния" (използвайки функцията High). За всеки бутон просто премахвате "стария" глиф, присвоявате новия (от параметъра 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 (подателя) .Index на
nbPrior:
ако (ssCtrl в Shift) тогава
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
ако (ssCtrl в Shift) тогава
TDBNavigator (TNavButton (Sender) .Parent).
DataSource.DataSet.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 (държава);
Резултат: = ((Statevk_Control И 128) 0);
край;
конст MoveBy: цяло число = 5;
begincase бутон на
nbPrior:
ако CtrlDown тогава
DBNavigator1.DataSource.DataSet.MoveBy (-MoveBy);
nbNext:
ако CtrlDown тогава
DBNavigator1.DataSource.DataSet.MoveBy (MoveBy);
край; // случай
край(* DBNavigator2Click *)

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

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

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