Улучшенный пример с поисковыми полями.

Лабораторная работа № 2

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

1. Внесем в базу данные о городах. Для этого создадим новую таблицу (в уже имеющейся базе Database.mdb) со следующими полями:

- Key1 – счетчик (ключевое поле);

- Название города – текстовое поле размером в 30 символов.

2. Сохраните таблицу под именем Справочник городов. Теперь ваша база данных должна состоять из двух таблиц: Справочник, Справочник городов.

3. Откройте проект, созданный в предыдущей работе и модуль DataModuleUnit (это можно сделать с помощью Менеджера проектов). Добавьте в него компоненты DataSource (назовем его TownSource) и ADOTable (его назовем TownTable). После этого у компонента TownSource в свойстве DataSet укажите таблицу TownTable.

4. Теперь настроим TownTable на отображение справочника городов. Для этого в свойстве Connection укажите компонент ADOConnection1, который указывает на нашу базу данных. В свойстве TableName укажите таблицу – Справочник городов. Установите свойство Active в True, чтобы активизировать таблицу.

5. Войдите в редактор полей таблицы TownTable и добавьте все поля. Сделайте поле Key1 невидимым, потому что это счетчик и пользователю он абсолютно не нужен.

6. Теперь создадим новую форму для редактирования справочника и сохраним её в модуле под именем TownBookUnit. Саму форму назовем TownBookForm.

7. Подключите к новой форме модуль DataModuleUnit, чтобы отсюда можно было получить доступ к компонентам для работы с базами данных. Для этого из меню File выберите пункт Use Unit (Использовать модуль), в появившемся окне выберите модуль DataModuleUnit и нажмите ОК.

8. Поместите на форму сетку DBGrid и в свойстве DataSource укажите таблицу Справочник городов – DataModule2.TownSource. Можете добавить кнопку ОК для закрытия окна справочника. Добавьте на форму ещё 3 кнопки: Добавить, Сохранить и Удалить.

9. Для события OnClick кнопки Добавить пишем:

procedure TTownBookForm.Button2Click(Sender: TObject);

begin

DataModule2.TownTable.Insert;

DBGrid1.SetFocus;

end;

Метод Insert таблицы TownTable добавляет новую строку. Во второй строке вызывается метод SetFocus нашей сетки, чтобы фокус ввода перешел на него.

10. Для события OnClick кнопки Сохранить пишем следующий код:

procedure TTownBookForm.Button3Click(Sender: TObject);

begin

if DataModule2.TownTable.Modified then

DataModule2.TownTable.Post;

end;

Если текущая строка претерпела изменения, то в свойстве Modifies будет true, иначе false. Однако если произошли изменения, то их надо сохранить, иначе при закрытии окна пользователем данные могут не сохраниться. Для сохранения изменений используется метод Post.

11. Для события OnClick кнопки Удалить пишем следующий код:

procedure TTownBookForm.Button4Click(Sender: TObject);

begin

DataModule2.TownTable.Delete;

end;

Метод Delete удаляет текущую строку из таблицы.

Всё, формирование внешнего вида таблицы Справочник городов закончено.

12. Для события OnClick кнопки ОК напишите:

procedure TTownBookForm.Button1Click(Sender: TObject);

begin

TownBookForm.Close;

end;

13. Перейдите к главной форме и создайте меню для вызова справочника городов.

14. Для события OnClick пункта меню «Справочник городов» напишите следующий код:

procedure TForm1.N4Click(Sender: TObject);

begin

TownBookForm.ShowModal;

end;

15. Если вы не добавили модуль справочника городов к главной форме и попробуете сейчас откомпилировать проект, перед вами появится окно, в котором Delphi говорит о том, что форма TownBookForm объявлена в модуле TuwnBookUnit и ваша форма не имеет ссылки на него. Вам предлагается добавить ее автоматически. Выберите Да.

16. Запустите программу, вызовите таблицу Справочник городов и добавьте туда несколько строк. Это будет полезно на будущее, заодно проверите правильность работы программы.

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

17. Выделите сетку DBGrid1 на главной форме и в свойстве Options отключите возможность редактирования данных в сетке – в свойстве dgEditing установите значение false.

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

- Добавить запись;

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

- Удалить запись.

19. Создадим новую форму, которая будет использоваться для редактирования данных каждой записи. Создайте форму и сохраните её под именем EditFormUnit. Саму же форму назовем EditRecordForm. Теперь измените у формы следующие свойства:

- для BorderStyle – bsSingle;

- для Position – poMainFormCenter;

20. Подключите к новой форме модуль DataModuleUnit (File – Use Unit), чтобы иметь доступ к данным.

21. Дальнейшее оформление зависит от вашего вкуса. Можно добавить картинку и панель белого цвета, как в этом примере.

22. Добавьте кнопку Сохранить, Отмена, и надписи, возле которых будут находиться поля компоненты к данным (Фамилия, Имя, Телефон и т.д.).

23. Напротив надписей Фамилия, Имя, Телефон, e-mail и Дата рождения расположите компоненты DBEdit с вкладки DataControls. Эти компоненты представляют собой простые строки ввода типа Edit, только они умеют автоматически редактировать указанные поля в базе данных. Чтобы компонент видел данные из нужного поля, следует указать у него в свойстве DataSource необходимую таблицу (DataModule2.DataSourse1), а в свойстве DataField указать поле, которое надо редактировать. Установите необходимые значения свойств.

24. Для поля Мобильник лучше всего использовать компонент DBCheckBox, который похож на CheckBox. У него также надо указать поле в таблице, как и у компонентов DBEdit.

25. Следующее поле – Город. Названия городов хранятся в отдельном справочнике, а в основной таблице должны храниться только числа – номера строк из справочника городов. Таким образом, у нас не будет храниться в каждой строке длинное название города, а только число. Чтобы все это реализовать, достаточно поставить компонент DBLookupComboBox с вкладки DataControls. Теперь нужно указать у него в свойстве DataSource основную таблицу (DataModule2.DataSource1), которая будет редактироваться (ту, КУДА будут заноситься данные), а в свойстве DataField указать поле, которое надо редактировать – Город.

26. Компонент DBLookupComboBox выглядит как выпадающий список (он похож на TComboBox). В качестве элементов выпадающего списка можно указать содержимое таблицы. В свойстве ListSource нужно указать таблицу, из которой будут браться элементы для выпадающего списка. Укажите наш справочник городов – DataModule2.TownSource. В свойстве ListField укажем поле из этой таблицы, которое будет использоваться для заполнения выпадающего списка – Название города. В свойстве KeyField нужно указать поле, значение которого будет вноситься в указанное поле основной таблицы (поле Key1).

27. Для события OnClick кнопки Сохранить напишите следующий код:

procedure TForm3.BitBtn1Click(Sender: TObject);

begin

if DataModule2.BookTable.Modified then

DataModule2.BookTable.Post;

Close;

end;

В первой строке мы проверяем, если таблица была изменена, то принять изменения.

28. Для события OnClick кнопки Отмена напишите одну строчку кода:

procedure TForm3.Button1Click(Sender: TObject);

begin

DataModule2.BookTable.Cancel;

end;

Метод обеспечивает выход из режима редактирования без внесения изменений в таблицу.

29. Теперь перейдите в основную форму и по нажатии пункта меню Добавить запись напишите:

procedure TForm1.N6Click(Sender: TObject);

begin

DataModule2.BookTable.Insert;

EditRecordForm.ShowModal;

end;

Здесь в первой строке мы вставляем в основной таблице новую строку. Во второй отображаем окно редактирования данных.

30. по нажатию пункта меню Редактировать запись напишите просто код отображения окна редактирования - EditRecordForm.ShowModal.

31. Теперь запустите программу. Создайте новую запись. В поле Город выберите какое-нибудь значение из справочника. После нажатия кнопки Сохранить окно закроется. Посмотрите на сетку. В поле Город новой строки вы можете увидеть код города из нашего справочника (например, число 3). Это значит, что в справочнике городов есть запись со значением в поле Key1, равным 3, и в поле Название города указано название, которое мы выбрали.

32. Откройте таблицу через программу Access и убедитесь, что числовые значения соответствуют выбранным названиям городов.

Улучшенный пример с поисковыми полями.

Сделаем для нашего примера с телефонным справочником обработчик для пункта меню Удалить запись. По этому событию нужно вывести запрос на подтверждение удаления и если ответ будет утвердительным, то можно удалять.

1. Создайте такой обработчик и напишите в нем следующее:

begin

if Application.MessageBox(PChar('Вы действительно хотите удалить'

+DataModule2.BookTableDSDesigner.AsString), 'Внимание!',

MB_OKCANCEL)=id_OK then

DataModule2.BookTable.Delete;

end;

Здесь мы отображаем сообщение функцией MessageBox. В первом параметре (текст сообщения) написан текст ‘Вы действительно хотите удалить’ плюс значение поля Фамилия выделенной строки - DataModule2.BookTableDSDesigner.AsString. Самое сложное здесь – понять, что это такое. Чтобы понять эту конструкцию, перейдите в модуль DataModule. Здесь щелкните дважды кнопкой мыши по компоненту BookTable, где у нас подключен основной справочник, и затем по полю Фамилия. Посмотрите в объектном инспекторе имя этого поля, оно должно быть BookTableDSDesigner. Теперь ясно? Мы пишем имя модуля данных DataModule2, затем через точку имя поля BookTableDSDesigner и метод AsString, который возвращает имя поля в виде строки.

Теперь пример практически готов. Единственный недостаток – в сетке просмотра данных вместо названия города отображается индекс строки в справочнике. Нужно это исправить.

2. Перейдите в модуль DataModule2 и выделите компонент BookTable. Сделайте его неактивным – в свойстве Active установите значение false. Теперь дважды щелкните по этому компоненту, и перед вами откроется уже знакомый редактор полей. Давайте создадим новое поле, которое будет содержать текстовое название города для строк таблицы. Для этого щелкните правой кнопкой мыши внутри окна редактора и в появившемся меню выберите пункт New Field. Перед вами откроется следующее окно:

Создание нового поля возможно только при неактивной таблице, поэтому мы выставили в свойстве Active значение false.

3. Заполните поля этого окна следующим образом:

- В поле Name введите Town;

- В поле Type укажите тип String – строка;

- В области Field Type выберите Lookup– поисковое поле;

- В списке Key Fields (Ключевое поле) выберите Город (это поле основной таблицы, по значению которого надо будет искать текст в другой таблице);

- В списке DataSet надо указать TownTable – это таблица-справочник городов, где нужно искать;

- В списке Lookup Keys укажите Key1 – это поле в таблице-справочнике, по которому надо искать.

- В списке Result Field укажите поле Название города – это поле, текст которого будет подставляться.

4. Теперь нажмите ОК. в окне редактора полей появится новое поле с именем Town. В самой базе данных такого поля не будет, потому что оно динамическое и существует только в памяти машины, когда программа запущена. Перетащите его мышью выше (ближе к полю Город).

5. Снова сделайте таблицу BookTable активной (свойству Active установите значение true) и попробуйте теперь запустить программу. Посмотрите на поле Town и вы увидите там текстовое название города.

Можете сделать поле Город невидимым, чтобы пользователь не видел эти непонятные числа, а над полем Town написать надпись Город. Для этого дважды щелкните по компоненту BookTable, выделите поле Город и установите в свойстве Visible значение false. Теперь выделите поле Town и в свойстве DisplayLabel напишите Город.