Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
69
Добавлен:
16.04.2013
Размер:
449.54 Кб
Скачать

2.2.4. Создание формы fmShowflat

Выберем команду File|New Form и нажмем в появившемся окне Browse Gallery кнопку OK, чтобы включить в проект пустую форму Blank form.

Поместим в эту форму 3 компонента Button и по одному компоненту DBGrid и DBNavigator, расположив их так, как показано на рис.8. Поместим также на любое свободное место в форме компоненты Table и DataSource.

Зададим для формы значения свойств: Name=fmSHOWFLAT, Caption=Сведения о квартирах. Значения свойств других компонентов установим в соответствии с табл.6-7.

Таблица 6

Значения свойств компонентов Button

Name

Caption

Default

Старое

Новое

Button1

buEdit

&Изменить сведения

False

Button2

buAppend

&Новая квартира

False

Button3

buExit

Выход

True

Таблица 7

Значения свойств компонентов, связанных с данными

Свойство

Table1

DataSource1

DBGrid1

DBNavigator1

Name

taFLAT

dsFLAT

grFLAT

naFLAT

DatabaseName

dbTUTOR

TableName

FLAT.DB

DataSet

taFLAT

DataSource

dsFLAT

dsFLAT

ReadOnly

True

VisibleButtons

[nbFirst, nbPrior, nbNext, nbLast]

Active

True

Для трех кнопок, помещенных в форму, следует задать процедуры обработки события OnClick: при нажатии кнопки “Изменить сведения” должна активизироваться форма fmEDITFLAT в режиме редактирования строки (записи), отмеченной в сетке треугольником; при нажатии кнопки “Новая квартира” должна активизироваться форма fmEDITFLAT в режиме ввода; при нажатии кнопки “Выход” форма fmSHOWFLAT должна деактивизироваться. Тексты процедур приведены на листинге 5.

Листинг 5. Процедуры обработки события OnClick для кнопок

procedure TfmSHOWFLAT.buEditClick(Sender: TObject);

begin

fmEDITFLAT.Editing :=True;{Режим редактирования}

fmEDITFLAT.KeyValue:= {Запомнить значение ключа для fmEDITFLAT}

taFLAT.FieldByName('Adr').AsString;

fmEDITFLAT.ShowModal; {Активизировать форму}

Synchronize;

end;

procedure TfmSHOWFLAT.buAppendClick(Sender: TObject);

begin

fmEDITFLAT.Editing:=False;{Режим ввода}

fmEDITFLAT.ShowModal; {Активизировать форму}

Synchronize;

end;

procedure TfmSHOWFLAT.buExitClick(Sender: TObject);

begin

fmSHOWFLAT.Close; {Деактивизировать форму}

end;

Чтобы признаки Editing и KeyValue стали доступными для установки, в начале раздела Implementation модуля записывается предложение

uses EDITFLAT;

Чтобы изменения в таблице taFLAT, сделанные при работе с формой fmEDITFLAT, синхронно отображались в форме fmSHOWFLAT, при возврате в нее в процедурах buEditClick и buAppendClick вызывается процедура Synchronize, показанная на листинге 6. Текст этой процедуры помещается в конце модуля перед словом end, а в разделеprivate класса TfmSHOWFLAT записывается заголовок процедуры

procedure Synchronize;

Листинг 6. Процедура синхронизации отображения информации

в формах fmEDITFLAT и fmSHOWFLAT

procedure TfmSHOWFLAT.Synchronize;

begin

with taFLAT do

if fmEDITFLAT.KeyValue<>'' then

begin {Синхронизация отображения информации}

DisableControls;

First;

SetKey;

FieldByName('Adr').AsString :=

fmEDITFLAT.KeyValue;

GotoKey; {Поиск записи по ключу}

EnableControls;

end

else First;

end;

Для улучшения пользовательского интерфейса предусмотрим, чтобы при двойном щелчке на выбранной строке компонента grFLAT происходила активация формы fmEDITFLAT в режиме редактирования, т.е. реакция была такой же, как при нажатии кнопки “Изменение сведений”. Нужную реакцию можно задать, если в форме fmSHOWFLAT выбрать компонент grFLAT, затем в Инспекторе объектов на странице событий выбрать строку события OnDblClick, нажать в этой строке кнопку со стрелкой и из появившегося списка имен процедур обработки событий выбрать имя buEditClick.

Сохраним сделанные в проекте изменения командой File|Save Project, задав имя SHOWFLAT для файла с модулем формы fmSHOWFLAT, и перейдем в окно главной формы.

Для связи формы fmSHOWFLAT с главной формой нужно щелкнуть на пункте меню”Квартиры” и в окне текстового редактора набрать оператор

fmSHOWFLAT.ShowModal;

а предложение uses ABOUTSYS,EDITFLAT дополнить именем модуля SHOWFLAT.

Сохранив изменения командой File|Save Project, проверим работоспособность проекта, активизировав созданную форму из меню, а форму fmEDITFLAT — с помощью кнопок “Изменение сведений”, “Новая квартира” и двойным щелчком в строке сетки grFLAT. Убедившись, что все созданные формы взаимодействуют правильно, перейдем к доработке внешнего вида сетки, чтобы он соответствовал эскизу, показанному на рис.8.

С каждым компонентом Table ассоциируется набор полей, обозначаемый в системе Delphi термином DataSet (рис.10).

По умолчанию набор полей формируется динамически, когда таблица открывается установкой значения свойства Active=True, и очищается, когда закрывается при задании значения свойства Active=False. При динамическом формировании набора полей в него добавляются описания всех полей (атрибутов) для находящейся в базе данных (БД) на диске таблицы, которая связана с компонентом Table через значение свойства TableName. Описание поля — объект типа TField. Значения полей, описанных в DataSet, передаются визуальным компонентам приложения с помощью компонента DataSource, который связан c компонентом Table через значение свойства DataSet.

Информационная цепочка тянется следующим образом (см. рис.10): данные из таблицы БД на диске выбираются с помощью DataBase компонентом Table, который передает их компоненту DataSource отфильтрованными в соответствии с набором полей DataSet. DataSource передает данные любому визуальному компоненту, управляющему данными, который имеется в форме. Если пользователь сделает какие-нибудь изменения в данных с помощью визуальных управляющих компонентов, то DataSource передает эти изменения обратно компоненту Table, который с помощью DataBase помещает измененные данные в таблицу на диске.

При использовании динамически формируемого набора полей в компоненте DBGrid (сетка) отображаются значения всех полей каждой записи (строки) таблицы, а заголовок сетки содержит названия полей, используемые в таблице БД на диске, в чем можно было убедиться при работе с формой fmSHOWFLAT.

Чтобы сетка выглядела в соответствии с эскизом на рис.8, и категория квартиры выводилась в расшифрованном виде, необходимо набор полей для компонента taFLAT сформировать с помощью Редактора полей; сформированный набор полей будет автоматически использоваться вместо динамически формируемого. Редактор полей позволяет добавлять или удалять поля, отображаемые в визуальных компонентах; задавать тип данных, хранящихся в полях; изменять порядок следования полей в DataSet, ассоциированном с компонентом Table; модифицировать свойства отдельных полей.

TTable TDataSource

Свойства Опи- Свойства

DatabaseName сания DataSet

TableName полей . . .

IndexName

IndexFieldNames

Active

ДруПриложение

гие

T DataSet

T .TDatabase

a . Свойства Компоненты

b . AliasName для доступа

l DatabaseName к данным

e Визуальные

компоненты,

. . . . управляющие

данными

FLAT.DB . . .HAVE_D.DB

Таблица Индексы Таблица Индексы

БД на диске

Рис.10. Взаимодействие компонентов, связанных с данными.

Чтобы для компонента taFLAT сформировать набор полей с нужными свойствами, необходимо проделать следуюшее:

  1. Вызвать Редактор полей двойным щелчком на этом компоненте. В появившемся окне (рис.11,а) область Fields пуста, поскольку набор полей, формируемый динамически, не отображается в Редакторе полей.

  2. Нажать кнопку Add, чтобы добавить поля в область Fields. На экране появится окно Add Fields (рис. 11,б), содержащее список доступных полей таблицы FLAT.DB.

  3. Выбрать из списка все доступные поля, нажимая на имени поля кнопку мыши одновременно с клавишей Ctrl или Shift, и нажать кнопку ОК. На экране снова появится окно, показанное на рис. 11,а, с областью Fields, заполненной именами выбранных полей.

4. Нажать кнопку Define, чтобы дополнить набор полей полем, в котором будет содержаться полное название категории квартиры. На экране появится окно Define Field (рис. 12,а).

а) б)

Рис.11.

а) б)

Рис.12.

5. Задать имя CategoryName для поля, в котором будет содержаться название категории квартиры, вычисляемое по коду, хранящемуся в поле KCategory. В графе Component Name автоматически сформируется имя компонента, соответствующего вычисляемому полю (см. рис.12, а).

6. Задать тип вычисляемого поля, выбрав из списка Field Type название StringField.

7. Убедиться, что расположенный внизу окна Define Field селектор Calculated установлен (см. рис.12, а).

8. Нажать кнопку ОК. В появившемся окне Редактора полей область Fields будет содержать имена полей, включенных в набор, и среди них — вычисляемое поле CategoryName (рис. 12, б).

9. Поменять местами поля KCategory и CategoryName. Для этого нужно установит курсор мыши на поле KCategory и, удерживая нажатой левую кнопку мыши, перетащить это поле вниз на место, занимаемое полем CategoryName. (Этот пункт необязательный, предусмотрен для демонстрации возможности изменять порядок следования полей в наборе.)

10.Последовательно щелкнуть мышью на каждом поле в области Fields и в окне Инспектора объектов установить значения свойств полей согласно табл.8.

11.Закрыть окно Редактора полей, дважды щелкнув мышью на кнопке вызова системного меню.

Таблица 8

Значения свойств полей для компонента taFLAT

Имя поля

Calculated

DisplayLabel

Visible

Adr

False

Адрес

True

Skv

False

Площадь

True

Nrooms

False

Комнат

True

CategoryName

True

Категория

True

KCategory

False

KCategory

False

В результате заголовок сетки будет содержать названия колонок на русском языке (свойство DisplayLabel), колонка со значениями поля KCategory отображаться не будет (Visible=False), колонка со значениями вычисляемого поля CategoryName (Calculated=True) будет пустой. Чтобы заполнить эту колонку, необходимо для компонента taFLAT задать процедуру обработки собятия OnCalcFields. Эта процедура для каждой строки записи таблицы БД будет определять значения вычисляемых полей, предусмотренных в наборе полей для соответствующего компонента Table.

Чтобы задать процедуру обработки события OnCalsFields для компонента taFLAT, нужно сделать следующее:

  1. Выделить компонент taFLAT в форме fmSHOWFLAT.

  2. В окне инспектора событий на странице событий дважды щелкнуть в строке, соответствующей событию OnCalcFields.

  3. В активизированном окне текстового редактора набрать текст процедуры, приведенной на листинге 7.

Листинг 7. Процедура задания значений вычисляемым полям

procedure TfmSHOWFLAT.taFLATCalcFields(DataSet: TDataset);

var s : string[20];

begin

s := taFLAT.FieldByName('KCategory').AsString;

case s[1] of

'Н': s:='Неприватизированная';

'П': s:='Приватизированная';

'К': s:='Коммунальная';

end;

taFLATCategoryName.Value := s;

end;

Теперь создание формы fmSHOWFLAT полностью завершено, и следует сохранить проект командой File|Save Project и еще раз проверить работоспособность приложения.

Аналогичным способом создаются три другие формы типа “сетка”: fmSHOWPHON, fmSHOWPROF, fmSHOWPERS.