При работе с реляционными БД важное значение имеет понятия поля – описание типа данных, которому соответствует значение в таблице базы данных. В наборе данных Delphi для представления полей используется базовый класс TField, обеспечивающий возможность работы с любыми типами данных, а на основе его определен ряд классов для представления типизированных полей:
TStringField – строковое поле (длина строки – не более 8192 символа);
TSmallIntField – целочисленное поле, хранящее данные в формате ShortInt;
TIntegerField – целочисленное поле, хранящее данные в формате Integer;
TLargeField – целочисленное поле, хранящее данные в формате LongInt;
TWordField – целочисленное поле, хранящее данные в формате Word;
TBooleanField – логическое поле для данных типа Boolean;
TFloatField – поле для действительных чисел, тип данных Double;
TBLOBField – поле, хранящее данные в формате большого двоичного массива, может содержать любые данные, представимые в виде двоичного объекта (физически в БД двоичные объекты хранятся в отдельных файлах, а поля содержат только ссылки на них);
TGraphicField – поле для хранения изображений в формате BMP (фактически аналогично типу BLOB);
TArrayField – массив полей любого типа кроме TArrayField;
TDataSetField – поле, содержащее набор данных;
TMemoField – поле для хранения списка строк.
Отметим, что существуют также вычисляемые поля, которые позволяют рассчитать свое значение на основе существующих данных, не изменяя при этом структуры таблицы БД.
Для полноценной работы с базами данных недостаточно обеспечить только доступ к информации. Необходимы также возможности визуализации и редактирования информации, хранящейся в БД.
На странице Data
Access
палитры компонентов VCL
находится компонент DataSource
(
),
который используется в качестве
интерфейса для соединения набора данных
с компонентами отображения данных. В
качестве механизма взаимодействия
используются как BDE, так
и ADO.
Класс TDataSource содержит небольшое количество свойств и методов:
AutoEdit: Boolean – если значение данного свойства равно true, то при попытке пользователя изменить значение поля в элементе отображения данных набор данных автоматически переводится в состояние редактирования (dsEdit);
DataSet: TDataSet – указывает на набор данных, с которым связан объект TDataSource;
Enabled: Boolean – определяет, отображать или нет данные в элементах отображения данных, связанных с данным объектом типа TDataSource;
State: TDataSetState – содержит текущее состояние набора данных, связанного с компонентом TDataSource;
procedure Edit – проверяет состояние набора данных перед переводом его в состояние dsEdit;
function IsLinkedTo(DataSet:TDataSet):Boolean – проверяет, связан ли компонент типа TDataSource с набором данных DataSet, указанным в параметрах функции.
В классе TDataSource определена обработка событий:
OnDataChange – вызывается при перемещении курсора набора данных, связанного с компонентом DataSource, если в текущую запись были внесены изменения;
OnStateChange – вызывается при изменении состояния набора данных, связанного с компонентом DataSource;
OnUpdateData – вызывается перед сохранением изменений в базе данных.
Как правило, элементы визуализации информации баз данных по свойствам, методам, событиям подобны аналогичным элементам управления Delphi, рассмотренным ранее. В наименовании компонентов обычно присутствует сочетание символов "DB", указывающее на то, что данный компонент ориентирован на работу с БД. Все элементы визуализации данных имеют общее свойство DataSource, указывающее на источник данных. Стандартные элементы расположены на странице Data Controls палитры компонентов.
Для визуализации набора данных в виде
таблицы используется компонент DBGrid
(
).
Структура таблицы компонента соответствует
структуре набора данных: строки являются
записями, а столбцы – полями. Отметим,
что отображать все поля, содержащиеся
в наборе данных, не обязательно.
Для доступа к отдельным полям БД также имеются соответствующие компоненты. Кроме свойства DataSource, они имеют свойство DataField:String – имя поля набора данных, из которого элемент отображения данных получает информацию. Кратко охарактеризуем эти компоненты.
DBText
– компонент (
)
отображает текущее значение поля набора
данных без возможности редактирования.
Аналогичен элементу Label.
DBEdit
(
)
– представляет собой обычную строку
ввода, аналогичную Edit.
В отличие от DBText
с помощью данного компонента можно не
только просматривать базу данных, но и
редактировать ее.
DBMemo
(
)
– предназначен для отображения и
редактирования полей, содержащих
несколько строк текста (обычно это поля
типа TMemoField
или TBLOBField).
Аналогичен компоненту Memo.
Для визуализации и редактирования
сложного текста с различными стилями
существует компонент DBRichEdit
(
).
DBCheckBox
(
)
– компонент (аналог CheckBox)
предназначен для просмотра и редактирования
данных, которые могут принимать только
два значения. Состояние флажка определяется
свойствами ValueChecked
и ValueUnChecked,
а также значением, содержащемся в поле,
с которым связан компонент. По умолчанию
ValueChecked=true
и ValueUnChecked=false.
Однако этим свойствам можно присваивать
и строковые значения, причем одному
свойству можно назначить несколько
возможных значений, разделенных точкой
с запятой. Если значение поля соответствует
одному из значений свойства ValueChecked,
то флажок будет установлен; если поле
соответствует одному из значений
ValueUnChecked,
то флажок будет снят. При изменении
состояния флажка значение поля становится
равным: при установке флажка – первому
значению в списке ValueChecked,
при сбросе флажка – первому значению
в списке ValueUnChecked.
DBRadioGroup
(
)
– группа переключателей, состояние
которых зависит от значения связанного
с ним поля. Если текущее значение поля
соответствует значению какого-либо
переключателя, то он включается. При
изменении состояния переключателей в
поле заносится значение включенного
переключателя. Свойство Items
содержит список переключателей. Значения,
на которые реагируют переключатели,
определяются свойством-списком Values,
причем каждому значению списка
соответствует один переключатель.
Текущее значение поля содержится в
свойстве Value.
DBListBox
(
)
– компонент служит для отображения
текущего значения поля данных и замены
его на любое значение из списка. При
этом значение поля должно совпадать с
одним из элементов списка. В остальном
компонент DBListBox
ничем не отличается от подобного
компонента ListBox.
DBComboBox
(
)
– отображает значение поля, связанного
с данным компонентом, в строке
редактирования. Текущее значение поля
можно изменять, выбирая новое значение
из выпадающего списка или редактируя
текст в поле ввода. Аналогичен компоненту
ComboBox.
DBImage
(
)
– используется для отображения
графической информации, хранящейся в
БД. Практически аналогичный компонент
Image
будет рассмотрен далее в пп. 5.7.
Компоненты, работающие с отдельными полями, не имеют встроенных средств для изменения положения курсора набора данных, добавления новых записей и удаления существующих записей. Поэтому при их использовании требуются дополнительные элементы управления, обеспечивающие навигацию по набору данных.
В палитре компонентов Delphi
содержится компонент DBNavigator
(
,
страница Data
Controls),
позволяющий решить эту задачу. Компонент
представляет собой набор кнопок,
выполняющих следующие функции:
перемещение курсора набора данных на следующую, предыдущую, первую и на последнюю записи;
вставка новой пустой записи в текущую позицию курсора набора данных;
удаление текущей записи;
перевод набора данных в режим редактирования;
запись изменений в набор данных;
отмена изменений, внесенных в текущую запись;
восстановление исходного значения записи.
Набор кнопок компонента DBNavigator определяется пользователем с помощью свойства VisibleButtons, имеющего тип TButtonSet. Связь компонента с набором данных устанавливается через свойство DataSource. Свойство ConfirmDelete позволяет включить запрос для подтверждения при удалении записи.
Нажатие кнопок в DBNavigator можно производить программно при помощи метода BtnClick(index:TNavigateBtn). Параметр index определяет "нажимаемую" кнопку.
Компонент обрабатывает два события:
BeforeAction – вызывается после нажатия на кнопку элемента типа TDBNavigator, но до выполнения операции, связанной с этой кнопкой (обычно используется для запроса пользователя подтверждения на выполнение операции, приводящей к изменению данных);
OnClick – вызывается после нажатия на кнопку и после выполнения операции, связанных с этой кнопкой.
Наиболее простой тип диалога проектируемого приложения с пользователем можно организовать с помощью окон сообщений. Существует ряд функций для реализации подобных стандартных диалоговых окон. Из них рассмотрим подробно функцию MessageBox, которая является методом переменной Application типа TApplication (эта переменная доступна в любом проекте Delphi). Функция отображает диалоговое окно с заданными кнопками, сообщением и заголовком и позволяет проанализировать ответ пользователя. Во многих отношениях это окно подобно окнам, создаваемым такими функциями, как ShowMessage, ShowMessageFmt, MessageDlg, MessageDlgPos, CreateMessageDialog и др. Но функция MessageBox, в отличие от указанных функций, является наиболее удачным способом отображения полностью русифицированных диалоговых окон (соответственно, в русифицированных версиях Windows).
Функция MessageBox инкапсулирует одноименную функцию API Windows. Синтаксис ее объявления следующий:
function MessageBox(const Text, Caption: PChar;
Flags: Longint = MB_OK): Integer;
Параметр Text представляет собой текст сообщения, которое может превышать 255 символов (для длинных сообщений осуществляется автоматический перенос текста). Параметр Caption – это текст заголовка окна (также может превышать 255 символов, но не переносится).
Параметр Flags представляет собой множество флагов, определяющих вид и поведение диалогового окна. Этот параметр может комбинироваться операцией сложения по одному флагу из следующих групп:
флаги кнопок, отображаемых в диалоговом окне;
флаги пиктограмм в диалоговом окне;
флаги, указывающие кнопку, которая в первый момент находится в фокусе;
флаги модальности;
дополнительные флаги.
Рассмотрим указанные группы более подробно.
Флаги кнопок, отображаемых в диалоговом окне (в скобках указаны надписи, которые будут отображаться в русифицированных версиях Windows):
MB_ABORTRETRYIGNORE – кнопки Abort (Стоп), Retry (Повтор) и Ignore (Пропустить);
MB_OK – кнопка OK (флаг принят по умолчанию);
MB_OKCANCEL – кнопки OK и Cancel (Отмена);
MB_RETRYCANCEL – кнопки Retry (Повтор) и Cancel (Отмена);
MB_YESNO – кнопки Yes (Да) и No (Нет);
MB_YESNOCANCEL – кнопки Yes (Да), No (Нет) и Cancel (Отмена).
Флаги пиктограмм, отображаемых в диалоговом окне:
MB_ICONEXCLAMATION, MB_ICONWARNING – восклицательный знак (замечание, предупреждение);
MB_ICONINFORMATION, MB_ICONASTERISK – буква i в круге (подтверждение);
MB_ICONQUESTION – знак вопроса (ожидание ответа);
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND – знак креста на красном круге (запрет, ошибка).
Флаги, указывающие кнопку по умолчанию, т.е. кнопку, которая в момент визуализации окна находится в фокусе:
MB_DEFBUTTON1 – первая кнопка (принято по умолчанию);
MB_DEFBUTTON2 – вторая кнопка;
MB_DEFBUTTON3 – третья кнопка;
MB_DEFBUTTON4 – четвертая кнопка;
Флаги модальности:
MB_APPLMODAL – пользователь должен ответить на запрос, прежде чем сможет продолжить работу с приложением. Разрешена работа с окнами другого приложения и со всплывающими окнами текущего ПО. Флаг принят по умолчанию.
MB_SYSTEMMODAL – то же самое, что MB_APPLMODAL, но окно диалога отображается в стиле WS_EX_TOPMOST, то есть всегда остается поверх других окон, даже если пользователь перешел к другим приложениям. Используется для предупреждения о серьезных ошибках, требующих немедленного вмешательства.
MB_TASKMODAL – то же самое, что MB_APPLMODAL, но окно диалога отображается как принадлежащее рабочему столу Windows. Флаг используется для сообщений из библиотеки или когда проектируемое ПО не имеет собственного окна.
Дополнительные флаги (могут задаваться оба флага):
MB_HELP – добавляет в окно кнопку Help (Справка), щелчок на которой или нажатие клавиши F1 генерирует событие Help;
MB_TOPMOST – помещает окно сообщения всегда поверх других окон (в стиле WS_EX_TOPMOST).
Возможны еще некоторые флаги, определяющие характер поведения окна при работе в сети нескольких пользователей, позволяющие отображать тексты справа налево (для восточных языков) и т.п.
Функция возвращает нуль, если не хватает памяти для создания диалогового окна. Если же функция выполнена успешно, то ее значение идентифицирует выбранную кнопку (табл. 5.1).
Таблица 5.1.
Значение |
Численное значение |
Пояснение |
IDABORT |
3 |
выбрана кнопка Abort (Стоп) |
IDCANCEL |
2 |
выбрана кнопка Cancel (Отмена) или нажата клавиша Esc |
IDIGNORE |
5 |
выбрана кнопка Ignore (Пропустить) |
IDNO |
7 |
выбрана кнопка No (Нет) |
IDOK |
1 |
выбрана кнопка OK |
IDRETRY |
4 |
выбрана кнопка Retry (Повтор) |
IDYES |
6 |
выбрана кнопка Yes (Да) |
В качестве примера приведем код, предусматривающий проверку существования файла (путь содержится в переменной FName='C:/MyFile.txt') и вывод соответствующих сообщений, а на рис. 5.1 показан внешний вид спроектированных диалоговых окон. Отметим, что если визуализируемый текст сообщения является результатом "склеивания" строк, то в этом случае необходимо применять операцию прямого приведения типов – PAnsiChar(<переменная типа string>).
Р
ис.
5.1. Внешний вид диалоговых окон,
спроектированных
с помощью функции MessageBox
if FileExists(FName) // проверяем существование файла
then Begin
if (Application.MessageBox(
PAnsiChar('Файл '+FName+' существует. Открыть
его?'), 'Подтверждение существования файла',
MB_YESNOCANCEL + MB_ICONQUESTION) <> IDYES)
then begin
... // операторы открытия файла
end
End
else begin
Application.MessageBox(
PAnsiChar('Файла '+FName+' не существует.'),
'Ошибка', MB_ICONSTOP+MB_HELP);
end;