Исходя из приведенной функциональности, наша программа должна иметь следующие элементы: основная форма, модуль данных, вторичные формы (просмотр, редактирование, сортировка для всех таблиц базы данных), параметры программы, диалог для выбора файла данных и форма с информацией о программе.
Для большей универсальности имеет смысл всю специфику вынести в модуль данных, а для работы с таблицами сделать одну общую универсальную форму. Для этого мы будем использовать ряд возможностей, которые нам предоставляет система программирования Delphi. А структура нашей программы будет выглядеть, как приведенная на рис 1.1.
Рисунок 1.1. – Структура программы.
Как видно из приведенного рисунка, самым “функционально нагруженным” у нас является модуль даны. Основная форма ничего не знает о базе данных и о реализации форм просмотра/редактирования таблиц. Все что должна знать Основная форма программы, так это какие действия предусмотрены для реализации необходимой нам функциональности. Мы это обеспечиваем с помощью класса TActionList. Именно в экземпляре этого класса мы храним весь список действий со всеми необходимыми атрибутами (подпись, пиктограмма, строка-подсказка и, собственно, метод реализующий это действие). Такой подход предоставляет нам возможность реализовать несколько разных вариантов основной формы, не затрагивая архитектуру и функциональность всей программы (см. рис.1.2. и рис 1.3).
Рисунок 1.2. - Основная форма программы при использовании ToolBar и MainMenu
Рисунок 1.3. - Основная форма программы при использовании BitBtn и MainMenu
Для подключения к базе данных Access наиболее простым и универсальным способом является технология ADO. Об особенностях реализации этого подхода мы поговорим позже, а сейчас рассмотрим какие информационные потоки необходимо реализовать в нашем проекте (рис.1.4).
Рисунок 1.4. – Схематическое изображение информационных потоков.
Как видно из приведенного рисунка, в нашем случае используется достаточно простая схема: для работы с каждой таблицей нам необходимо использовать один поток передач данных. Причем, используются одинаковые, по сути, инструменты. А исходя из того, что в каждый отдельный момент времени нам не может понадобиться больше, чем одна форма сразу, то для упрощения программы мы можем воспользоваться следующим подходом – создать универсальную форму для работы со всеми таблицами, а необходимые параметры выбирать при обращении к каждой конкретной таблице.
Для доступа к базе данных мы используем ADOConnection. В отличие от других способов доступа к БД в нашем случае для подключения нет возможности использовать привычные свойства DataBaseName и AliasName. При использовании технологии ADO вместо этих свойств используются строки соединения (connection string) и все параметры соединения отображаются и настраиваются именно в них. Существует два основных способа настройки строки соединения – вручную и в специальном диалоговом окне. При собственноручной настройке легко ошибиться в параметрах. И поэтому, большинство разработчиков идет по пути использования редактора строки соединения. Единственный, на наш взгляд, недостаток такого подхода – это привязка к конкретному пути к файлу базы данных. Чтобы избежать недостатков обоих подходов мы пошли по среднему варианту – для первого подключения к базе данных при разработке программы в инспекторе объектов мы использовали редактор строки соединения. И получили правильную строку. Затем, проанализировав ее содержимое, мы увидели в какой части строки хранится информация об имени и пути к файлу базы данных. Теперь, используя элементарные операции для работы со строковым типом данных в Delphi мы можем заменять эту часть строки соединения на любой другой нужный нам файл данных. Это выполняется у нас двумя способами. Первый – автоматически при запуске программы определяется текущий каталог и первое подключение осуществляется к файлу базы данных, который находится в том же каталоге, где и наша программа. Имя файла базы данных (за исключением его расширения) должно совпадать с именем программы. Реализация этого приведена на листинге 1.1. А второй способ – это возможность пользователя нашей программы подключиться к необходимому ему файлу (разумеется, структура базы данных должна совпадать) путем использования диалога выбора файла в форме настройки параметров. (см. рис.1.5, 1.6)
Листинг 1.1. – Фрагмент программы, реализующий автоподключение к БД
procedure TForm5. BitBtn1Click(Sender: TObject);
begin
// Переподключение к БД с заданной строкой подключения
dm. ADOConnection1. Close;
dm. ADOConnection1. ConnectionString: =edit1. Text+edit2. Text+ edit3. Text;
end;
procedure TForm5. FormActivate(Sender: TObject);
begin
// Автоматическое определение имени файла БД и пути к нему
Edit2. Text: = ChangeFileExt(application. ExeName,'. mdb');
BitBtn1Click(Sender);
end;
Рисунок 1.5. - Форма ввода параметров
Рисунок 1.6. - Диалог выбора файла базы данных
Используя компонент ADOTable мы получаем доступ к любой таблице базы данных. Если не указывать имя таблицы при разработке программы, а динамически его подставлять уже при работе, то в форме автоматически будет открываться нужная нам программа. Для этого необходимо соблюдать несколько правил:
Не создавать полей в компоненте ADOTable на этой форме.
Не создавать столбцов в компоненте DBGrid, который подключен через DataSource к ADOTable на этой форме.
Использовать корректные, понятные для пользователя имена полей при разработке базы данных.
Записывать название таблицы в заголовке формы при ее открытии.
Для обеспечения возможности работы в режиме просмотра мы должны только установить свойство ReadOnly компонента ADOTable в состояние True. С учетом всего вышесказанного, вызов универсальной формы должен осуществляться так, как на Листинге 1.2:
Листинг 1.2. – Фрагмент модуля данных, осуществляющий вызов формы для просмотра/редактирования таблиц базы данных.
procedure Tdm. ShowSlovar (aname: string; RO: boolean=true);
var
f: TForm4;
begin
// Метод реализующий вызов формы просмотра/редактирования таблиц
// aname - имя таблицы
// RO – режим доступа
f: =TForm4. Create(self);
f. ADOT. TableName: =aname;
f. Caption: =aname;
if RO then
begin
f. ADOT. ReadOnly: =RO;
f. Caption: =f. Caption+' (только чтение) ';
end;
f. ShowModal;
f. Free;
end;
Для реализации возможности сортировки мы используем локальные индексы. Это продемонстрировано на Листинге 1.3.
Листинг 1.3. – Фрагмент программы для сортировки таблиц
procedure TForm3. DBGrid1TitleClick(Column: TColumn);
var i: integer;
begin // Сортировка
// Убираем расскраску стобцов
for i: =0 to DBGrid1. Columns. Count-1 do
begin
DBGrid1. Columns. Items [i]. Color: =clwhite;
end;
Column. Color: =clLime;
if ADOT. IndexFieldNames=Column. Field. FieldName
then
begin
// Если была прямая сортировка, устанавливаем обратную
Column. Color: =clLime;
ADOT. IndexFieldNames: =Column. Field. FieldName+' DESC'
end
else
begin
// Если не было сортировки по этому полю (или обратная)
// устанавливаем прямую сортировку
Column. Color: =clAqua;
ADOT. IndexFieldNames: =Column. Field. FieldName;
end;
end;
В результате мы получили форму, пример использования которой приведен на рис.1.7.
Рисунок 1.7. – Внешний вид универсальной формы при работе с таблицей РемонтУзлов в режиме просмотра.
В данной работе была спроектирована и реализована информационная - справочная система "Автосервис", обеспечивающая:
ввод, редактирование и просмотр данных;
ответы на запросы пользователя;
поиск необходимой информации;
формирование отчетов.
Освоены навыки проектирования баз данных методом ER-диаграмм.
Реализация системы проводилась с использованием инструментального средства разработки приложения Microsoft Access2003/XP и языка программирования Object Pascal.
При написании программы основное внимание было уделено удобству работы пользователя с программой и построению дружественного интерфейса.
Результаты тестирования показали, что программа работает верно во всех предполагаемых ситуациях.
1. Хохлачев Е.Н. "Теоретические основы создания и применения АСУ", Москва, Министерство обороны, 1987г.
2. Абчук В.А., Лифшиц А.Л., Федулов А.А., Куштина Э.И. "Автоматизация управления", Москва "Радио и связь", 1984г.
3. Мамиконов А. Г. "Проектирование АСУ" (учебник для вузов), Москва "Высшая школа".
4. Ахаян Р., Горев А., Макашарипов С. "Эффективная работа с СУБД", Санкт-Петербург, 1997г.
5. Гончаров A. "Access 2000 в примерах" Санкт-Петербург, 1997г.
6. Фленов М.Е. Библия Delphi. -2-e изд., БВХ-Петербург, 2008 г.