Материал: Основы разработки программных средств в среде Delphi. Романов А.В

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

При работе с реляционными БД важное значение имеет понятия поля – описание типа данных, которому соответствует значение в таблице базы данных. В наборе данных 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 – вызывается после нажатия на кнопку и после выполнения операции, связанных с этой кнопкой.

5.5. Компоненты организации диалога

5.5.1. Окна сообщений

Наиболее простой тип диалога проектируемого приложения с пользователем можно организовать с помощью окон сообщений. Существует ряд функций для реализации подобных стандартных диалоговых окон. Из них рассмотрим подробно функцию 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;

Источник: https://studfile.net/preview/16568022/