WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 7 | 8 || 10 | 11 |   ...   | 14 |

Создание экземпляра класса TloginData. Кроме того, создается экземпляр класса TloginData, который будет передаваться этой процедуре:

LoginData: = TLoginData.Create;

Вызов процедуры ShowLoginDialog. И только после проведения описанных подготовительных процедур, производится вызов процедуры ShowLoginDialog, экспортируемой ИЗ DLL:

ShowLoginDialog(Application.Handle,LoginData);

Именно здесь создается и выводится на экран диалоговое окно ввода паро- ля, а введенные данные передаются в класс LoginData. После выполнения сво- их функций DLL выгружается из памяти:

FreeLibrary(hLib);

Использование данных, полученных с помощью DLL. Далее мы работаем с классом LoginData. В первую очередь проверяется, была ли нажата кнопка ок. Если нет, то вообще ничего делать не надо. Если клавиша ок была нажата, то выполняется обычное подключение к БД, предварительно отключив - 89- стандартный входной диалог и подставив пароль и login,:

LoginPromt: = false;

Params.Values['PASSWORD']: = Trim(LoginData.password);

Params.Values['USER NAME']: = Trim(LoginData.user_id);

Откомпилируйте проект и запустите программу. При выборе пункта меню «Связь с сервером...» на экране появится диалоговое окно для ввода пароля.

На этом создание заготовки клиентского приложения закончено. Далее, по мере изложения, модуль main будет изменяться.

3.3.5. ОБЩАЯ СХЕМА РАБОТЫ ПРИЛОЖЕНИЯ ПРИ ПОДКЛЮЧЕНИИ К БД В сжатом, схематическом изложении, созданный процесс подключения к БД описывается следующим образом:

• начинает работу главный модуль uMain;

• после выбора пункта меню «Система\Связь с сервером...»:

> главный модуль uMain загружает DLL в память;

> инициализируется указатель на структуру TLoginData, размещенной в модуле uLoginData;

> инициализируется указатель на функцию showLoginDialog, размещен- ной в модуле uLogin;

• управление передается модулю uLogin:

> uLogin создает форму для ввода данных;

> пользователь вводит данные в элементы ввода формы;

> пользователь нажимает кнопку ок, и данные заносятся в элементы структуры TLoginData из модуля uLoginData. Это возможно благодаря тому, что в раздел uses модуля uLogin введен модуль uLoginData, а в описании класса формы TfLogin объявлен указатель LoginData;

• управление снова передается главному модулю:

• DLL выгружается из памяти;

> свойству LoginPromt компонента Database присваивается значение false, а данные из элементов структуры TLoginData загружаются в массив Params;

> компонент Database по полученным данным производит подключение к БД и выводится сообщение ' Соединение выполнено ' ;

> выполняется работа с БД путем вызова одной из библиотек DLL, кото- рые будут описаны ниже;

> после завершения работы с БД, выгружается DLL для работы с БД, вы- бирается пункт меню «Система\Завершить сеанс...» и на этом работа с при- ложением завершается.

Описанная схема приведена на рис. 60.

-90- Рис. 60. Схема подключения к БД 3.4. ДИАЛОГОВЫЕ ОКНА 3.4.1. ОБЩАЯ СХЕМА СОЗДАНИЯ ДИАЛОГОВЫХ ОКОН В ходе разработки БД нами были созданы таблицы, соответствующие сущностям ПрдО (см. табл. 13). Для манипуляции данными, хранящимися в таблицах БД, в клиентском приложении следует создавать классы, соответствующие сущностям ПрдО, а для редактирования экземпляров этих классов необходимо создать диалоговое окно. При этом каждой сущности должны соответствовать два вида окон - форма элемента и форма списка.

Форма элемента ~ это диалоговое окно, которое служит для ввода и редактирования атрибутов экземпляра сущности. В общем виде она должна выглядеть как -91- показано на рис. 61 (а). На форме Табл. 13. Объекты, выделенные в процессе содержатся несколько полей ре- дактирования, условно отмечен- анализа прикладного окна ных как «Параметр». Форма ра- Сущности ПрдО Таблицы БД ботает в двух режимах:

Список группы GROUPP, • В режиме ввода нового эк- земпляра поля редактирования | Список студентов STUDENT | Список кафедр KATHEDRA очищаются. Для внесения нового экземпляра сущности для всех Список преподавателей TEACHER таблиц предусмотрена хранимая | Предметы PREDMET процедура, План проведения занятий STUDYING называющаяс Экзаменационная ведомость RATING • В режиме редактирования, значения параметров текущего экземпляра сущности заполняются из БД, чтобы пользователь мог их изменить. Для изменения значений параметров экземпля- ров сущностей для всех таблиц предусмотрена хранимая процедура upd<имя_таблицы>.

• Внесение нового экземпляра или изменений в БД осуществляется нажатием кнопки «Да».

• Нажатием кнопки «Отмена» осуществляется выход из диалога без сохране- ния изменений.

Форма списка, общий вид которой приведен на рис. 61 (б), отображает на экране перечень экземпляров сущности. На форме предусмотрен элемент ото- бражения списка и четыре кнопки:

При нажатии кнопки «Добавить...» вызывается форма элемента в режиме ввода.

При нажатии кнопки «Свойства...» вызывается форма элемента в режиме редактирования.

Рис. 61. Форма элемента (а) и форма списка (б) - 92- • Кнопка «Удалить» производит удаление выделенного элемента из таблицы БД. Для удаления экземпляров сущностей для всех таблиц предусмотрена хра- нимая процедура del<имя_таблицы>.

3.4.2. ПОДГОТОВКА К СОЗДАНИЮ ДИАЛОГОВЫХ ОКОН В ходе дальнейшей разработки пользовательского приложения для каждой сущности БД будем создавать формы описанных типов. Поэтому определим их как базовые классы, которые будут использованы при создании форм списка и форм элемента. Для этого следует создать их и внести в репозитарий.

1. Выберите проект main.exe и добавьте в него новую форму (File\New Form). По умолчанию Delphi создаст ее с именем Forml, а соответс твующий модуль - Unitl.

Помес тите на нее две кнопки и компоненты для работы с БД TDataSource, TDataBase, TStoredProc (рис. 62). Рис. 62. Форма fBaseElemForm 2. С помощью Object Inspector устано- вите указанные в табл. 14 значения свойств.

3. Сохраните модуль в подкаталоге COURSE/Common как uBaseElemForm.

4. Теперь внесите форму в репозитарий, для чего щелкните по свободному месту формы плавающее командное меню и выберите команду меню формы «Add to Repositary...».

5. Заполните поля диалогового окна, как показано на рис. 63.

Табл. 14. Значения свойств компонентов, размещенных на форме fBaseElemForm Компонента Свойство Значение Forml BorderStyleName BsDialog Name FBaseElemForm Button 1 Caption Отмена Name BtnCancel MrCancel ModalResult Button2 Caption OK Name BtnOK ModalResult MrOKl DataSourcel DataSet StoredProcl DataBasel DatabaseName ' TEACHER StoredProcl DatabaseName i TEACHER В поле «Description» можно ввести текстовую информацию о форме.

В поле «Author» укажите свою фамилию и нажмите «ок». Удалите форму из проекта main. Для этого выделите ее в дереве группы, выберите в командном -93- меню «Remove From Project» и подтвердите удаление. Файл этой формы со- хранен в каталоге проекта Common и будет использоваться при создании новых форм на ее основе.

Точно также следует создать и базовую форму списка, от которой будут наследоваться все такие диалоговые окна.

1. Добавьте в проект main новую форму.

2. Установите на нее четыре кнопки и компоненты - список TListBox, а так- же TDataSource, TDataBase, TStoredProc, как это было сделано выше.

Табл. 15. Значения свойств компонентов, размещенных на форме fBaseElemForm Компонента Свойство Значение Forml BsDialog BorderStyle FBaseListForm Name Button Caption «Добавить» Name btnAdd ButtonCaption «Свойства» Name btnProp ButtonCaption «Удалить» Name btnDelete Button«Выход» Caption btnOK Name DataSourcel DataSet Queryl DataBase 1 DatabaseName TEACHER StoredProcl DatabaseName TEACHER Queryl DatabaseName TEACHER 3. Кроме того, вставьте дополнительно компонент TQuery (рис. 64 и табл.

15).

4. Сохраните модуль в подкаталоге COURSE/Common как uBaseListForm.

5. По аналогии с предыдущей формой поместите форму в репозитарий и удалите его из проекта.

Теперь все готово для создания диалогового окна. Как мы договорились, каждый диалог будет храниться в отдельной библиотеке DLL. Для каждого объекта будет создан программный класс, описание которого должно помещаться в отдельном модуле, хранящемся в каталоге Common. Кроме того, мы создадим форму элемента и форму списка для каждого из объектов.

Имена объектов и имена форм и модулей приведены в табл. 16. В ней приняты следующие соглашения для именования форм и модулей:

• DLL и каталог проекта, в котором она создается, будем именовать dlglib

• имя модуля класса будет начинаться с символов uc - от слов unit и class;

• имя модуля элемента начинается на ue, а модуля формы списка ul;

• имя формы элемента начинается на fе, а формы списка на fl.

94- Табл. 16. Классы диалоговых окон Каталог Модуль Форма элемента/ Объект приклад- Класс объекта класса форма списка ного окна ucGroups dlglib0l feGroups Список группы TGroups flGroups dlglibucStudents dlglib03 fe Students dlglib04 fl Students Список студентов TStudents Список кафедр TKathedrs ucKathedrs dlglib05 feKathedrs dlglib06 flKathedrs TTeachers ucTeachers Список преподава- dlglib07 feTeachers телей dlglib08 flTeachers Предметы dlglibTSubject ucSubject feSubject dlglibflSubject dlglibll TStudying ucStudying План проведения feStudying dlgliblзанятий flStudying Экзаменационная TRating ucRating feRating dlgliblведомость flRating dlglib3.4.3. ДИАЛОГОВЫЕ ОКНА ДЛЯ ТАБЛИЦЫ GROUPS 3.4.3.1. СОЗДАНИЕ ПРОЕКТА DLGLIB1. Создайте в группе UchebyProcess новый проект. Для этого следует в ко- мандном меню группы выбрать «Add new project» и выбрать в диалоговом окне значок DLL.

2. Сохраните новый проект Projectl под именем dlglib0l в каталоге dlglib0l, который следует создать в основном каталоге приложения Course.

3. Переставьте проекты, входящие в группу UchebyProcess таким образом, чтобы главный модуль main.exe компилировался последним (рис. 65).

Рис. 64. Форма fBaseListForm Рис. 63. Окно добавления формы в репозитарий - Рис. 65. Проекты, входящие в группу 3.4.3.2. СОЗДАНИЕ ПРОГРАММНОГО КЛАССА Теперь создадим программный класс для работы с данными таблицы Groups. Объект «Группы» представлен в моделировании данных сущностью ГРУППЫ (табл. 17), которой на физическом уровне соответствует таблица GROUPS. Создаваемый программный класс TGroups должен обладать элемента- ми, которые соответствовали бы атрибутам сущности, а значит колонкам таб- лицы БД, показанными выше.

Табл. 17. Атрибуты сущности «Группы» Сущность Тип данных Имя колонки БД Атрибут ГРУППЫ. Number kod_groupp Код группы Название группы String name_groupp Количество студентов Number kol students Проходной балл Real sredny_ball 4. Выберите меню «File/New» и выберите значок модуля Unit. Сохраните добавленный модуль Unitl под именем ucGroups.pas в каталоге Common.

5. Введите определение класса TGroups, как показано на листинге:

unit ucGroups;

interface type TGroups = class kodgroup: integer;

name_group: shortstring;

kol_students: integer;

sredniy_ball: float;

changed: boolean;

public constructor Create;

end;

implementation { TGroups } -96- constructor Groups.Create;

begin inherited;

kod_groupp := 0;

namegroup := ' ';

kol_students := 0;

sredniy_ball := 0;

changed := false;

end;

end.

Класс TGroups содержит четыре элемента - kodgroup, name_group, kolstudents и sredniy_ball, имена которых совпадают с именами полей таблицы БД. Кроме этого, у класса имеется свойство - признак changed, кото- рый используется для того, чтобы определить, изменились ли значения осталь- ных членов класса. Понятно, что TGroups является наследником базового клас- са TObject.

3.4.3.3. СОЗДАНИЕ ФОРМЫ ЭЛЕМЕНТА Теперь создадим форму элемента.

1. Добавьте к проекту dlglib0l новую форму элемента, воспользовавшись помещенной в репозитарий формой «Базовая форма элемента». Для этого необходимо выбрать в меню «File/New», а затем в диалоговом окне «New Item» указать на странице «Forms» значок «Базовая форма элемента» И ОК.

В нижней части диалогового окна «New item» имеется переключатель, позво- ляющий выбрать способ, которым форма из репозитария будет вставлена в проект. Он имеет несколько положений:

• Сору - в проекте создается точная копия выбранной формы или модуля данных из репозитария.

• inherit - наследование - это наиболее гибкий способ использования форм. Он особенно эффективен, когда на основе одной формы из репозитария в приложении создается несколько однотипных форм. При наследовании в про- ект включается базовая форма из репозитария, кроме того, создается новая форма, класс которой является наследником класса из репозитария.

• Use - используемая форма добавляется в проект, и изменения в ней затронут все другие приложения, которые тоже используют эту форму. В первую очередь этот режим предна- значен для модулей данных.

Так как каждая DLL содержит у нас только одну форму, мы используем копирование.

Нажмите ОК. Сохраните новый модуль unitl в каталоге dlglib0l под именем ueGroups. Рис. 66. Форма fBaseElemForml - 97- 2. Поместите на форму по три компонента TEdit, TLabel и скомпонуйте ее, как показано на рис. 66. Значения свойств компонентов должны быть заданы так, как показано в табл. 18.

Табл. 18. Значения свойств компонентов fBaseElemForml и LabelСвойство \ Компонент Значение fBaseElemForml \ Name feGroups Caption Группы Label 1 Caption Обозначение группы Editl Text........... • _..........

Label2 Caption Количество студентов Edit2 Text Label3 Caption Проходной балл Edit3 Text 3. Дополните описание класса формы, как показано на листинге TfeGroups = class(TForm) btnCancel: TButton;

btnOK: TButton;

DataSourcel: TDataSource;

StoredProcl: TStoredProc;

Databasel: TDatabase;

Labell: TLabel;

Editl: TEdit;

Label2: TLabel;

Edit2: TEdit;

LabelS: TLabel;

Edit3: TEdit;

private {Private declarations} Groups: TGroups;

public (Public declarations} procedure CloseProc;

function GetElement: Boolean;

function InsElement: Boolean;

function UpdElement: Boolean;

end;

По этой схеме в приложении будет создано большинство форм элемента.

Здесь Groups - указатель класса, который используется для передачи данных о редактируемом объекте. Как уже говорилось выше, форма может быть исполь- зована в двух режимах - в режиме ввода и в режиме редактирования. То есть, вызывая эту форму, следует указать, в каком именно режиме должна отрабо- тать, поэтому процедура вызова должна иметь примерно следующий вид:

procedure ShowElemDlg(const DlgMode: Boolean);

-98- Пусть параметр DlgMode имеет значение true для режима вставки и false — для режима редактирования. Кроме того, понадобятся процедуры создания диалога и настройки связи с БД.

procedure CreateElemDlg (Handle : Thandle, p : pointer );

procedure SetElemConnection (const PBHandle : HDBIDB);

Эти три процедуры будут импортироваться из DLL.

Теперь рассмотрим методы класса TfeGroups. Процедура CloseProc вве- дена для удобства, так как операция закрытия набора данных применяется дос- таточно часто.

procedure TfeGroups.CloseProc;

begin if StoredProcl.Active then StoredProcl.Close;

end;

Функции GetElement, InsElement И UpdElement - основные «рабочие ло- шадки» нашей формы:

GetElement - получает строку из БД;

InsElement - вставляет строку из БД;

UpdElement - изменяет строку БД.

Здесь речь идет о таблице GROUPS.

Организация доступа к хранимым процедурам. Проектируя БД в преды- дущей части, мы предусмотрели хранимые процедуры для манипулирования данными - в случае таблицы GROUPS это были процедуры ins_groups, upd_groups и del_groups, которые производят вставку, изменение и удаление типа оборудования (табл. 19).

Pages:     | 1 |   ...   | 7 | 8 || 10 | 11 |   ...   | 14 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.