Хорошее приложение должно иметь удобный интерфейс пользователя.
Давайте рассмотрим один несложный пример организации работы пользователя с нашей базой данных.
Чтобы не загромождать приложение удалите с главной формы компонент DBGrid2, а с формы Модуля данных компоненты QueryOtbor и DataSource3.
В Модуль Данных добавьте ADOTable1, переименуйте в TableLang и соедините с ADOConnection1; добавьте также и DataSource3 и соедините с TableLang.
У компонента DBGrid1 через инспектор объектов в множественном свойстве Options свойство dgEditing переведите в False, для того чтобы пользователь не мог непосредственно редактировать содержимое таблицы. Мы сделаем доступ к ячейкам таблицы через специальную форму.
Создайте новую форму, дайте ей имя FormRedactor и сохраните модуль под именем Redactor.pas. Подключите к новой форме Модуль Данных UnitDM. Разместите на форме пять меток Label, четыре компонента DBEdit и один DBLookup- ComboBox1 с вкладки Data Controls, две кнопки («сохранить», «не сохранять»).
Подключим компоненты к базе данных. Для всех DBEdit в качестве компонента посредника укажите DM.DataSource1, а в свойстве DataField в ниспадающем списке укажите соответствующее поле для отображения. Несколько сложнее настроить компонент DBLookupComboBox1 – ведь он должен одновременно обращаться к двум таблицам: из таблицы магазин компонент будет выбирать номер языка программирования, а из таблицы языки его название. Для начала в свойстве DataSource укажите компонент посредник DM.DataSource1, связанный с основной таблицей магазин, которую и будем редактировать с помощью разрабатываемой формы. А в свойстве DataField укажите поле для редактирования – язык программирования. Далее надо сделать так, чтобы в ниспадающем списке компонента DBLookupComboBox1 отображались не номера языков программирования, а их названия. В свойстве ListSource укажите DM.DataSource3 – там будут выбираться названия языков, а в свойстве ListField укажите поле этой таблицы, из которого будут выбираться названия языков – язык. Но в основной таблице магазин следует сохранять не название, а номер языка программирования, поэтому в свойстве KeyField укажите id_lang. После настройки форма редактора записи базы данных будет иметь такой вид:
|
|
Давайте теперь подключим форму редактора к главной форме: переключитесь на главную форму, в меню Файл / Использовать модуль укажите Redactor. На главной форме разместите три кнопки: «Добавить новую запись», «Удалить текущую запись», «Редактировать текущую запись».
Начнем с кнопки «Редактировать текущую запись». В обработчик события OnClick этой кнопки добавьте одну строку кода – FormRedactor.ShowModal. Этим вы обеспечиваете запуск в модальном режиме формы редактора, которая будет отображать поля текущей выделенной записи и у пользователя не будет возможности перейти к другой записи базы данных пока он не закроет форму редактора. Апробируйте приложение – устанавливайте курсор на разные позиции в основной таблице и вызывайте редактор. Он должен отображать текущую запись в удобной для пользователя форме. Однако кнопки «сохранить» и «не сохранять» пока не действуют. Устраним эту недоработку.
|
|
Для кнопки сохранить можно использовать такой подход – если содержимое полей таблицы менялось, то сохрани их методом Post, после чего закрой форму редактора:
procedure TFormRedactor.Button1Click(Sender: TObject);
begin
if DM.TableMagazin.Modified then DM.TableMagazin.Post;
Close;
end;
Если пользователь выбрал кнопку «не сохранять», то можно использовать специальный метод выхода без сохранения – Cancel:
procedure TFormRedactor.Button2Click(Sender: TObject);
begin
DM.TableMagazin.Cancel;
Close;
end;
Апробируйте работу кнопок, внеся изменения в базу данных.
Осталось подключить кнопки добавления и удаления записи.
Что нужно для реализации действия добавления записи. В нашем случае две операции: вставить в таблицу пустую запись и открыть на ней форму редактора:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
DM.TableMagazin.Insert;
FormRedactor.ShowModal;
end;
Для удаления текущей записи из таблицы достаточно использовать специальный метод Delete, но для безопасности лучше предварить его вопросом к пользователю о подтверждении операции удаления. И было бы неплохо, чтобы программа показывала, что именно предстоит удалить, а не просто спрашивала о подтверждении операции удаления.
Это можно сделать с помощью одного из видов модальных диалогов, например, MessageBox.
Перенести информацию о текущей записи из главной формы можно с помощью обращения к модулю данных. В модуле данных дважды кликните по компоненту TableMagazin и в открывшемся окне настройки полей таблицы выделите поле название. В инспекторе объектов вы увидите имя, данное этому компоненту – TableMagazinDSDesigner. К нему как к строке мы и будем обращаться:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if MessageBox(0, PChar('Удалить запись '+DM.TableMagazinDSDesigner.AsString
+'?'), 'Подумайте', MB_YESNO or MB_ICONWARNING or MB_DEFBUTTON2)=id_yes
then DM.TableMagazin.Delete;
end;
Примерно такой результат можно получить используя модальный диалог:
=============================================================
На этом завершаем поверхностное знакомство с инструментами Delphi для работы с базами данных. Напомню, что мы рассмотрели только методику разработки СУБД с использованием компонентов ADO (базы данных Access и MS SQL Server). Кроме этого Delphi позволяет использовать иные технологии: BDE – для доступа к базам данных Paradox и dBase, DBExpress – для доступа к базам данных Oracle, DB2, MySQL). За рамками рассмотрения остались вопросы оформления отчетной документации по базам данных. Печать и сохранение данных можно оформить через компоненты QuickReports или Rave Reports, через вывод данных в Excel или Word. Хочу также обратить ваше внимание, что написать серьезную СУБД без понимания языка SQL вряд ли получится. Среда визуального проектирования и событийного программирования Delphi предоставляет широкие возможности для разработки приложений по управлению базами данных, но разработка СУБД требует познаний о разнообразных информационных технологиях и успеха можно достичь только самостоятельным анализом и освоением разрозненного материала.