Сделай Сам Свою Работу на 5

Создание формы приложения





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

На форме расположены следующие компоненты: Table1, DataSource1, DBGrid1 и DBNavigator1.

Компонент Table1 обеспечивает взаимодействие с таблицей БД. Для связи с требуемой таблицей необходимо установить соответствующие значения свойств DataBaseName, которое указывает путь к БД, и TableName, которое задает имя таблицы. После задания таблицы БД свойству Active должно быть установлено значение True.

Компонент DataSource1 является промежуточным звеном между компонентом Table1, который соединен с реальной таблицей БД, и управляющими компонентами DBGrid1 и DBNavigator1, с помощью которых пользователь взаимодействует с этой таблицей. На компонент Table1, с которым связан компонент DataSource1, указывает свойство DataSet последнего.

Компонент DBGrid1 отображает содержимое таблицы БД в виде сетки, в которой столбцы соответствуют полям, а строки — записям. По умолчанию пользователь может просматривать и редактировать данные. Компонент DBNavigator1 предоставляет возможность перемещаться по таблице, редактировать, вставлять и удалять записи. Компоненты DBGrid1 и DBNavigator1 связываются со своим источником данных — компонентом DataSource1 через свои свойства DataSource.



 


Рисунок 6.2 – Связь компонентов

Взаимосвязь компонентов приложения и таблицы БД и используемые пpи этом свойства компонентов показаны на рисунке 6.2.

При разработке приложения значения всех свойств компонентов можно задать с помощью Инспектора объектов. При этом требуемые значения можно набрать в поле значений или выбрать из раскрывающихся списков. В последнем случае приложение создается с помощью мыши и не требует набора каких-либо символов с клавиатуры. В таблице 2 приведены компоненты, используемые для работы с таблицей БД, а также основные свойства и их значения.

Таблица 6.2 - Значения свойств компонентов

Компонент Свойства Значение
Table1     DataSource1 DBGrid1 DBNavigator1 Active TableName DataBaseName DataSet DataSource DataSource True Clients.dbf Dbdemos Table1 DataSource1 DataSource1

Практические занятия:



ЧАСТЬ 1

Рассмотрим пример создания БД, которая включает сведения о сотрудниках предприятия: фамилию сотрудника, его пол, дату рождения и адрес. Для того чтобы создать такую БД, необходимо выполнить следующее:

1. Выбрать в меню Tools\DataBase Desktop;

2. В появившемся окне выбрать пункт меню File\New\Table…

В диалоговом окне Create Table выбрать тип таблицы Paradox7. Заполнить поля таблицы. Первое поле сделать ключевым. Для этого в колонке Field Name написать название поля (например Code), Type – тип +(Autoincrement), колонку Size – размер оставить пустой, в колонке Key – ключ нажать любую значащую клавишу.

3. Для создания базы данных сотрудников добавить поля Name – имя, Pol – пол, Date – дата рождения, Adress – адрес, заполняя все колонки, кроме последней.

4. Чтобы впоследствии можно было произвести сортировку данных, необходимо установить индексы. Для этого в комбинированном списке Table Properties выбрать строку Secondary Indexes. Нажать кнопку Define.

5. В появившемся окне выбрать для индексирования поля Pol и Name и ввести название индекса indPol и indName.

6. Сохранить таблицу в папке Base.

7. Изменить путь рабочего каталога на путь к нашей базе данных (File | Working Directory)

8. Создать псевдоним для нашей базы данных. Выбрать Tools|Alias Manager, нажать кнопку New, указать имя псевдонима Clients и кнопкой Browse выбрать рабочий каталог. Сохранить Keep New. На запрос подверждения сохранения от среды разработки ответить положительно. Закрыть DataBase Desktop.

9. Создать форму приложения

10. Выбрать из Палитры компонентов закладку DataControls и добавить к форме компоненты DBGrid и DBNavigator. Компонент DBGrid выровнять по верху (Align:=alTop).

11. Выбрать закладку DataAccess и BDE и добавить к форме компоненты DataSource1 и Table1.



12. Выделить компонент Table1 и указать в поле DatabaseName путь к таблице базы данных (или созданный алиас), в поле TableName – имя таблицы, в поле Active установить параметр True.

13. Выделить компонент DataSource и в поле DataSet двойным щелчком ЛКМ установить связь с компонентом Table1.

14. Выделить DBGrid1 и DBNavigator1 и в поле DataSource двойным щелчком ЛКМ установить связь с компонентом DataSource1.

15. Выделить таблицу Table1, щелкнуть два раза, в появившемся окне щелкнуть правой кнопкой мыши и в меню выбрать Add All Fields. Удалить колонку Code, выделить Name, выбрать Свойство DisplayLabel и ввести «Фамилия», аналогично ввести название колонок «Пол», «Дата рождения» и «Адрес». DisplayWidth позволяет задать ширину отображаемого поля. Закрыть окно.

16. Сохранить проект в папке Base.

17. Запустить проект на выполнение и заполнить таблицу (ввести данные о 3- 4 сотрудниках). После того, как данные будут внесены, нажать на кнопку подтверждение данных в DBNavigator (кнопка с галочкой) и закрыть программу.

 

ЧАСТЬ 2

Для удобной работы с набором данных его записи можно отсортировать. Сортировка - это упорядочение записей по определенному полю в порядке возрастания или убывания значений, содержащихся в этом поле. Для примера рассмотрим сортировку записей в созданной БД по двум полям: Фамилия и Пол.

1. Для сортировки данных добавить к форме (Form1) компонент RadioGroup. В поле Caption ввести «Сортировать». В поле Items нажать на кнопку с тремя точками и в появившемся окне ввести две строки: по фамилии и по полу. Нажать кнопку ОК.

2. Выделить RadioGroup1 и выбрать закладку Events.

3. Щелкнуть дважды в поле OnClick.

4. В окне Редактор кода написать тело процедуры:

Case RadioGroup1.ItemIndex of

0: Table1.IndexName:= ‘indName’;

1: Table1.IndexName:= ‘indPol’;

end;

5. Сохранить изменения.

6. Запустить проект на выполнение, просмотреть результаты, закрыть приложение.

 

ЧАСТЬ 3

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

- Файл:

- Выход.

- Действия:

- Вставить новую запись;

- Удалить текущую запись;

- Редактировать текущую запись;

- Перейти к предыдущей записи;

- Перейти к следующей записи;

- Перейти к первой записи;

- Перейти к последней записи.

После создания меню с помощью Конструктора меню, необходимо написать процедуры на каждый пункт меню.

- Пункт меню Вставить новую запись.

Процедура:

DBNavigator1.BtnClick(nbInsert);

- Пункт меню Удалить текущую запись.

Процедура:

DBNavigator1.BtnClick(nbDelete);

- Пункт меню Редактировать текущую запись.

Процедура:

DBNavigator1.BtnClick(nbEdit);

- Пункт меню Перейти к предыдущей записи.

Процедура:

DBNavigator1.BtnClick(nbPrior);

- Пункт меню Перейти к следующей записи.

Процедура:

DBNavigator1.BtnClick(nbNext);

- Пункт меню Перейти к первой записи.

Процедура:

DBNavigator1.BtnClick(nbFirst);

- Пункт меню Перейти к последней записи.

Процедура:

DBNavigator1.BtnClick(nbLast);

Сохранить изменения и запустить проект на выполнение.

 

ЧАСТЬ 4

Каждая таблица БД и, следовательно, каждый набор данных приложения имеет собственную структуру, которая определяется совокупностью полей. Каждое поле набора данных представляет собой объект, содержащий описание типа данных, которому должно соответствовать значение, находящееся в записи на определенном месте. Иначе, полем можно назвать совокупность ячеек с данными конкретного типа, расположенных в одном и том же месте каждой записи набора данных, или попросту — это столбец в таблице.

В наборе данных приложения баз данных Delphi каждому полю соответствует собственный объект. Основой объектов полей является класс TFieid, который инкапсулирует основные свойства абстрактного поля, не зависящего от типа данных. От этого базового класса порождены другие класса, обеспечивающие функционирование реальных объектов полей, зависящих от типа данных.

В Delphi предусмотрено два способа создания объектов полей.

Динамические поля используются программой в случае, если разработчик не создал для них объекты явным образом на этапе разработки. Каждый не заданный явно объект поля автоматически создается при открытии набора данных в соответствии со структурой связанной таблицы БД. Динамические поля используются в случаях, когда заданные характеристики полей в таблице базы данных полностью удовлетворяют разработчика и нет необходимости рассматривать какое-либо поле вне набора данных.

Статические поля создаются программистом на этапе разработки, их свойства доступны в Инспекторе объектов, а их названия можно выбрать из списка объектов активной формы в верхней части Инспектора объектов. Название статического объекта поля обычно складывается из названий таблицы и поля, например ordersCUSTNO.

Создаются статические объекты полей при помощи специализированного Редактора полей, который вызывается двойным щелчком на компоненте набора данных на форме или командой Fields Editorиз всплывающего меню этого компонента.

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

Добавить к списку статических полей новое поле, существующее в таблице БД, можно при помощи команды Add fieldsиз всплывающего меню Редактора. Удаление элемента из списка осуществляется клавишей <Delete>. Перетаскиванием элементов списка при помощи мыши можно изменить их расположение. Таким образом можно создавать произвольные комбинации статических полей.

Примечание

Как только для набора данных создан хотя бы один статический объект поля, считается, что набор данных содержит только те поля, которые имеются в списке статических полей. Эту особенность можно использовать для искусственного ограничения структуры данных таблиц. Все поля набора данных расположены в том порядке, как это указано в списке Редактора полей, независимо от их реального положения в таблице базы данных.

Команда New fieldиз всплывающего меню Редактора полей позволяет создать статическое поле, которое реально не существует в структуре данных таблицы (рис. 13.3). Для выбора типа поля используется группа радиокнопок Field Type:

  • Data— поле данных;
  • Calculated— вычисляемое поле;
  • Lookup— поле синхронного просмотра.

Реже создаются поля данных, которые обязательно должны базироваться на реальных полях таблицы. Если для такого объекта соответствующее поле в таблице будет удалено или его тип данных будет изменен, то при открытии набора данных генерируется исключительная ситуация.

Вычисляемые поля

Вычисляемые поля существенно облегчают разработку приложений баз данных, т. к. позволяют получать новые данные на основе существующих, не изменяя при этом структуру таблиц БД. Выражения для получения значений вычисляемых полей разработчик должен разместить в методе-обработчике OnCalcFields набора данных. Здесь можно использовать любые арифметические, логические операции и функции, любые операторы языка, свойства и методы любых компонентов, в том числе запросы SQL:

procedure TForml.TablelCalcFields(DataSet: TDataSet);

begin

with Tablel do

TabielCalcFieldl.Value := Fields[0].Value + Fields[1].Value;

end;

Метод OnCalcFields выполняется при открытии набора данных, при переходе в режим редактирования, при передаче фокуса между компонентами отображения данных или колонок сетки, при удалении записи. Но для этого нужно, чтобы свойство AutoCaicFields набора данных было равно значению True.

Для создания вычисляемого поля достаточно в диалоге создания нового поля Редактора полей в качестве типа поля задать "вычисляемое", в остальном процесс совпадает с созданием поля данных.

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

 

Создадим вычисляемое поле, в котором будет по дате рождения определяться возраст человека на данный момент:

1. Щёлкнем два раза на компоненте Table1. В появившемся редакторе кликнем правой кнопкой и выберем команду New field. Даём полю название на латинском языке, например vozrast. Тип данных – integer, тип поля – сalculated.

2. Добавим также правым щелчком поля, которые будут отображаться в таблице. При выделении поля в редакторе, в окне свойств отображаются свойства именно этого поля. Изменим подписи в шапке таблицы, меняя свойство поля DispiayLabel.

3. Для вычисляемого поля vozrast создадим процедуру (в событиях компонента Tablel):

procedure TForml.TablelCalcFields(DataSet: TDataSet);

begin

table1vozrast.Value := date - table1Date.Value;

end;

4. Запустим проект на выполнение, сохраним результаты.

ЧАСТЬ 5

Поиск записей

Поиск одного поля с помощью SQL запроса или фильтра, просто ужасно

глупая затея. Этот поиск будет проходить достаточно долго. Но есть способ лучше - поиск по ключевым полям. Этот поиск происходит практически моментально, даже на больших базах данных. Недостатки - отсутствие шаблонов и невозможно использовать привязанную таблицу. За счёт чего достигается большая скорость поиска? Всё очень просто, за счёт индексации. Так можно искать только по индексированным полям.

1. Для быстрого поиска нужно, чтобы поле было проиндексировано, поэтому добавляем вторичные индексы для полей, по которым поиск будет осуществляться (например fio).

2. Добавим на форму одну строку ввода FindEdit, в которой будем вводить данные (которые надо искать) и кнопку, по нажатию которой будет запускаться поиск.

3. Теперь создаём обработчик события OnClick для кнопки и напишем там следующий код:

procedure TForm1.Button1Click(Sender: TObject);

begin

Table1.IndexFieldNames:=’FIO’;

Table1.SetKey;

Table1.FieldByName(‘FIO’).AsString:=FindEdit.Text;

Table1.GotoKey;

end;

Если GotoKey не находит нужного ключа, то генерируется ошибка. GotoNearest тоже производит поиск ключевого поля, но если поле не найдено, то ошибка не генерируется, а ищется ближайший похожий ключ.

Существуют также методики FindKey и FindNearest, а также методы Locate и Lookup. Подробнее с этими методами можно ознакомиться в дополнительной литературе по разделу.

ЧАСТЬ 6

Использование псевдонима для доступа к базе данных обеспечивает независимость программы от размещения данных в системе, позволяет размещать программу работы с данными и базу данных на разных дисках компьютера, в том числе и на сетевом. Вместе с тем, для простых баз данных типичным решением является размещение базы данных в отдельном подкаталоге того каталога, в котором находится программа работы с базой данных. Таким образом, программа работы с базой данных всегда "знает", где находятся данные. При таком подходе можно отказаться от создания псевдонима при помощи BDE Administrator и возложить задачу создания псевдонима на программу работы с базой данных. Причем, псевдоним будет создаваться автоматически во время запуска программы и уничтожаться во время завершения ее работы. Очевидно, что такой подход облегчает администрирование базы данных.

В качестве иллюстрации сказанного в листинге приведен отрывок варианта программы работы с базой данных "Clients", которая для доступа к базе данных использует динамически создаваемый псевдоним. Это происходит в момент активации формы с компонентами, обеспечивающими работу с БД.

// активизация формы
procedure TForm1.FormActivate(Sender: TObject);
begin
with Session do
begin
ConfigMode := cmSession;
try
{ Если файл данных находиться в том же каталоге,
что и выполняемый файл программы, то в программе
путь к файлу данных может быть получен из командной
строки при помощи функции ExtractFilePath(ParamStr(0)).
В приведенном примере файл данных находится в подкаталоге
DATA каталога программы. В том случае, когда база данных находится в одной папке с проектом, дописывать +'DATA\' не нужно}

// создадим временный псевдоним для базы данных
AddStandardAlias( 'Clients', ExtractFilePath(ParamStr(0))+'DATA\',
'PARADOX');
Table1.Active:=True; // откроем базу данных
finally
ConfigMode := cmAll;
end;
В рассматриваемом варианте программы предполагается, что база данных содержится в подкаталоге Base того каталога, в котором находится выполняемый файл программы. Непосредственное создание псевдонима выполняет процедура AddstandardAlias, которой в качестве параметра передается имя псевдонима и соответствующее ему имя каталога. Так как во время разработки программы нельзя знать, в каком каталоге будет размещена программа работы с базой данных и, следовательно, подкаталог базы данных - Base, имя каталога определяется во время работы программы путем обращения к функциям ParamStr(0) и ExtractFilePatch. Значение первой - полное имя выполняемого файла программы, второй — путь к этому файлу. Таким образом, процедуре AddstandardAlias передается полное имя каталога базы данных.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.