- •Методические указания к выполнению лабораторных работ по дисциплине
- •1. При проектировании используйте примеры программного кода непосредственно из исходных текстов программ, а не из методических описаний (*.Doc файла)
- •2. Имена отдельным модулям лучше давать по их функциональности, а не оставлять так как они даются по умолчанию (Unit1.Pas, Unit2.Pas и т.Д.)
- •3. При возникновении каких-либо ошибок в процессе выполнения работы проверьте по исходному примеру, все ли модули подключены в разделах interface и implementation, подразделе uses.
- •Теоретическое введение
- •Создание структуры таблиц бд
- •3.3 Синтез иконки прикладного приложения
- •3.4 Размеры экранных форм и их положение на экране
- •3.5 Разработка подчинённых форм
- •Создание формы
- •Размеры и положение
- •Работа приложения с бд
- •Доступ к таблицам бд. Компоненты доступа к данным. Приложение
- •AdoDataSet (Набор данных) или adoQuery (Запрос)
- •Сохранение пути к бд
- •Работа с данными
- •Обработка данных
- •Сортировка
- •Отчёты и обработки
- •Запросы, содержащие вычисления на выделенных записях таблицы (по столбцам)
- •В обработке события OnClick кнопки Button необходимо прописать следующее:
- •Разграничение прав доступа для различных пользователей
- •Организация многопользовательского режима
Размеры и положение
Для корректного отображения подчинённой формы желательно, чтобы её размеры должны быть несколько меньше, чем у главной формы. Кроме того, для подчинённой формы вполне достаточно одной системной кнопки закрытия окна, для чего свойство формы Border Style в значение bsDialog. Выводиться она должна по центру главной формы. Для этого следует установить свойство Position в значение poMainFormCenter. Таким образом, приложение должно иметь следующий вид, представленный на рисунке 11.
Рисунок 11 – Размеры подчинённой формы
Работа приложения с бд
Доступ к таблицам бд. Компоненты доступа к данным. Приложение
AdoDataSet (Набор данных) или adoQuery (Запрос)
Схема взаимодействия программы и элементов управления с БД
Связываться с БД будем по технологии ADO. Компоненты, которые мы будем использовать, расположены на вкладках ADO, Data Access, Data Controls палитры компонентов (см. рисунок).
Основные компоненты
Желательно все не визуальные компоненты вынести в модуль данных, уже из него вызывать их. Поэтому создаём новый модуль данных (File → New → Data Module), появится форма с белым фоном, и назовём его DM (свойство Name).
Примечание: Не забудьте в тех модулях, где будет использоваться модуль данных в разделе implementation указать Uses и имя файла модуля данных (именно то имя, которое принадлежит файлу модуля данных имя.pas).
Поместим в него компоненты ADOConnection , 4 компонента ADOQuery с вкладки ADO, и 4 компонента DataSource с вкладки Data Access. Переименуем каждый компонент ADOQuery в SotrQuery, HobbyQuery, DolgnostQuery, Hobby_SotrADOQuery и каждый компонент DataSource в SotrDataSource, HobbyDataSource, DolgnostDataSource, Hobby_SotrDataSource соответственно. В результате должно получиться примерно, как показано на рисунке 12.
Рисунок 12 – Модуль данных
В свойстве DataSet компонента SotrDataSource из выпадающего списка выберем SotrQuery, в свойстве Connection компонента SotrQuery из выпадающего списка выберем ADOConnection1.
Примечание.
Обратите внимание, что свойство DataSet компонента SotrDataSource должно быть заполнено из выпадающего списка. И туда мы разместим либо набор данных запрос (в нашем случае SotrQuery), либо набор данных DataSet.(см.рисунок).
В свою очередь свойство DataSource компонента SotrQuery должно остаться незаполненным (см.рисунок).
В свойстве LoginPrompt компонента ADOConnection1 установить значение False (см. рисунок). Аналогично с HobbyDataSource и HobbyQuery, DolgnostDataSource, Hobby_SotrDataSource и DolgnostQuery.
ДЛЯ СВЯЗИ С БАЗОЙ ДАННЫХ
Для связи с БД необходимо указать строку подключения в строковом свойстве ConnectionString в компоненте ADOConnection1. Её можно создать двумя способами:
1)либо составив с помощью стандартного конструктора (этот способ применяется пока ещё идёт отладка программы). Последовательность шагов представлена ниже.
1 шаг: нажать на кнопку с тремя точками в строке подключения.
2 шаг: построить..
3 шаг: выбор драйвера БД
4 шаг: указать путь БД и проверить подключение
2)либо задав вручную в коде программы. В состав строки подключения входят путь к БД, используемый драйвер, и признак безопасности. Воспользуемся вторым случаем, так как в последствие необходимо будет загружать путь к базе из файла.
В событии BeforeConnect компонента ADOConnection1 следует вставить следующий код:
procedure TDM.ADOConnection1BeforeConnect(Sender: TObject); var DBPath:widestring; // путь к БД begin DBPath:=’{здесь необходимо указать путь к БД оканчивающийся «\», например C:\DB\}’; //составляем ConnectionString ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DBPath+'SOTRUDNIKI.mdb;Persist Security Info=False'; end; |
Теперь поместим на форму S_sotrudnikiForm визуальный компонент отображения DBGrid с вкладки Data Controls. В его свойстве DataSource из выпадающего списка выбираем DM.SotrDataSource, предварительно указав DataModule в разделе Uses. В свойстве Options установить значение параметра dgEditing в False, для невозможности редактирования данных пользователем.
После раздела Public объявим константу, соответствующую запросу выбора всех записей из таблицы SOTR, т.к. обращение к этому запросу будет происходить неоднократно в процессе работы:
public { Public declarations } end; const SOTR_SQL='SELECT * FROM SOTR '; |
Введение данной константы необходимо ТОЛЬКО для уменьшения программного кода и, в общем случае, не является обязательным.
В событии onCreate формы S_sotrudnikiForm наберём следующий код:
procedure TS_sotrudnikiForm.FormCreate(Sender: TObject); var i:integer; begin //подключение к БД DM.ADOConnection1.Connected:=true; //очистка текста запроса DM.SotrQuery.SQL.Clear; DM.HobbyQuery.SQL.Clear; DM.DolgnostQuery.SQL.Clear; //формирование запроса DM.SotrQuery.SQL.Add(SOTR_SQL+';'); DM.HobbyQuery.SQL.Add('SELECT * FROM HOBBY;'); DM.DolgnostQuery.SQL.Add('SELECT * FROM DOLGNOST;'); //исполнение запроса и вывод результата DM.SotrQuery.Open; DM.HobbyQuery.Open; DM.DolgnostQuery.Open; |
! ! ! Таким образом, и в дальнейшем, при работе с тем или иным запросом, сначала его необходимо очистить (SQL.Clear), затем – добавить сам текст запроса (SQL.Add), а затем – открыть (Open) или просто исполнить без открытия (ExecSQL).
Кроме того, при работе со связанными таблицами в той или иной форме, необходимо описать ВСЕ запросы, соответствующие связанным таблицам в событии FormCreate.
При выборе пункта главного меню «Сотрудники» отобразится форма представленная на рисунке 13.
Рисунок 13 – Справочник - сотрудники
Связанные поля из набора данных выводятся не значением этого поля, а кодом его связи. Этого можно избежать либо путем создания запроса, выводящего значения связных полей и обращением DBGridа к этому запросу, либо путем вывода связанных полей не в DBGrid, а в другие визуальные компоненты (на этом способе мы и остановимся).
Таким образом, в DBGrid будем выводить только несвязанные поля таблицы. Это, как и оформление компонента DBGrid, возможно сделать двумя путями:
программно (реализован в примере для справочников «Сотрудники» и «Должности») – заполнение заголовков таблицы и обеспечение невидимости связанных и рабочих столбцов прописывается в событии OnFormCreate формы Сотрудники;
// Заполняем заголовки DBGrid1 // Эти заголовки будут отображаться вместо имен полей в таблице БД DBGrid1.Columns.Items[0].Title.Caption:='Код'; DBGrid1.Columns.Items[1].Title.Caption:='Фамилия'; DBGrid1.Columns.Items[2].Title.Caption:='Имя'; DBGrid1.Columns.Items[3].Title.Caption:='Отчество'; DBGrid1.Columns.Items[4].Title.Caption:='Дата рождения';
// делаем невидимыми последние 3 столбца: Код Должности, Признак редактирования, и Формат фото for i:=1 to 3 do DBGrid1.Columns.Items[DBGrid1.Columns.Count-i].Visible:=false; |
с помощью настроек компонента (редактор столбцов) – в программном коде ничего не прописывается. В примере этот способ реализован для справочника «Хобби». Для этого необходимо вызвать редактор столбцов либо путем двойным нажатием левой клавиши мыши, либо нажатием правой и выбором из меню Columns Editor. В появившемся диалоговом окне устанавливаются свойства столбцов. Для добавления столбца необходимо нажать кнопку Add. Тогда будет создан столбец, не связанный ни с каким набором данных. Для его связи с тем или иным полем набора данных необходимо обратится к свойству Field Name и внести имя поля, которое соответствует данному столбцу (например, H_ID). Настройка заголовка столбца происходит в свойстве Title (рисунок 14) – здесь в свойстве Captoin мы задаём имя столбца, которое будет видно пользователю (например, для поля H_ID – «код»). Для того, чтобы сделать столбец невидимым, необходимо свойству visible присвоить значение false (например, для поля EDIT и для всех полей из связанных таблиц). Таким образом, столбцы можно располагать в любом порядке и ненужные не выводить (рисунок 15).
Рисунок 14 – Настройка свойств заголовка столбца
Рисунок 15 – Настройка столбцов таблицы
В таблице 1 представлены назначения подсвойств свойства Title.
Таблица 1 – Назначения подсвойств свойства Title
Aligment |
Выравнивание заголовка. По умолчанию – влево |
Caption |
Определяет текст заголовка |
Color |
Определяет цвет фона заголовка |
Font |
Определяет тип, размер и цвет шрифта |
Вывод связанных полей рассмотрим в пункте 4.3.
При каждом закрытии формы (событие onClose) необходимо закрывать соединение с базой:
DM.SotrQuery.Close; (было реализовано в примере для каждой формы)
или
DM.ADOConnection1.Close;
или
DM.ADOConnection1.Connected:=false;
Создадим процедуру Refresh, которая будет обновлять записи при ее вызове (реализовано в основном для многопользовательского режима).
Объявим данную процедуру в разделе private:
private { Private declarations } procedure Refresh; |
Далее опишем эту процедуру сразу после раздела uses:
uses DataModule; {$R *.dfm}
procedure TS_sotrudnikiForm.Refresh; var i:integer; begin DM.SotrQuery.Close; DM.SotrQuery.Open; // Заполняем заголовки DBGrid1 // Эти заголовки будут отображаться вместо имен полей в таблице БД DBGrid1.Columns.Items[0].Title.Caption:='Код'; DBGrid1.Columns.Items[1].Title.Caption:='Фамилия'; DBGrid1.Columns.Items[2].Title.Caption:='Имя'; DBGrid1.Columns.Items[3].Title.Caption:='Отчество'; DBGrid1.Columns.Items[4].Title.Caption:='Дата рождения';
for i:=1 to 2 do // делаем невидимыми последние 2 столбца DBGrid1.Columns.Items[DBGrid1.Columns.Count-i].Visible:=false; end; |
Если настройка столбцов DBGrid осуществлялась программно (в примере реализованно для справочников «Сотрудники» и «Должности»), то при закрытии и открытии запроса вновь будут показаны все поля запроса, в чем нет надобности, т.к. поля код должности, признак редактирования и расширение фото должны быть невидимыми пользователю, поэтому их снова скрываем программно, точно так же, как и в событии OnCreate объекта S_SotrudnikiForm.
Если настройка столбцов DBGrid осуществлялась с помощью настроек самого компонента, то нет необходимости делать невидимыми последние столбцы, т.к. этот компонент их выводить не будет (см. пример справочник «Хобби»).