- •Проектирование и создание прикладной системы для работы с базой данных
- •Теоретические сведения Методика построения прикладной системы для работы с базой данных
- •Использование методики для выполнения учебного задания
- •Формы, обеспечиваюшие пользовательский интерфейс
- •Свойства пунктов главного и дополнительных меню
- •Свойства компонентов tSpeedButton
- •Свойства компонентов, расположенных на форме fmEditflat и в модуле данных
- •Значения свойств компонентов tTable
- •Значения свойств компонентов tDataSource
- •Значения свойств полей для компонента taHave_d
- •Значения общих cвойств визуальных компонентов
- •Лабораторное задание и порядок выполнения работы
- •Требования к отчету
Свойства компонентов, расположенных на форме fmEditflat и в модуле данных
Name |
Caption |
Name | ||||||
Старое |
Новое |
Старое |
Новое | |||||
Label1 |
laAddress |
Адрес |
DBEdit1 |
deAddress | ||||
Label2 |
laSkv |
Площадь квартиры |
DBEdit2 |
deSkv | ||||
Label3 |
laNrooms |
Число комнат |
DBEdit3 |
deNrooms | ||||
Label4 |
laKCategory |
Категория квартиры |
DBComboBox1 |
dcKCategory | ||||
Label5 |
laKvm |
Кв.м. |
Table1 |
taFLAT | ||||
Button1 |
buExit |
Выход |
DataSource1 |
dsFLAT | ||||
Button2 |
buCancel |
Отмена |
DBNavigator1 |
naFLAT | ||||
Name |
DatabaseName |
Table Name |
DataSet |
Data Source |
DataField |
Visible Buttons | ||
taFLAT |
dbTUTOR |
FLAT.DB |
|
|
|
| ||
dsFLAT |
|
|
taFLAT |
|
|
| ||
naFLAT |
|
|
|
dsFLAT |
|
nbFirst, nbPrior, nbNext, nbLast | ||
deAddress |
|
|
|
dsFLAT |
Address |
| ||
deSkv |
|
|
|
dsFLAT |
Skv |
| ||
deNrooms |
|
|
|
dsFLAT |
NRooms |
| ||
dcKCategory |
|
|
|
dsFLAT |
KCategory |
|
Для компонента taFLAT последним устанавливается значение свойства Active=True.
Для кнопки Выход установим значение свойства Default=True, чтобы она реагировала на нажатие клавиши Enter.
Компонент dcKCategory позволяет задавать значение поля (атрибута) KCategory нажатием на клавиатуре клавиш со стрелками или выбором одного из допустимых значений, предусмотренных в списке, который появляется при нажатии на кнопку со стрелкой. Список допустимых значений определяется свойством Items этого компонента. Для создания или проверки списка нужно дважды щелкнуть на свойстве Items, чтобы появилось окно String List Editor, в котором набираются строки, содержащие допустимые значения поля KCategory: П, Н, К.
Форма fmEDITFLAT используется как в режиме ввода, так и в режиме редактирования. Для задания режима необходимо предусмотреть признак Editing, объявив его как поле Boolean Editing в разделе public класса TfmEDITFLAT в файле EDITFLAT.h. Editing=True, если форма используется в режиме редактирования; Editing=False, если форма используется в режиме ввода. Этот признак должен устанавливаться перед активацией формы.
При активизации формы происходит событие OnActivate, процедура обработки которого должна анализировать признак Editing и настраивать форму на заданный режим работы. Текст этой процедуры приведен на листинге 2.
Листинг 2. Процедура обработки события OnActivate
void __fastcall TfmEDITFLAT::FormActivate(TObject *Sender)
{
if (Editing)
{
Caption = "Изменение сведений о квартире";
naFLAT->Show(); // Навигатор виден
dmPERSPROF->taFLAT->Edit(); // Режим редактирования
}
else
{
Caption = "Регистрация сведений о квартире";
naFLAT->Hide(); // Навигатор не виден
dmPERSPROF->taFLAT->Append(); // Режим дополнения
};
}
Для кнопок Выход и Отмена следует задать процедуры обработки события OnClick. Переход в окно текстового редактора для ввода текста процедур осуществляется двойным щелчком на кнопке Выход или Отмена. Текст процедур показан на листинге 3.
Листинг 3. Процедуры обработки событий OnClick для кнопок Выход и Отмена
void __fastcall TfmEDITFLAT::buExitClick(TObject *Sender)
{
if (((dmPERSPROF->taFLAT->State==dsEdit)||(dmPERSPROF->taFLAT->State==dsInsert))
&& dmPERSPROF->taFLAT->Modified)
dmPERSPROF->taFLAT->Post();//Сохранить изменения, если действует режим
//редактирования/добавления и строка изменялась
fmEDITFLAT->Close();
}
void __fastcall TfmEDITFLAT::buCancelClick(TObject *Sender)
{
dmPERSPROF->taFLAT->Cancel(); //Отменить изменения
fmEDITFLAT->Close();
}
На этом создание формы fmEDITFLAT завершается. Остается связать ее с пунктом меню Квартира в главной форме и кнопкой на панели быстрого доступа.
Сохраним сделанные в проекте изменения командой File | Save All, задав имя EDITFLAT для файла с модулем формы fmEDITFLAT, и перейдем в окно главной формы.
Для связи формы fmEDITFLAT с главной формой нужно, работая в конструкторе меню, дважды щелкнуть на пункте меню Квартира и в окне активизированном текстового редактора набрать два оператора, показанные на листинге 4. Кроме этого необходимо подключить модуль формы fmEDITFLAT к главной форме приложения, выбрав команду File | Use Unit и указав файл модуля EDITFLAT в окне Use Unit.
Листинг 4. Процедура активизации формы fmEDITFLAT в режиме ввода
void __fastcall TfmMAINFORM::mmEditFlatClick (TObject *Sender)
{
fmEDITFLAT->Editing = False; // Задать режим ввода
fmEDITFLAT->ShowModal(); // Активизировать форму
}
Эти же операторы должны выполняться при нажатии кнопки sbNewFlat, поэтому в качестве процедуры обработки события OnClick для этой кнопки зададим процедуру mmEditFlatClick, приведенную на листинге 4. Для этого нужно в главной форме щелкнуть на строке события OnClick, щелчком на кнопке со стрелкой вызвать список имен процедур обработки событий и выбрать имя mmEditFlatClick.
Сохранив изменения командой File | Save All, можно проверить работоспособность проекта, осуществив активизацию созданной формы из меню или кнопкой на панели быстрого доступа и убедившись в правильном функционировании формы fmEDITFLAT.
Аналогичным способом создаются две другие формы типа ввод/редактирование: fmEDITPHON и fmEDITPROF.
Создание формы fmSHOWFLAT. Выберем команду File | New | Form, чтобы включить в проект пустую форму.
Поместим в эту форму три компонента TButton и по одному компоненту TDBGrid и TDBNavigator, расположив их так, как показано на рис.8. Подключим модуль данных dmPERSPROF к создаваемой форме, выбрав команду File | Use Unit и указав файл модуля данных DATAMOD в окне Use Unit.
Зададим для формы значения свойств Name=fmSHOWFLAT, Caption=Сведения о квартирах. Значения свойств других компонентов установим в соответствии с табл.5 и 6.
Таблица 5
Значения свойств компонентов TButton
Name |
Caption |
Default | |
Старое |
Новое | ||
Button1 |
buEdit |
&Изменить сведения |
False |
Button2 |
buAppend |
&Новая квартира |
False |
Button3 |
buExit |
Выход |
True |
Таблица 6
Значения свойств компонентов, связанных с данными
Свойство |
DBGrid1 |
DBNavigator1 |
Name |
grFLAT |
naFLAT |
DataSource |
dsFLAT |
dsFLAT |
ReadOnly |
True |
|
VisibleButtons |
|
[nbFirst, nbPrior, nbNext, nbLast] |
Для трех кнопок, помещенных в форму, следует задать процедуры обработки события OnClick: при нажатии кнопки Изменить сведения должна активизироваться форма fmEDITFLAT в режиме редактирования строки (записи), отмеченной в сетке треугольником; при нажатии кнопки Новая квартира должна активизироваться форма fmEDITFLAT в режиме ввода; при нажатии кнопки Выход форма fmSHOWFLAT должна деактивизироваться. Тексты процедур приведены на листинге 5.
Листинг 5. Процедуры обработки события OnClick для кнопок
void __fastcall TfmSHOWFLAT::buEditClick(TObject *Sender)
{
fmEDITFLAT->Editing = True; // Режим редактирования
fmEDITFLAT->ShowModal(); // Активизировать форму
}
void __fastcall TfmSHOWFLAT::buAppendClick(TObject *Sender)
{
fmEDITFLAT->Editing = False; // Режим ввода
fmEDITFLAT->ShowModal(); // Активизировать форму
}
void __fastcall TfmSHOWFLAT::buExitClick(TObject *Sender)
{
fmSHOWFLAT->Close(); // Деактивизировать форму
}
Чтобы признак Editing стал доступным для установки, необходимо подключить модуль формы fmEDITFLAT к форме fmSHOWFLAT, выбрав команду File | Use Unit и указав файл модуля EDITFLAT в окне Use Unit.
Для улучшения пользовательского интерфейса предусмотрим, чтобы при двойном щелчке на выбранной строке компонента grFLAT происходила активизация формы fmEDITFLAT в режиме редактирования, т.е. реакция была такой же, как при нажатии кнопки Изменение сведений. Нужную реакцию можно задать, если в форме fmSHOWFLAT выбрать компонент grFLAT, затем в инспекторе объектов на странице событий выбрать строку события OnDblClick, нажать в этой строке кнопку со стрелкой и из появившегося списка имен процедур обработки событий выбрать имя buEditClick.
Сохраним сделанные в проекте изменения командой File | Save All, задав имя SHOWFLAT для файла с модулем формы fmSHOWFLAT, и перейдем в окно главной формы.
Для связи формы fmSHOWFLAT с главной формой нужно, работая в конструкторе меню, дважды щелкнуть на пункте меню Квартиры и в окне активизированном текстового редактора набрать оператор
fmSHOWFLAT->ShowModal();
Кроме этого необходимо подключить модуль формы fmSHOWFLAT к главной форме приложения, выбрав команду File | Use Unit и указав файл модуля SHOWFLAT в окне Use Unit.
Сохранив изменения командой File | Save All, проверим работоспособность проекта, активизировав созданную форму из меню, а форму fmEDITFLAT - с помощью кнопок Изменение сведений, Новая квартира и двойным щелчком в строке сетки grFLAT. Убедившись, что все созданные формы взаимодействуют правильно, перейдем к доработке внешнего вида сетки, чтобы он соответствовал эскизу, показанному на рис.8.
С каждым компонентом TTable ассоциируется набор полей, обозначаемый в системе C++Builder термином DataSet (рис.10).
По умолчанию набор полей формируется динамически, когда таблица открывается установкой значения свойства Active=True, и очищается, когда закрывается при задании значения свойства Active=False. При динамическом формировании набора полей в него добавляются описания всех полей (атрибутов) для находящейся в базе данных на диске таблицы, которая связана с компонентом TTable через значение свойства TableName. Описание поля является объектом типа TField. Значения полей, описанных в DataSet, передаются визуальным компонентам приложения с помощью компонента TDataSource, который связан c компонентом TTable через значение свойства DataSet.
Информационная цепочка тянется следующим образом (см. рис.10): данные из таблицы БД на диске выбираются с помощью TDataBase компонентом TTable, который передает их компоненту TDataSource отфильтрованными в соответствии с набором полей DataSet. TDataSource передает данные любому визуальному компоненту, управляющему данными, который имеется в форме. Если пользователь сделает какие-нибудь изменения в данных с помощью визуальных управляющих компонентов, то TDataSource передает эти изменения обратно компоненту TTable, который с помощью TDataBase помещает измененные данные в таблицу на диске.
При использовании динамически формируемого набора полей в компоненте TDBGrid (сетка) отображаются значения всех полей каждой записи (строки) таблицы, а заголовок сетки содержит названия полей, используемые в таблице БД на диске, в чем можно было убедиться при работе с формой fmSHOWFLAT.
Чтобы сетка выглядела в соответствии с эскизом на рис.8, и категория квартиры выводилась в расшифрованном виде, необходимо набор полей для компонента taFLAT сформировать с помощью редактора полей; сформированный набор полей будет автоматически использоваться вместо динамически формируемого. Редактор полей позволяет добавлять или удалять поля, отображаемые в визуальных компонентах; задавать тип данных, хранящихся в полях; изменять порядок следования полей в DataSet, ассоциированном с компонентом TTable; модифицировать свойства отдельных полей.
Ч
Рис.10.
Взаимодействие компонентов, связанных
с данными
1) используя команды View | Forms и View | Toggle Form/Unit или клавиши Shift+F12 и F12, перейти в модуль данных dmPERSPROF и вызвать редактор полей двойным щелчком на компоненте taFLAT. В появившемся окне с заголовком dmPERSPROF->taFLAT область Fields пуста, поскольку набор полей, формируемый динамически, не отображается в редакторе полей;
2) нажать правую кнопку мыши для вызова контекстного меню и выбрать из него команду Add all fields, чтобы добавить поля в область Fields. На экране снова появится окно с областью Fields, заполненной именами выбранных полей;
3) поменять местами поля KCategory и NRooms. Для этого нужно установит курсор мыши на поле KCategory и, удерживая нажатой левую кнопку мыши, перетащить это поле вниз на место, занимаемое полем NRooms (этот пункт необязательный, предусмотрен для демонстрации возможности изменять порядок следования полей в наборе);
4) последовательно щелкнуть мышью на каждом поле в области Fields и в окне инспектора объектов установить значения свойств полей согласно табл.7;
5) закрыть окно редактора полей.
Таблица 7
Значения свойств полей для компонента taFLAT
Имя поля |
DisplayLabel |
Visible |
Adr |
Адрес |
True |
Skv |
Площадь |
True |
KCategory |
KCategory |
False |
NRooms |
Комнат |
True |
В результате заголовок сетки будет содержать названия колонок на русском языке (свойство DisplayLabel), колонка со значениями поля KCategory отображаться не будет (Visible=False).
Теперь создание формы fmSHOWFLAT полностью завершено, и следует сохранить проект командой File | Save All и еще раз проверить работоспособность приложения.
Аналогичным способом создаются три другие формы типа сетка: fmSHOWPHON, fmSHOWPROF, fmSHOWPERS.
Создание формы fmEDITPERS. Поместим в модуль данных dmPERSPROF четыре компонентов TTable и четыре компонента TDataSource. Свойства компонентов TTable и TDataSource устанавливаются в соответствии с табл.8 и 9.
Таблица 8