Назад | Содержание | Вперед |
До этого момента мы рассмотрели аспекты создания приложений баз данных, касающиеся организации доступа к данным и создания в приложениях наборов данных. Теперь более подробно остановимся на вопросах отображения данных в приложениях (интерфейс приложений).
Отображение данных обеспечивает достаточно представительный набор компонентов VCL Delphi. Многие из них унаследованы от компонентов, инкапсулирующих стандартные элементы управления. Для связи с набором данных эти компоненты используют компонент TDataSource.
Механизмы управления данными реализованы в компонентах наборов данных и активно взаимодействуют с компонентами отображения данных.
В этой главе рассматриваются следующие вопросы:
Все компоненты отображения данных можно разделить на группы по нескольким критериям (рис. 15.1).
Большинство компонентов предназначены для работы с отдельным полем, т. е. при перемещении по записям набора данных такие компоненты показывают текущие значения только одного поля. Для соединения с набором данных через компонент TDataSource предназначено свойство DataSource. Поле задается свойством DataField.
Компоненты TDBGrid и TDBCtrlGrid обеспечивают просмотр наборов данных целиком или в произвольном сочетании полей. В них присутствует только свойство DataSource.
Особенную роль среди компонентов отображения данных играет компонент TDBNavigator. Он не показывает данные и не предназначен для их редактирования, зато обеспечивает навигацию по набору данных.
Наиболее часто в практике программирования используются компоненты TDBGrid, TDBEdit И TDBNavigator.
Рис. 15.1. Классификация компонентов отображения данных
Для представления и редактирования информации, содержащейся в полях типа Memo, используются специальные компоненты TDBMemo и TDBRichEdit.
Для просмотра (без редактирования) изображений предназначен компонент TDBImage.
Отдельную группу составляют компоненты синхронного просмотра данных. Они обеспечивают показ значений поля из одной таблицы в соответствии со значениями поля из другой таблицы.
Наконец, данные можно представить в виде графика. Для этого предназначен компонент TDBChart.
Как видите, набор компонентов отображения данных весьма разнообразен и позволяет решать задачи по созданию любых интерфейсов для приложений баз данных.
Ввиду общности решаемых задач, компоненты отображения данных имеют несколько важных общих свойств, которые представлены в табл. 15.1 и в дальнейшем изложении опущены.
Таблица 15.1. Общие свойства компонентов отображения данных
Объявление |
Описание |
property DataField: string; |
Поле связанного с компонентом набора данных |
property DataSource: TDataSource; |
Связываемый с компонентом компонент TDataSource |
property Field: Tfield; |
Обеспечивает доступ к классу TField, который соответствует полю набора данных, заданному свойством DataField |
property Readonly: Boolean; |
Управляет работой режима "только для чтения" |
Этот компонент инкапсулирует двумерную таблицу, в которой строки представляют собой записи, а столбцы — поля набора данных.
Компонент TDBGrid является потомком классов TDBCustomGrid И TCustomGrid.
От класса TCustomGrid наследуются все функции отображения и управления работой двумерной структуры данных. Класс TDBCustomGrid обеспечивает визуализацию и редактирование полей из набора данных, причем TDBGrid только публикует свойства и методы класса TDBCustomGrid, не добавляя собственных.
В компоненте TDBGrid можно отображать произвольное подмножество полей используемого набора данных, но число записей ограничить нельзя — в компоненте всегда присутствуют все записи связанного набора данных. Требуемый набор полей можно составить при помощи специального Редактора столбцов, который открывается при двойном щелчке на компоненте, перенесенном на форму, или кнопкой свойства columns в Инспекторе объектов.
Новая колонка добавляется при помощи кнопки Add New, после этого ее название появляется в списке колонок (рис. 15.2). Для выбранной в списке колонки доступные для редактирования свойства появляются в Инспекторе объектов. Колонки в списке можно редактировать, удалять, менять местами.
При помощи кнопки Add All Fields в сетку можно добавить все поля набора данных.
Каждая колонка компонента TDBGrid описывается специальным классом TColumn, а совокупность колонок доступна через свойство columns компонента, оно имеет тип TDBGridColumns и представляет собой индексированный список объектов колонок. Поле набора данных связывается с конкретной колонкой при помощи свойства FieldName класса TColumn. При этом в колонку автоматически переносятся все необходимые параметры поля, в частности заголовок поля, настройки шрифтов, ширина поля. После ручного изменения параметров первоначальные значения восстанавливаются методами соответствующих объектов Icolumn.
Рис. 15.2. Редактор колонок компонента TDBGrid
При метода метода DefaultDrawColumnCell и метода- обработчика OnDraw-CoiumnCell можно управлять процессом отображения данных в ячейках.
Метод DefaultorawDataCelll предназначен только для обеспечения обратной совместимости по коду с более ранними версиями.
Настройка параметров компонента TDBGrid, от которых зависит его внешний вид и некоторые функции, осуществляется при помощи свойства options (табл. 15.2). Текущая позиция в двумерной структуре данных может быть определена свойствами SelectedField, SelectedRows, Selectedlndex.
При необходимости разработчик может использовать разнообразные методы-обработчики событий. Среди них есть как стандартные методы, присущие всем элементам управления, так и специфические.
Например, при помощи метода-обработчика OnEditButtonClick можно предусмотреть вызов специализированной формы при щелчке на кнопке в ячейке:
procedure TForml.DBGridlEditButtonClick(Sender: TObject);
begin
if DBGridl.Selectedlndex = 2 then SomeForm.ShowModal;
end;
Примечание
Объект колонки TColumn имеет свойство ButtonStyle. Если ему присвоить значение cbsEllipsis, то при активизации ячейки этой колонки в правой части ячейки появляется кнопка.
Таблица 15.2. Свойства и методы компонента WBGrid
Объявление |
Тип |
Описание |
Свойства |
||
property Columns: TDBGridColumns; |
Pb |
Содержит коллекцию объектов TColumn, описывающих колонки компонента |
property DefaultDrawing: Boolean;
|
Pb |
Определяет способ визуализации данных в сетке. При значении True данные отображаются автоматически. При значении False используется метод-обработчик OnDrawColumnCell |
property FieldCount: Integer; |
Ro |
Возвращает число видимых колонок сетки |
property Fields [Index: Integer] : TField; |
Ro |
Массив объектов полей набора данных, отображаемых в компоненте |
TDBGridOption = (dgEditing, dgAlwaysShowEditor, dgTitles, dglndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect) ; TDBGridOptions = set of TDBGridOption; |
Pb |
Определяет особенности визуализации и поведения компонента:
|
property SelectedField: TField; |
Pu |
Содержит объект текущего поля |
property Selectedlndex: Integer; |
Pu |
Содержит номер текущей колонки в массиве свойства Columns |
property SelectedRows: TBookmarkList; |
Ro |
Набор закладок на записи набора данных, соответствующих выделенным строкам сетки |
property TitleFont: TFont; |
Pb |
Шрифт заголовков колонок |
property EditorMode: Boolean; |
Pu |
Показывает, можно ли редактировать текущую ячейку |
property FixedColor: TColor; |
Pb |
Цвет фона неподвижных ячеек сетки |
Методы |
||
procedure DefaultDrawColumnCell (const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) ; |
Pu |
Перерисовывает текст в ячейке колонки с номером DataCol. Ячейка задается прямоугольником Rect на канве сетки. Параметр state определяет состояние ячейки после перерисовки. Параметр Column содержит экземпляр класса колонки, которой принадлежит ячейка |
procedure DefaultDrawDataCell (const Rect: TRect; Field: TField; State: TGridDrawState); |
Pu |
Перерисовывает текст в ячейке колонки, определяемой параметром Field, содержащим связанный с колонкой объект поля. Ячейка задается прямоугольником Rect на канве сетки. Параметр State определяет состояние ячейки после перерисовки |
procedure Def aultHandler (var Msg); override; |
Pu |
Вызывает всплывающее меню для колонки, которой соответствуют текущие координаты мыши. Компонент должен обрабатывать сообщение WM RBUTTONUP |
function ExecuteAction (Action: TBasicAction): Boolean; override; |
Pu |
Выполняет действие, заданное параметром Action, по отношению к данному компоненту |
procedure ShowPopupEditor (Column: I TColumn; X: Integer = Low (Integer); Y: Integer = Low (Integer) ); dynamic; |
Pu |
Открывает набор данных, связанный с передаваемой параметром Column колонкой в новом окне. Работает только для типов данных абстрактный и набор данных. Параметры X и Y определяют положение нового окна |
function | ValidFieldlndex (Fieldlndex: Integer) : Boolean; |
Pu |
Возвращает значение True, если колонка с номером Fieldlndex связана с полем набора данных |
type TGridCoord = record X: Longint;Y: Longint; end; function MouseCoord(X, Y: Integer): TGridCoord; ; |
Pu |
Возвращает номера строки и столбца, соответствующие ячейке, которой принадлежат экранные координаты X и Y |
Методы-обработчики событий |
||
type TDBGridClickEvent = procedure (Column: TColumn) 1 of object; property OnCellClick: TDBGridClickEvent; |
Pb |
Вызывается при щелчке мышью на ячейке. Параметр Column содержит колонку, которой принадлежит ячейка |
property OnColEnter: TNotifyEvent; |
Pb |
Вызывается при переносе фокуса на новую колонку сетки |
property OnColExit: TNotifyEvent; |
Pb |
Вызывается перед переносом фокуса из текущей колонки |
type TMovedEvent = procedure (Sender: TObject; Froinlndex, Tolndex: Longint) of object; property OnColumnMoved: TMovedEvent ; |
Pb
|
Вызывается при переносе колонки в сетке на новое место при помощи мыши. Параметр Fromindex возвращает номер старого положения колонки. Параметр Tolndex возвращает номер нового положения колонки |
type TDrawColumnCellEvent = procedure (Sender: TObject; const Rect : TRect; DataCol : State: TGridDrawState) of object; property OnDrawColurnnCell : TDrawColumnCellEvent; |
Pb |
Вызывается при перерисовке ячейки. Параметр Rect определяет ячейку по координатам прямоугольника на канве. Параметр DataCol возвращает номер колонки в сетке. Параметр Column содержит объект колонки. Параметр State возвращает состояние колонки |
type TDrawDataCellEvent = procedure (Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState) of object; property OnDrawDataCell: TDrawDataCellEvent; |
Pb |
Вызывается при перерисовке ячейки перед обработчиком OnDrawCoiumnCell, если свойство Columns. State =csDefault. Этот метод лучше не применять, т. к. он используется только для обеспечения обратной совместимости с ранними версиями |
property OnEditButtonClick: TNotifyEvent; |
Pb |
Вызывается при щелчке мышью на кнопке в ячейке |
type TDBGridClickEvent = procedure (Column: TColumn) of object; property OnTitleClick: TDBGridClickEvent; |
Pb |
Вызывается при щелчке мышью на заголовке колонки. Колонка определяется параметром Column |
В работе компонента TDBGrid важную роль играет класс TColumn, который инкапсулирует свойства колонки или столбца сетки (табл. 15.3). Его основным назначением является правильное отображение данных из поля набора данных, связанного с этой колонкой. Поэтому объект колонки обладает свойствами и методами, которые позволяют произвольным образом задавать параметры отображения данных (цвет, шрифт, ширину и т. д.). Первоначальные значения берутся из связанных с колонками полей. Измененные свойства можно восстановить при помощи группы специальных методов (DefauitColor, DefaultFont И др.).
Свойство Assignedvalues позволяет в любой момент определить, какие первоначальные настройки были изменены.
За отображение заголовка колонки отвечает свойство Title, представляющее собой ссылку на экземпляр объекта TColumnTitie. Здесь можно задать текст заголовка, параметры шрифта текста заголовка и цвет фона заголовка. По умолчанию текст заголовка берется из свойства DispiayLabel объекта TField (CM. гл. 13).
Каждой колонке можно придать список, который разворачивается при щелчке на кнопке в активной ячейке колонки. Выбранное в списке значение автоматически заносится в ячейку. Для реализации этой возможности применяется свойство pickList типа TStrings. Достаточно лишь заполнить список значениями во время разработки или выполнения (рис. 15.3).
Рис. 15.3. Список колонки в компоненте TDBGrid
Таблица 15.3. Свойства и методы класса TColumn
Объявление |
Тип |
Описание |
Свойства |
||
property Alignment: TAlignment; |
Pb |
Определяет выравнивание данных в колонке |
type TColumnValue = (cvColor, cvWidth, cvFont, cvAlignment, cvReadOnly, cvTitleColor, cvTitleCaption, cv'i'itleAlignment, cvTitleFont, cvImeMode, cvImeName) ; TColuinnValues = set of TColumnValue; property AssignedValues: TColuranValues ; |
Ro |
Возвращает набор атрибутов колонки, которые были изменены по сравнению с первоначальными
|
type TColumnButtonStyle = (cbsAuto, cbsEllipsis, cbsNone) ; property ButtonStyle: TColumnButtonStyle; |
Pb |
Задает способ редактирования данных в колонке:
|
property Color: TColor; |
Pb |
Цвет фона колонки |
property DisplayName: string; |
Pu |
Название колонки в списке Редактора столбцов |
property DropDownRows: Cardinal; |
Pb |
Определяет число строк разворачивающегося списка ячейки |
property Expandable: Boolean; |
Pu |
В значении True разрешает показ связанных с полем колонки дочерних полей абстрактного, ссылочного типов и массивов |
property Expanded: Boolean; |
Pb |
При значении True каждое дочернее поле отображается в новой колонке. При значении False дочерние поля отображаются через точку с запятой и не доступны для редактирования |
property FieldName: string; |
Pb |
Название поля, связанного с колонкой |
property Font: TFont; |
Pb |
Шрифт данных в колонке |
property Grid: TCustomDBGrid; |
Ro |
Определяет сетку, содержащую эту колонку |
property ParentColumn: TColumn; |
Ro |
Определяет колонку-владельца текущей колонки. Используется для дочерних полей |
property PickList: TStrings; |
Pb |
Содержит разворачивающийся список, используемый при редактировании данных |
property PopupMenu: TPopupMenu; |
Pb |
Связывает с колонкой всплывающее меню |
property Showing: Boolean; |
Ro |
Возвращает значение True, если колонка видима |
property Title: TColumnTitle; |
Pb |
Задает текст заголовка и его параметры |
property Visible: Boolean; |
Pb |
Задает видимость колонки |
property Width: Integer; |
pb |
Задает ширину колонки в пикселах |
Методы |
procedure Assign (Source: TPersistent); override; |
Pu |
Копирует колонку Source в текущую колонку |
function Def aultAlignment: TAlignment; |
Pu |
Возвращает первоначальное значение выравнивания колонки |
function DefaultColor: TColor; |
Pu |
Возвращает первоначальный фоновый цвет колонки |
function DefaultFont: TFont; |
Pu |
Возвращает первоначальный шрифт данных в колонке |
type TIraeMode = (imDisable, iraClose, imOpen, imDontCare, imSAlpha, imAlpha, imHira, imSKata, irnKata, imChinese, imSHanguel, imHanguel); function DefaultlmeMode: TImeMode; |
Pu |
Возвращает первоначальный способ ввода символов |
type TImeName = type string; function DefaultlmeName: TImeName; |
Pu |
Возвращает первоначальное имя редактора способа ввода символов |
function DefaultReadOnly: Boolean; |
Pa |
Возвращает первоначальный режим редактирования данных |
function DefaultWidth: Integer; |
Pu |
Возвращает первоначальную ширину колонки в пикселах |
function Depth: Integer; |
Pu |
Возвращает число непосредственных предков колонки |
procedure RestoreDefaults; virtual; |
Pu |
Восстанавливает первоначальные настройки колонки |
При работе с компонентом TDBGrid все операции с отдельными колонками осуществляются при помощи экземпляра класса TDBGridColumns, который инкапсулирует список объектов колонок (свойство Columns компонента TDBGrid). Доступ к колонкам осуществляется при помощи свойства items. Нумерация колонок начинается с нуля.
При помощи свойств и методов класса TDBGridColumns можно изменять настройки полей компонента TDBGrid во время выполнения (табл. 15.4).
Свойство state определяет способ создания колонок. Его значение устанавливается автоматически. При создании колонок для всех полей сразу (кнопка Add All Fields Редактора столбцов) устанавливается значение csDefault.
При любом ручном изменении свойств устанавливается значение csCustomized. При программном изменении значения свойства во время выполнения все существующие колонки удаляются.
Все данные из существующих колонок можно сохранить в файле или потоке при помощи методов SaveToFile и saveToStream, а затем загрузить их обратно методами LoadFromFile И LoadFromStream.
Таблица 15.4. Свойства и методы класса TDBGridColumns
Объявление |
Тип |
Описание |
Свойства |
||
property Grid: TCustomDBGrid; |
Ro |
Возвращает ссылку на сетку, владеющую данным объектом |
property Items [Index: Integer] : TColumn default; |
Pu |
Индексный список объектов колонок сетки: |
type TDBGridColumnsState = (csDefault, csCustomized) ; property State: TDBGridColumnsState; |
Pu |
Определяет способ создания колонок сетки:
|
property Count: Integer; |
Pu |
Возвращает общее число колонок |
Методы |
||
function Add: TColumn; |
Pu |
Добавляет новый объект TColumn |
procedure LoadFromFile (const Filename: string); |
Pu |
Загружает данные в объект из файла FileName |
procedure LoadFromStream(S: TStream) ; |
Pu |
Загружает данные в объект из потока s |
procedure RebuildColumns; |
Pu |
Удаляет существующие колонки и создает новые, основываясь на параметрах полей набора данных |
procedure RestoreDefaults; |
Pu |
Восстанавливает первоначальные настройки колонок |
procedure SaveToFiie (const Filename: string); |
Pu |
Сохраняет данные из колонок в файле FileName |
procedure SaveToStream(S: TStream) ; |
Pu |
Сохраняет данные из колонок в потоке s |
Компонент TDBCtrlGrid внешне напоминает компонент TDBGrid, но никак не связан с классом TCustomDBGrid, а наследуется напрямую от класса TWinControl.
Этот компонент позволяет отображать данные в строках в произвольной форме. Компонент представляет собой набор панелей, каждая из которых служит платформой для размещения данных отдельной записи набора данных. На панели могут размещаться любые компоненты отображения данных, предназначенные для работы с отдельным полем. С каждым таким компонентом можно связать нужное поле набора данных. При открытии набора данных в компоненте TDBCtrlGrid на каждой новой панели создается набор компонентов отображения данных, аналогичный тому, который был создан на одной панели во время разработки.
На панель можно переносить только те компоненты отображения данных, которые показывают значение одного поля для единственной записи набора данных. Нельзя использовать компоненты TDBGrid, TDBCtrlGrid, TDBRichEdit, TDBListBox, TDBRadioGroup, TDBLookupListBox.
После того, как для компонента TDBCtrlGrid задано значение свойства DataSource, все переносимые на панель компоненты отображения данных автоматически связываются с указанным компонентом TdataSource (табл. 15.5). Самостоятельное задание свойства DataSource для дочерних компонентов отображения данных не допускается. В них требуется определить только поля.
Компонент может отображать панели в одну или несколько колонок. Для задания числа колонок панелей используется свойство colcount. Число видимых строк панелей определяется свойством RowCount. Вертикальное или горизонтальное размещение колонок панелей зависит от значения свойства Orientation.
При использовании нескольких колонок панелей курсор перемещается по колонке сверху вниз с последующим переходом на следующую колонку. Направление движения курсора не зависит от значения свойства Orientation.
Размеры одной панели определяются свойствами panelHeight и Panelwidth. Они взаимосвязаны с размерами самого компонента. При изменении значений свойств PanelHeight и Panelwidth размеры компонента изменяются таким образом, чтобы в нем помещалось указанное в свойствах colcount и RowCount число панелей и наоборот.
Не рекомендуется размещать на панели компоненты TDBMemo и TDBimage, т. к. это может привести к значительному снижению производительности.
Таблица 15.5. Свойства и методы компонента TDBCtrlGrid
Объявление |
Тип |
Описание |
Свойства |
||
property AllowDelete: Boolean; |
Pb |
Разрешает или запрещает удаление текущей записи |
property Allowlnsert: Boolean; |
Pb |
Разрешает или запрещает вставку новой записи |
property Canvas: TCanvas; |
Ro |
Канва компонента |
property ColCount: Integer; |
Pb |
Определяет число колонок с панелями |
property EditMode: Boolean; |
Pu |
Разрешает или запрещает редактирование данных |
type TDBCtrlGridOrientation = (goVertical, goHorizontal); property Orientation: TDBCtrlGridOrientation; |
Pb |
Определяет порядок следования записей — по горизонтали или по вертикали |
type TDBCtrlGridBorder = (gbNone, gbRaised) ; property PanelBorder: TDBCtrlGridBorder; |
Pb |
Определяет способ отображения границы панели |
property PanelCount: Integer; |
Ro |
Содержит число видимых одновременно панелей |
property PanelHeight: Integer; |
Pb |
Определяет высоту панелей в пикселах |
property Panellndex: Integer; |
Pu |
Определяет индекс панели текущей записи |
property PanelWidth: Integer; |
Pb |
Определяет ширину панелей в пикселах |
property RowCount: Integer; |
Pb |
Определяет число строк видимых панелей |
property SelectedColor: TColor; |
Pb |
Определяет фоновый цвет панели текущей записи |
property ShowFocus : Boolean; |
Pb |
Разрешает или запрещает выделение вокруг панели текущей записи |
Методы |
type TDBCtrlGridKey = (gkNull, gkEditMode, gkPriorTab, gkNextTab, gkLeft, gkRight, gkUp, gkDown, gkScrollUp, gkScrollDown, gkPageUp, gkPageDown, gkHome, gkEnd, gklnsert, gkAppend, gkDelete, gkCancel) ; procedure DoKey(Key: TDBCtrlGridKey) ; |
Выполняет операцию, заданную при помощи параметра Key. Доступны операции навигации по записям, перевода в режим редактирования, вставки, удаления записей, отмены изменений |
|
procedure KeyDown (var Key: Word; Shift: TShiftState) ; override; |
Используется при нажатии клавиши для трансляции кодов клавиш |
|
Методы-обработчики событий |
||
type TPaintPanelEvent = procedure (DBCtrlGrid: TDBCtrlGrid; Index: Integer) of object; property OnPaintPanel : TPaintPanelEvent; |
Вызывается при перерисовке панели. Параметр Index соответствует индексу панели |
Перемещение или навигация по записям набора данных может осуществляться несколькими путями. Например, в компонентах TDBGrid и TDBCtrlGrid, которые отображают сразу несколько записей набора данных, можно использовать клавиши вертикального перемещения курсора или вертикальную полосу прокрутки.
Но что делать, если на форме находятся только компоненты, отображающие одно поле только текущей записи набора данных (TDBEdit, TDBCombоВох и т. д.)? Очевидно, что в этом случае на форме должны быть расположены дополнительные элементы управления, отвечающие за перемещение по записям.
Аналогично, ни один компонент отображения данных не имеет встроенных средств для создания и удаления записей целиком.
Для решения указанных задач и предназначен компонент TDBNavigator, который представляет собой совокупность управляющих кнопок, выполняет операции навигации по набору данных и модификации записей целиком.
Компонент TDBNavigator при помощи свойства DataSource связывается с компонентом TDataSource и через него с набором данных. Такая схема позволяет обеспечить изменение текущих значений полей сразу во всех связанных с TDataSource компонентах отображения данных. Таким образом, TDBNavigator только дает команду на выполнение перемещения по набору данных или другой управляющей операции, а всю реальную работу выполняют компонент набора данных и компонент TDataSource. Компонентам отображения данных остается только принять новые данные от своих полей.
Рис. 15.4. Назначение кнопок компонента TDBNavigator
Компонент TDBNavigator содержит набор кнопок, каждая из которых отвечает за выполнение одной операции над набором данных. Всего имеется 10 кнопок, разработчик может оставить в наборе любое количество кнопок в любом сочетании. Видимостью кнопок управляет свойство visibleButtons:
type
TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast, nblnsert, nbDelete,
nbEdit, nbPost, nbCancel, nbRefresh);
TButtonSet = set of TNavigateBtn;
property VisibieButtons: TButtonSet;
Каждый элемент типа TNavigateBtn представляет одну кнопку, их назначение описывается ниже:
nbFirst — перемещение на первую запись набора данных;
nbPrior — перемещение на предыдущую запись набора данных;
nbNext — перемещение на следующую запись набора данных;
nbLast — перемещение на последнюю запись набора данных;
nblnsert — вставка новой записи в текущей позиции набора данных;
nbDelete — удаление текущей записи, курсор перемешается на следующую запись;
nbEdit — набор данных переводится в режим редактирования;
nbPost — в базу данных переносятся все изменения в текущей записи;
nbcancel — все изменения в текущей записи отменяются;
nbRefresh — восстанавливаются первоначальные значения текущей записи, сделанные после последнего переноса изменений в базу данных.
Самой критичной к возможной потере данных вследствие ошибки является операция удаления записи, поэтому при помощи свойства confirmDelete можно включить механизм контроля удаления. При каждом удалении записи нужно будет дать подтверждение выполняемой операции.
Нажатие любой кнопки можно эмулировать программно при помощи метода BtnClick.
В случае необходимости выполнения дополнительных действий при щелчке на любой кнопке можно воспользоваться обработчиками событий BeforeAction и Onciick, в которых параметр Button определяет нажатую кнопку. Свойства и методы компонента TDBNavigator представлены в табл. 15.6.
Таблица 15.6. Свойства и методы компонента TDBNavigator
Объявление |
Тип |
Описание |
Свойства |
||
property ConfirmDelete: Boolean; |
Pb |
Включает или отключает подтверждение удаления записи |
property Hints: TStrings; |
Pb |
Содержит список подсказок для каждой кнопки |
property Flat: Boolean; |
Pb |
Определяет внешний вид кнопок компонента |
type TNavigateBtn = (nbFirst, nbPrior, nbNext, nbLast, nblnsert, nbDeiete, nbEdit, nbPost, nbCancel, nbRefresh); TButtonSet = set of TNavigateBtn ; property VisibleButtons: TButtonSet; |
Pb |
Список видимых кнопок |
Методы |
procedure BtnClick (Index: TNavigateBtn) ; |
Pu |
Эмулирует щелчок на кнопке index |
procedure SetBounds (ALeft, ATop, AWidth, AHeight: Integer) ; |
Pu |
Задает положение (параметры ALeft, АТор) и размер компонента (параметры AWidth, AHeight) |
Методы-обработчики событий |
||
ENavClick = procedure (Sender: TObject; Button: TNavigateBtn) of object; Iproperty BeforeAction: ENavClick; |
Pb |
Выполняется при щелчке на кнопке ' Button перед выполнением операции, связанной с кнопкой |
ENavClick = procedure (Sender: TObject; Button: TNavigateBtn) of object; property OnClick: ENavClick; |
Pb |
Выполняется при щелчке на кнопке Button после выполнения операции, связанной с кнопкой |
Большинство компонентов отображения данных предназначено для представления данных из отдельных полей. Для этого все они имеют свойство DataField, которое указывает на требуемое поле набора данных.
В зависимости от типа данных поля могут использовать различные компоненты. Для большинства стандартных полей используются компоненты TDBText, TDBEdit, TDBComboBox, TDBListBox.
Данные в формате Memo отображаются компонентами TDBMemo и TDBRichEdit. Для показа изображений предназначен компонент TDBImage.
Этот компонент представляет собой статический текст, который отображает текущее значение некоторого поля связанного набора данных. При этом данные можно просматривать в режиме "только для чтения".
Непосредственным предком компонента является класс TCustomLabel, поэтому он очень похож на компонент TLabel.
При использовании компонента следует обратить внимание на возможную длину отображаемых данных. Для предотвращения обрезания текста можно использовать свойства AutoSize И Wordwrap.
Компонент представляет собой стандартный однострочный текстовый редактор, в котором отображаются и изменяются данные из поля связанного набора данных.
Прямой предок компонента — класс TCustomMaskEdit, который также является прямым предком компонента TEdit.
Компонент может осуществлять проверку редактируемых данных по заданной для поля маске. Непосредственно для редактора задать маску нельзя, т. к. содержащее маску свойство EditMask в классе TCustomMaskEdit является защищенным, а в TDBEdit не перекрыто. Тем не менее механизм контроля полностью унаследован. Саму же маску можно задать в связанном с редактором поле. Объект TField имеет собственное свойство EditMask, которое и используется при проверке данных в редакторе (см. гл. 13).
Проверка редактируемого текста на соответствие маске осуществляется методом validateEdit после каждого введенного или измененного символа. В случае ошибки генерируется исключение validateError и курсор устанавливается на первый ошибочный символ.
В компоненте можно использовать буфер обмена. Это делается средствами операционной системы пользователем или программно при помощи методов CopyToClipboard, CutToClipboard, PasteFromCiipboard.
Компонент представляет собой почти полный аналог обычного флажка (компонент TCheckBox) и предназначен для отображения и редактирования любых данных, которые могут иметь только два значения. Это может быть логический тип данных или любые строковые значения, но поле может принимать значения только из двух строк.
Предопределенные значения задаются свойствами valuechecked и ValueUnchecked. По умолчанию они имеют значения True И False. Этим свойствам можно также присваивать любые строковые значения, причем одному свойству можно назначить несколько возможных значений, разделенных точкой с запятой.
Включение флажка происходит, если значение поля набора данных совпадает со значением свойства valuechecked (единственным или любым из списка). Если же флажок включил пользователь, то значение поля данных приравнивается к единственному или первому в списке значению свойства ValueChecked.
Аналогичные действия происходят и со свойством ValueUnchecked.
Компонент представляет собой стандартную группу переключателей, состояние которых зависит от значений поля связанного набора данных. В поле можно передавать фиксированные значения, связанные с отдельными переключателями в группе.
Если текущее значение связанного поля соответствует значению какого-либо переключателя, то он включается. Если пользователь включает другой переключатель, то связанное с переключателем значение заносится в поле. Возможные значения, на которые должны реагировать переключатели в группе, заносятся в свойство Values при помощи специального редактора в Инспекторе объектов или программно посредством методов класса Tstrings. Каждому элементу свойства values соответствует один переключатель (порядок следования сохраняется).
Свойство items содержит список поясняющих надписей для переключателей группы. Если для какого-либо переключателя нет заданного значения, но есть поясняющий текст, то такой переключатель включается при совпадении значения связанного поля с поясняющим текстом.
Текущее значение связанного поля содержится в поле value.
Компонент отображает текущее значение связанного с ним поля набора данных и позволяет изменить его на любое фиксированное из списка. Функционально компонент ничем не отличается от компонента TListBox. Значение поля должно совпадать с одним из элементов списка. Специальных методов компонент не содержит.
Компонент отображает текущее значение связанного с ним поля набора данных в строке редактирования, при этом значение поля должно совпадать с одним из элементов разворачивающегося списка. Текущее значение можно изменить на любое фиксированное из списка компонента. Функционально компонент ничем не отличается от компонента TDBCombовох, представляющего собой комбинированный список.
Компонент может работать в пяти различных стилях, которые определяются свойством Style.
Специальных методов компонент не содержит.
Компонент представляет собой обычное поле редактирования, к которому подключается поле с типом данных Memo или BLOB. Основное его преимущество — возможность одновременного просмотра и редактирования нескольких строк переменной длины. Компонент может отображать только строки, которые целиком видны по высоте.
В компоненте можно использовать буфер обмена при помощи стандартных средств операционной системы или унаследованными от предка TCustomMemo методами CopyToClipBoard, CutToClipBoard, PasteFromClipBoard.
Для ускорения навигации по набору данных при отображении полей типа BLOB можно использовать свойство AutoDisplay. При значении True любое новое значение поля автоматически отображается в компоненте. При значении False новое значение появляется только после двойного щелчка на компоненте или после нажатия клавиши <Enter> при активном компоненте.
Метод LoadMemo используется автоматически при загрузке значения поля, если свойство AutoDispiay = False.
Поведением компонента при работе со слишком длинными строками можно управлять при помощи свойства wordwrap. При значении True слишком длинная строка сдвигается влево при перемещении текстового курсора за правую границу компонента. При значении False остаток длинной строки переносится на новую строку, при этом реально новая строка в данных не создается.
Компонент предназначен для просмотра изображений, хранящихся в базах данных в графическом формате.
Редактировать изображения можно только в каком-либо графическом редакторе, перенося исходное и измененное изображение при помощи буфера обмена. Это делается средствами операционной системы пользователем или программно при помощи методов CopyToClipboard, CutToClipboard, PasteFromClipboard.
Визуализация изображения осуществляется при помощи свойства Picture, которое представляет собой экземпляр класса TPicture.
Также можно полностью заменить существующее изображение или сохранить новое в новой записи набора данных. Для этого используются методы свойства Picture.
Свойство AutoDisplay позволяет управлять процессом загрузки новых изображений из набора данных в компонент. При значении True любое новое значение поля автоматически отображается в компоненте. При значении False новое значение появляется только после двойного щелчка на компоненте или после нажатия клавиши <Enter> при активном компоненте.
Для ускорения просмотра изображений можно применять свойство QuickDraw, которое задает используемую изображением палитру. При значении True применяется стандартная системная палитра. В результате уменьшается время загрузки изображения, но может ухудшиться и качество изображения, в некоторых случаях до полного искажения. При значении False используется собственная палитра изображения и процесс загрузки замедляется.
Компонент предоставляет возможности полноценного текстового редактора для просмотра и изменения текстовых данных, хранящихся в связанном поле набора данных. Поле должно содержать информацию о форматировании текста.
Внешне компонент ничем не отличается от поля редактирования, поэтому о реализации доступа к гораздо более богатым возможностям редактора через интерфейс пользователя должен позаботиться разработчик. Для этого можно использовать дополнительные элементы управления.
При разработке приложений для работы с базами данных часто возникает необходимость в связывании двух наборов данных по ключевому полю. Например, в таблице Orders (содержит данные о заказах) демонстрационной базы данных DBDEMOS имеется поле custNo, которое содержит идентификационный номер покупателя. Под этим же номером в таблице Customers хранится информация о покупателе (адрес, телефон, реквизиты и т. д.). При разработке пользовательского интерфейса приложения баз данных необходимо, чтобы при просмотре перечня заказов в форме приложения отображались не идентификационные номера покупателей, а их параметры.
Таким образом, в наборе данных заказов вместо поля номера покупателя должно появиться поле имени покупателя из таблицы Customers. Механизм связывания полей из различных наборов данных по ключевому полю называется синхронным просмотром. В рассмотренном примере ключевым является поле CustNo из таблицы Customers, а выбор конкретного наименования производится по совпадению значений ключевого поля и заменяемого поля из исходного набора данных — Orders. Причем необходимо, чтобы в таблице Customers поле custNo было уникальным (составляло первичный или вторичный ключ).
Таблицу, в которой расположено поле, значения которого замещаются на синхронные, будем называть исходной таблицей (это таблица Orders).
Таблицу, содержащую ключевое поле и поле данных для синхронного просмотра, будем называть таблицей синхронного просмотра (таблица Customers).
В Delphi механизм синхронного просмотра реализован на уровне отдельных полей и компонентов.
В наборе данных динамически можно создать специальное поле синхронного просмотра, которое будет автоматически замещать одно значение другим в зависимости от значения ключевого поля. Такое поле можно связать с любым рассмотренным выше компонентом отображения данных (см. гл. 13).
Помимо простого синхронного просмотра данных может возникнуть задача редактирования данных в аналогичной ситуации. Для этого предназначены специальные компоненты синхронного просмотра данных, которые позволяют, например, выбирать покупателя из списка, а изменится при этом номер покупателя в наборе данных заказов. Использование таких компонентов делает пользовательский интерфейс значительно более удобным и наглядным. В VLC Delphi есть два таких компонента: TDBLookupListBox И TDBLookupComboBox.
Примечание
На странице Win 3.1 Палитры компонентов имеются еще два компонента: TDBLokupList и TDBLookupCombo. Они обладают тем же набором функций, используются для обеспечения совместимости с приложениями, созданными в среде разработки Delphi 1, и поэтому здесь не рассматриваются.
Непосредственным предком компонентов синхронного просмотра данных является класс TDBLookupControl, который инкапсулирует список значений для просмотра и сам механизм синхронного просмотра.
Как и в любом другом компоненте отображения данных, в компонентах синхронного просмотра должны присутствовать средства связывания с требуемым полем некоторого набора данных (табл. 15.7). Это уже известные свойства: Datasource — применяется для задания набора данных через компонент TDataSource и DataField — для определения требуемого поля набора данных. Для синхронного просмотра следует выбирать такое поле, значения которого не дают пользователю полной информации об объекте и совпадают с ключевым полем в таблице синхронного просмотра. Название этого поля может не совпадать с названием ключевого поля, но типы данных должны быть одинаковыми.
Примечание
При проектировании баз данных желательно, чтобы такие поля все же носили одинаковые названия.
Теперь необходимо задать таблицу синхронного просмотра, ключевое поле и поле синхронного просмотра.
Набор данных, содержащий указанные поля, определяется через соответствующий rомпонент TDataSource в свойстве ListSource.
Ключевое поле задается свойством KeyField. Во время работы компонента в свойстве KeyValue содержится текущее значение, которое связывает между собой два набора данных.
Поле синхронного просмотра определяется свойством ListField. Здесь можно задавать сразу несколько полей, которые будут отображаться в компоненте синхронного просмотра. Названия полей разделяются точкой с запятой. Если свойство не определено, то в компоненте будут отображаться значения ключевого поля. Свойство ListFieldindex служит для выбора основного поля из списка. Дело в том, что компоненты синхронного просмотра поддерживают механизм наращиваемого поиска, который позволяет быстро находить нужное значение в больших списках. Свойство ListFieldindex определяет, какое поле используется при наращиваемом поиске. В компоненте TDBiookupComboBox свойство ListFieldindex также определяет, какое поле будет передано в строку редактирования.
Таблица 15.7. Основные свойства, включающие механизм синхронного просмотра
Объявление |
Тип |
Описание |
property KeyFieid: string; |
Pb |
Ключевое поле таблицы синхронного просмотра |
property KeyValue : Variant; |
Pu |
Текущее значение ключевого поля |
property ListFieid: string; |
Pb |
Поле или список полей синхронного просмотра в таблице синхронного просмотра |
property ListFieidindex: Integer; |
Pb |
Номер основного поля синхронного просмотра (используется, когда свойство ListField содержит список полей) |
property ListSource: TDataSource; |
Pb |
Указывает на компонент TDataSource, связанный с таблицей синхронного просмотра |
property NullValueKey: TShortCut; |
Pb |
Определяет комбинацию клавиш, нажатие которых задает нулевое значение поля |
В качестве примера рассмотрим приложение Demo Lookup (рис. 15.5), в котором с набором данных таблицы Orders из базы данных DBDEMOS связаны компоненты TDBGrid и TDBLооkupрСоmbоВох. Во втором компоненте при перемещении по записям набора данных отображается имя покупателя, оформившего текущий заказ.
Рис. 15.5. Главная форма проекта DemoLookup
Ключевые свойства компонента настроены следующим образом.
Свойство Listsource указывает на компонент custsource типа TDataSource, который связан с набором данных синхронного просмотра custTable.
Свойство ListFieid указывает на поле company, все значения которого доступны в списке компонента.
Свойство KeyField указывает на поле custNo, которое имеется в двух таблицах и по которому осуществляется связь.
Рассмотрим основные свойства и методы самих компонентов отображения данных, за исключением тех, которые представлены в табл. 15.7 и полностью идентичны для двух компонентов.
Компонент представляет собой список значений поля синхронного просмотра для поля, заданного свойством DataField, из набора данных DataSource. Его основное назначение — автоматически устанавливать соответствие между полями двух наборов данных по одинаковому значению заданного поля исходной таблицы и ключевого поля таблицы синхронного просмотра. В списке синхронного просмотра отображаются возможные значения для редактирования поля основной таблицы.
По своим функциональным возможностям компонент совпадает с компонентом TDBListBox.
Компонент представляет собой комбинированный список значений поля синхронного просмотра для поля, заданного свойством DataField, из набора данных DataSource. Его основное назначение — автоматически устанавливать соответствие между полями двух наборов данных по одинаковому значению заданного поля исходной таблицы и ключевого поля таблицы синхронного просмотра. В списке синхронного просмотра отображаются возможные значения для редактирования поля основной таблицы.
По своим функциональным возможностям компонент совпадает с компонентом TDBComboBox.
Для представления данных из некоторого набора данных в виде графиков различных видов предназначен компонент TDBChart (табл. 15.8). В нем можно одновременно показывать графики для нескольких полей данных. Графики строятся на основе всех имеющихся в наборе данных значений полей. Функционально компонент ничем не отличается от компонента TChart.
Настройка параметров компонента осуществляется специальным редактором, который можно открыть двойным щелчком на перенесенном на форму компоненте.
Здесь мы не будем подробно останавливаться на богатейших изобразительных возможностях этого компонента, рассмотрим только процесс подключения к нему набора данных и построение графиков.
Основой любого графика в компоненте TDBChart является так называемая серия, свойства которой представлены классом Tchartseries. Для того чтобы построить график значений некоторого поля набора данных, необходимо
выполнить следующие действия, большинство из которых выполняется в специализированном редакторе компонента.
1. Создать новую серию и определить ее тип.
2. Задать для серии набор данных.
3. Связать с осями координат нужные поля набора данных и, в зависимости от типа серии, задать дополнительные параметры.
4. Открыть набор данных.
Редактор имеет две главные страницы — Chart и Series. Страница Chart содержит многостраничный блокнот и предназначена для настройки параметров самого графика. Страница Series также содержит многостраничный блокнот и используется для настройки серий значений данных.
Для создания новой серии необходимо в редакторе перейти на главную страницу Chart, а на ней открыть страницу Series (рис. 15.6). На этой странице нужно щелкнуть на кнопке Add, а затем в появившемся диалоге выбрать тип серии. После этого в списке на странице Series появляется строка новой серии. Здесь можно переопределить тип, цвет и видимость серии, щелкнув на соответствующей зоне строки.
Все остальные страницы блокнота на главной странице Chart предназначены для настройки параметров графика.
Теперь необходимо перейти на главную страницу Series и на ней из списка названий серий выбрать необходимую. После этого на странице Data Source из списка выбирается строка DataSet. Далее в появившемся списке DataSet выбирается нужный набор данных.
Рис. 15.6. Специализированный редактор компонента TDBChart
Список X позволяет выбрать поле набора данных, значения которого будут последовательно откладываться по оси абсцисс. Список Y позволяет выбрать поле набора данных, значения которого будут отложены по оси ординат. Соответствие между значениями полей по двум осям определяется принадлежностью к одной записи набора данных. Выбор поля в списке Labels привязывает его значения в виде меток к оси абсцисс.
Примечание
Здесь описан набор элементов управления для линейного типа серии. Для других типов элементы управления могут отличаться.
Теперь осталось только открыть набор данных и компонент TDBChart построит график.
Аналогичным образом на этот же компонент можно поместить и другие графики.
Таблица 15.8. Свойства и методы компонента TDBChart
Объявление |
Описание |
Свойства |
|
property AutoRefresh : Boolean; |
Разрешает или запрещает обновление данных в серии при открытии связанного набора данных |
property Refreshlnterval : Longlnt; |
Задает временной интервал в секундах между обновлениями данных в сериях из связанных наборов данных |
property ShowGlassCursor : Boolean; |
Разрешает показ курсора "песочные часы" при обновлении данных |
Методы |
|
procedure CheckDataSource; |
Обновляет данные в сериях |
function IsValidDataSource (ASeries : TChartSeries; AComponent: TComponent) : Boolean; virtual; |
Проверяет, связан ли набор данных AComponent с серией ASeries. В случае успеха проверки возвращает True |
procedure RefreshData; |
Обновляет данные во всех сериях |
procedure Ref reshDataSet (ADataSet : TDataSet; ASeries: TChartSeries); |
Считывает все записи в наборе данных AdataSet и переносит их в серию ASeries |
Методы-обработчики событий |
|
property OnProcessRecord : TProcessRecordEvent; |
Вызывается при переносе данных из отдельной записи набора данных в серию |
Компоненты отображения данных играют важную роль при создании интерфейсов приложений баз данных. Разнообразие предлагаемых элементов управления позволяет решать любые задачи по организации взаимодействия пользователя с базой данных. Все они взаимодействуют с набором данных через компонент TDataSource.
Назад | Содержание | Вперед |