«Хорошо, DBNavigator выполняет свою работу по перемещению данных и управлению записями. К сожалению, мои клиенты хотят иметь более удобный пользовательский интерфейс, например, пользовательские графические кнопки и подписи,... »
Этот запрос пришел от Разработчик Delphi поиск способа повысить мощность компонента DBNavigator.
DBNavigator является отличным компонентом - он обеспечивает VCR-подобный интерфейс для навигации по данным и управления записями в приложениях баз данных. Навигация по записи обеспечивается кнопками «Первый», «Далее», «Приоритет» и «Последний» Управление записями осуществляется кнопками «Редактировать», «Опубликовать», «Отмена», «Удалить», «Вставить» и «Обновить». В одном компоненте Delphi предоставляет все необходимое для работы с вашими данными.
Однако, как также указал автор запроса по электронной почте, в DBNavigator отсутствуют некоторые функции, такие как пользовательские символы, заголовки кнопок и другие.
Более мощный DBNavigator
Многие компоненты Delphi имеют полезные свойства и методы, помеченные как невидимые («защищенные») для разработчика Delphi. Надеемся, что для доступа к таким защищенным элементам компонента можно использовать простую технику, называемую «защищенный взлом».
Сначала вы добавите подпись к каждой кнопке DBNavigator, затем добавите пользовательскую графику и, наконец, включите OnMouseUp для каждой кнопки.
От «скучного» DBNavigator до любого из:
- Стандартная графика и пользовательские подписи
- Только подписи
- Пользовательская графика и пользовательские подписи
Давай рок-н-ролл
DBNavigator имеет защищенное свойство Buttons. Этот член является массивом TNavButton, потомка TSpeedButton.
Поскольку каждая кнопка в этом защищенном свойстве наследуется от TSpeedButton, если вы возьмете его в свои руки, вы сможете работать со «стандартными» свойствами TSpeedButton, такими как: Заголовок (строка, которая идентифицирует элемент управления для пользователя), Glyph (растровое изображение, которое появляется на кнопке), Layout (определяет, где изображение или текст появляется на кнопка) ...
Из модуля DBCtrls (где определяется DBNavigator) вы «читаете», что защищенное свойство Buttons объявлено как:
Кнопки: массив[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, определив унаследованный «фиктивный» класс над объявлением Form, например:
тип THackDBNavigator = учебный класс(TDBNavigator);
тип
TForm1 = учебный класс(ТГогт)
...
Далее, чтобы иметь возможность отображать пользовательские подписи и графику на каждой кнопке DBNavigator, вам нужно настроить некоторые глифы. Вы можете использовать компонент TImageList и назначить 10 изображений (.bmp или .ico), каждое из которых представляет действие определенной кнопки DBNavigator.
В-третьих, в Событие OnCreate для Form1 добавьте вызов как:
процедура TForm1.FormCreate (Отправитель: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
конец;
Убедитесь, что вы добавили объявление этой процедуры в приватную часть объявления формы, например:
тип
TForm1 = учебный класс(ТГогт)
...
privateprocedure SetupHackedNavigator (Const Навигатор: TDBNavigator;
Const Глифы: TImageList);
...
В-четвертых, добавьте процедуру SetupHackedNavigator. Процедура SetupHackedNavigator добавляет пользовательскую графику для каждой кнопки и назначает пользовательскую подпись для каждой кнопки.
использования Кнопки; //!!! не забывай
процедура TForm1.SetupHackedNavigator
(Const Навигатор: TDBNavigator;
Const Глифы: TImageList);
Const
Титры: массив[TNavigateBtn] строки =
(«Начальный», «Предыдущий», «Поздний», «Конечный», «Добавить»,
«Стереть», «Исправить», «Отправить», «Снять», «Возродить»);
(*
Подписи: массив [TNavigateBtn] из строки =
(«Первый», «Приоритетный», «Следующий», «Последний», «Вставить»,
«Удалить», «Редактировать», «Опубликовать», «Отменить», «Обновить»);
в Хорватии (локализовано):
Подписи: массив [TNavigateBtn] из строки =
(«Prvi», «Prethodni», «Slijedeci», «Zadnji», «Dodaj»,
«Обриси», «Промжени», «Спреми», «Одустани», «Освези»);
*)
вар
btn: TNavigateBtn;
beginfor btn: = Low (TNavigateBtn) в Высокий (TNavigateBtn) dowith THackDBNavigator (Navigator). Кнопки [btn] dobegin// из константного массива Captions
Подпись: = подписи [btn];
// количество изображений в свойстве Glyph
NumGlyphs: = 1;
// Удалить старый глиф.
Глиф: = ноль;
// Назначаем пользовательский
Глифы. GetBitmap (Integer (btn), Glyph);
// gylph над текстом
Layout: = 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 + Click: = 5 строк впереди
Чтобы открыть OnMouseUp, вы просто назначаете свою пользовательскую процедуру обработки события OnMouseUp для кнопки взломанного DBNavigator. Это точно уже сделано в процедуре SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;
Теперь процедура HackNavMouseUp может выглядеть так:
процедура TForm1.HackNavMouseUp
(Отправитель: TObject; Кнопка: TMouseButton;
Shift: TShiftState; X, Y: целое число);
Const MoveBy: целое число = 5;
beginifНЕ (Отправитель TNavButton) тогда Выход;
кейс TNavButton (Отправитель). Индекс из
nbPrior:
если (ssCtrl в Shift) тогда
TDBNavigator (TNavButton (Отправитель). Родитель).
Источник данных. DataSet. MoveBy (-MoveBy);
nbNext:
если (ssCtrl в Shift) тогда
TDBNavigator (TNavButton (Отправитель). Родитель).
Источник данных. DataSet. MoveBy (MoveBy);
конец;
конец; (* HackNavMouseUp *)
Обратите внимание, что вам нужно добавить сигнатуру процедуры HackNavMouseUp внутри закрытой части объявления формы (рядом с объявлением процедуры SetupHackedNavigator):
тип
TForm1 = учебный класс(ТГогт)
...
privateprocedure SetupHackedNavigator (Const Навигатор: TDBNavigator;
Const Глифы: TImageList);
процедура HackNavMouseUp (Отправитель: TObject; Кнопка: TMouseButton;
Shift: TShiftState; X, Y: целое число);
...
Хорошо, давайте объясним еще раз. Процедура HackNavMouseUp обрабатывает событие OnMouseUp для каждой кнопки DBNavigator. Если пользователь удерживает клавишу CTRL при нажатии кнопки nbNext, текущая запись для связанного набора данных перемещается на «MoveBy» (определяется как константа со значением 5) записей вперед.
Какая? Усложненной?
Ага. Вам не нужно связываться со всем этим, если вам нужно только проверять состояние клавиш управления при нажатии кнопки. Вот как сделать то же самое в «обычном» Событие OnClick "обычного" DBNavigator:
процедура TForm1.DBNavigator1Click
(Отправитель: TObject; Кнопка: TNavigateBtn);
функция CtrlDown: Boolean;
вар
Состояние: TKeyboardState;
начать
GetKeyboardState (State);
Результат: = ((State [vk_Control] и 128) 0);
конец;
Const MoveBy: целое число = 5;
begincase кнопка из
nbPrior:
если CtrlDown тогда
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
если CtrlDown тогда
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
конец; //case
конец; (* DBNavigator2Click *)
Это все люди
И наконец, проект завершен. Или вы можете продолжать идти. Вот сценарий / задача / идея для вас:
Допустим, вы хотите, чтобы только одна кнопка заменяла кнопки nbFirst, nbPrevious, nbNext и nbLast. Вы можете использовать параметры X и Y внутри процедуры HackNavMouseUp, чтобы найти положение курсора, когда кнопка была отпущена. Теперь к этой одной кнопке («чтобы управлять ими всеми») вы можете прикрепить картинку, которая имеет 4 области, каждая область должна имитировать одну из кнопок, которые вы заменяете... понял?