Delphi. Data Controls — компоненты доступа к БД (теория3)

В данном посте посмотрим компоненты для организации полей подстановки.Во многом, я пользовался книгой Д. Осипова Базы данных и Delphi. Далее идут отрывки из этой книги.

Механизм синхронного просмотра, благодаря которому мы приобретаем возможность подставлять в основной набор данных поля из справочной таблицы, кроме сетки TDBGrid поддерживают еще два компонента: TDBLookupListBox (список) и TDBLookupComboBox (комбинированный список). Общим предком изучаемых элементов управления служит абстрактный класс TDBLookupControl. Именно в нем реализован ключевой алгоритм, позволяющий компоненту взаимодействовать со справочным набором данных.

Для осуществления синхронного просмотра программисту требуется организовать взаимодействие между основным и справочным наборами данных и указать имена внешнего, первичного ключа и название поля подстановки.
Соединение с основным набором данных производится в два действия. С помощью свойств
property DataSource: TDataSource;//источник данных базового набора данных
property DataField: String; //имя внешнего ключа
требуется определить источник данных и имя поля, являющегося внешним ключом
для связи со справочной таблицей.
После того как компонент соединится с базовой таблицей, на первый план вы-
ходит задача подключения элемента управления к справочному набору данных.

Для этого нам понадобится последовательно заполнить три свойства:
property ListSource: TDataSource; //источник данных справочного набора
property KeyField: String; //ключевое поле справочного набора
property ListField: String; //имя подстановочного поля (полей)

 

Прежде всего, необходимо присоединить компонент ко второму источнику
данных ListSource (который, в свою очередь, связан со справочным набором дан-
ных). После этого действия мы получим возможность определить имена первично-
го ключа (KeyField) и подстановочного поля (ListField). В ListField могут со-
держаться имена нескольких полей, но их названия требуется разделять точкой с
запятой. В этом случае в одной строке компонента будут выведены значения этих
полей одновременно.

 

Теперь поговорим о некоторых тонкостях класса TDBLookupControl.

Весь перечень подстановочных полей кэшируется в списке:
property ListFields: TList;
Данное свойство недоступно в инспекторе объектов, однако может сослужить
хорошую службу в тех ситуациях, когда программист осуществляет динамическое
подключение компонента во время выполнения программы. Тогда перед назначением свойства ListField имеет смысл проверять наличие поля с таким названием в списке ListFields.

Если в свойстве ListField определено несколько полей, то нам может пригодиться свойство
property ListFieldIndex: Integer;//по умолчанию ноль

Оно укажет, какое из полей (включенных в строку ListField) будет использоваться при поиске. Если мы отображаем несколько полей в компоненте

TDBLookupComboBox, то свойство ListFieldIndex определит значение в области
строки ввода.
Для проверки допустимости редактирования данных вызовите метод компонента
function CanModify: Boolean;
Для явного запрета установите в true свойство
property ReadOnly: Boolean;
Если поле базового набора данных не обязательно для заполнения и допускает
пустые значения, то для ввода неопределенного значения NULL удобно назначить
“быструю” клавишу с помощью свойства
property NullValueKey: TShortCut;


Список подстановки — TDBLookupListBox

Задача элемента управления заключается в обеспечении связи основного набора данных со справочной таблицей. Значения из справочного набора данных представляются в виде списка. Выбирая ту или иную строку в элементе управления, пользователь осуществляет подстановку выбранной записи в основной набор.

Значение выбранной строки всегда можно получить, обратившись к свойству
property SelectedItem: String;
Если ни одна из строк не выбрана, то свойство окажется пустым. Число видимых строк в компоненте определяется свойством
property RowCount: Integer;


 

Комбинированный список подстановки — TDBLookupComboBox

Элемент управления решает ту же задачу, что и компонент TDBLookupListBox.
Выбранное в комбинированном списке значение доступно в свойстве
property Text: String; //только для чтения
Метод
procedure DropDown;
принудительно извлекает выпадающий список. В момент показа списка возни-
кает событие
property OnDropDown: TNotifyEvent;
Пока список виден, свойство
property ListVisible: Boolean;//только для чтения
возвращает значение true.
Для скрытия выпадающего списка применяйте метод
procedure CloseUp(Accept: Boolean);
При этом возникает другое событие
property OnCloseUp: TNotifyEvent;
Три свойства определяют особенности выпадающего списка:
property DropDownAlign: TDropDownAlign;//выравнивание
property DropDownRows: Integer; //число видимых строк в списке
property DropDownWidth: Integer;//ширина списка в пикселах


 

Навигатор — TDBNavigator

Навигатор по набору данных создан на основе класса TCustomPanel и визуально представляет собой группу кнопок (рис. 29.3). Компонент инкапсулирует в себе “золотой” минимум методов, достаточных для создания простейшего приложения, работающего с таблицей базы данных. Сразу после подключения к источнику данных при помощи свойства DataSource элемент управления сможет обеспечить перемещение по записям в наборе, вставку, редактирование и удаление записи. Достаточно щелкнуть по соответствующей кнопке. Другими словами, навигатор — отличный подарок для лентяя, т. к. позволяет создать элементарное приложение
без единой строки кода.

6

По умолчанию компонент содержит 10 кнопок, однако по желанию программиста вполне можно отказаться от показа ненужных элементов. Для этого следует настроить свойство
property VisibleButtons: TButtonSet;
type TButtonSet = set of TNavigateBtn;
type TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Полагаю, что в особых комментариях тип данных TNavigateBtn не нуждается:
nbFirst — кнопка “Первая запись”, nbPrior — “Предыдущая запись” и т. д.
Если вы не собираетесь предоставить пользователю возможность удалять запись, то спрячьте кнопку удаления nbDelete:
DBNavigator1.VisibleButtons:=DBNavigator1.VisibleButtons-[nbDelete];

Как и практически все визуальные элементы управления VCL, навигатор обладает элементарным обработчиком события OnClick() . Правда, несколько усовершенствованным (компонент способен различать, по какой из кнопок был произведен щелчок):
property OnClick: ENavClick;
type ENavClick = procedure (Sender: TObject;
Button: TNavigateBtn) of object;
Благодаря параметру Button, можно узнать, какая из кнопок выступила инициатором события.
Перед выполнением операции, сопоставленной с кнопкой, возникает событие
property BeforeAction: ENavClick;
В навигаторе реализован дополнительный “рубеж обороны” по предотвращению несанкционированного удаления записи.

Установив в true свойство

property ConfirmDelete: Boolean;
мы заставим компонент выводить сообщение, требующее подтвердить операцию
удаления.
Для придания кнопкам модного плоского вида переведите в true свойство
property Flat: Boolean;

Несмотря на то, что TDBNavigator представляет собой монолитный компонент, для каждой своей кнопки он умеет отображать самостоятельную всплывающую подсказку. Для назначения текстов подсказок реализован набор строк

property Hints: TStrings;
При заполнении свойства данными требуется соблюдать последовательность строк: первая строка подсказки соответствует кнопке “Первая запись”, вторая — “Предыдущая запись”, последняя — “Обновить данные” (точно в том порядке, как размещены кнопки компонента). В противном случае подсказки перепутаются.

This entry was posted in DBExpress, Delphi. Bookmark the permalink.