Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_Rab_BD / lab5 / metod5.doc
Скачиваний:
20
Добавлен:
20.04.2015
Размер:
82.94 Кб
Скачать

Пример: Создание меню для приложения, работающего с бд «Телефонная книжка».

В данном примере построим главное меню приложения, которое будет содержать такие пункты меню, как “Файл”, ”Поиск”, ”Сортировка”, со следующими подпунктами соответственно: “Печать” и “Выход”, “По фамилии” и “По дате рождения”, “По номеру” и “По фамилии”. Таким образом, при помощи данного меню можно будет осуществлять поиск по фамилии и по дате рождения, проводить сортировку по номеру записи, а также по фамилии, плюс к выше перечисленному оно дает возможность произвести печать содержимого БД «Телефонная книжка».

Поверхностный анализ задачи проектирования меню проясняет, что таблица People.db должна иметь вторичные индексы в полях IDPeople, Family и Birthday для осуществления поиска и сортировки по этим полям.

  1. Откроем DataBase Desktop 7.0 и создадим необходимые нам вторичные индексы, для чего выполним следующие действия:

1.1. Откроем таблицу People.db.

1.2. Используя команду главного меню Table|Restructure, войдем в режим коррекции структуры таблицы.

1.3. Из выпадающего списка характеристик таблицы Table Properties выберем Secondary Indexes (Вторичные индексы) и нажмем кнопку Define (Определить) для определения вторичного индекса.

1.4. Из левого списка полей Fields (Поля), содержащего названия всех полей, входящих в таблицу People.db, перенесем в правый список Indexed fields (Индексированные поля) поле Family, нажав кнопку со стрелкой вправо. Теперь нажмем кнопку ОК и в появившемся окне “Save Index As” в строке ввода Index Name (Имя индекса) напишем имя вторичного индекса – FamilyIndex. Завершим формирование вторичного индекса по полю Family кнопкой ОК.

1.5. Аналогичным образом сформируем вторичные индексы в полях Birthday и IDPeople, назвав из BirthdayIndex и Number соответственно.

  1. Сохраним изменения в структуре таблицы People.db и выйдем из среды DBD 7.0.

  2. Теперь войдем в среду Delphi 3.0 для того, чтобы начать работу по созданию меню.

  3. Загрузим заготовку проекта, созданную в лаб./раб. № 2. Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры «7»: MyExampleDB7.dpr, MyExUnitDB7.pas, MyExUnitDMDB7.pas. В тексте модуля формы Form1 заменим раздел объявления используемых модулей в секции implementation

USES MyExUnitDMDB;

на раздел

USES MyExUnitDMDB7;

  1. Подготовим форму для размещения на ней меню. Для этого выполним следующее:

5.1. Сдвинем все имеющиеся в форме компоненты немного вниз, освободив тем самым место под главное меню (при необходимости нужно увеличить размер формы по вертикали). Изменим свойство Color (Цвет) формы на clTeal (или любой другой цвет) для того, чтобы меню выделялось на экране, привлекая внимание пользователя.

5.2. Создадим кнопку “Выход” для завершения работы приложения, разместив ее справа от компоненты DBGrid1 (подобная кнопка создавалась в лаб./раб. № 3 и лаб./раб. № 4).

  1. Сформируем общий вид главного меню. Для этого выполним следующие действия:

6.1. Со страницы Standart палитры компонент поместим на форму Form1 компоненту MainMenu, в правый нижний угол формы. Она получит в тексте модуля имя MainMenu1.

6.2. Активизируем у компоненты MainMenu1 свойство Items (Компоненты), в результате чего откроется окно конструктора меню. Зададим свойству Caption пустого прямоугольника значение “Файл”, а свойству Name этого же элемента меню значение File_pt.

6.3. У появившегося пустого прямоугольника, который соответствует первому элементу подменю “Файл”, свойство Caption изменим на “Печать”, а свойство Name – на Print_pt. У следующего элемента подменю свойству Caption зададим значение “-“ – это будет разделительная линия. И, наконец, у следующего и последнего элемента этого же подменю свойству Caption зададим значение “Выход”, а свойству Name – Exit_pt.

6.4. У следующего элемента главного меню (пустой прямоугольник справа от элемента меню “Файл”) свойству Caption зададим значение “Поиск”, а свойству Name – Search_pt. Подпункты элемента меню “Поиск” – “По фамилии”, “По дате рождения” – создадим аналогично элементам “Печать” и ”Выход” (их свойствам Name зададим значения Family1_pt и Date_pt соответственно).

6.5. Аналогичным образом создадим элемент меню “Сортировка”, который включает в себя пункты “По номеру” (свойство Name – Number_pt) и “По фамилии” (свойство Name – Family2_pt).

6.6. Закроем конструктор меню. Отметим, что на форме Form1 уже отображено создаваемое меню, и следующим шагом будет обеспечение работы всех пунктов данного меню.

  1. При выборе пункта меню “Печать” будет выводиться в режиме предварительного просмотра отчет, созданный в лаб./раб. № 3, т.е. список людей с имеющимися у них телефонами. Для того, чтобы этот пункт меню стал рабочим, необходимо выполнить следующие действия:

7.1. Добавим в проект файл MyUnitReport2.pas из лаб./раб. № 3 и сохраним его под именем MyUnitReport.pas. В тексте модуля формы Form2 (форма с отчетом) изменим раздел объявления используемых модулей в секции implementation

USES MyExUnitDMDB3;

на раздел

USES MyExUnitDMDB7;

7.2. В тексте модуля формы Form1 в секции implementation напишем следующую строчку для связи данной формы с формой Form2:

USES MyExUnitDMDB7, MyUnitReport;

7.3. В форме Form1 активизируем пункт меню “Печать” и в появившемся обработчике события OnClick введем оператор, задающий отображение отчета в режиме предварительного просмотра:

procedure TForm1.Print_ptClick (Sender: TObject);

begin

Form2.QuickRep1.Preview;

end;

  1. Для обеспечения работы пункта меню “Выход” выполним следующие действия: активизируем данный пункт меню и в появившемся обработчике события OnClick введем оператор, обеспечивающий завершение работы с приложением:

procedure TForm1.Exit_ptClick (Sender: TObject);

begin

Close;

end;

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

9.1. Добавим в проект новую форму. В проекте она получит имя Form3. Изменим размер формы, уменьшив ее значительно по вертикали и слегка увеличив по горизонтали (в результате должен получиться узкий прямоугольник). Изменим также свойство Caption формы на «Поиск по фамилии». Сохраним форму в файле Search7.pas.

9.2. Со страницы Standart поместим на форму, в ее верхнюю часть, компоненту Label. В тексте модуля она будет иметь имя Label1. Изменим ее свойство Caption на «Введите фамилию искомого человека», а через сложное свойство Font изменим шрифт на полужирный.

9.3. Справа от компоненты Label1 поместим на форму со страницы Standart компоненту Edit и увеличим ее горизонтальный размер на оставшуюся часть формы (размер этой компоненты должен быть достаточным для ввода фамилии с максимально возможной длиной). В тексте модуля эта компонента получит имя Edit1. Свойство Text этой компоненты сделаем пустым.

9.4. Ниже, под компонентами Label1 и Edit1, приблизительно в центре формы поместим две кнопки BitBtn со страницы Additional палитры компонент. Активизируем первую кнопку и изменим следующие ее свойства: Caption на «ОК», Kind на bkOK, ModalResult на mrOK и Name на OKBtn. В результате мы получим стандартную кнопку ОК. Теперь активизируем вторую кнопку и изменим ее свойства следующим образом: Caption на «Отмена», Kind на bkCancel, ModalResult на mrCancel и Name на CancelBtn, т.е. создадим стандартную кнопку Cancel.

9.5. Добавим в проект еще одну новую форму. Она в проекте получит имя Form4. Сохраним ее в файле Search7_1.pas. Зададим ее свойству Caption значение «Поиск по дате рождения». Придадим форме вид, аналогичный виду формы Form3, со следующими изменениями: свойство Caption компоненты Label1 будет иметь значение «Введите дату рождения человека», и под ней будет размещена еще одна компонента Label со свойством Caption равным «(дата вводиться через точку)».

9.6. Установим связь формы Form1 с формами Form3 и Fotm4, дописав имеющуюся в форме Form1, в секции implementation строку следующим образом:

USES MyExUnitDMDB7, MyUnitReport, Search7, Search7_1;

  1. Для обеспечения работы с пунктом “По фамилии” подменю “Поиск” выполним следующие действия: активизируем данный пункт меню и в появившемся обработчике события OnClick введем следующие строки:

procedure TForm1.Family1_ptClick (Sender: TObject);

begin

IF Form3.ShowModal = mrCancel THEN Exit;

DataModule1.Table1.IndexName := ‘FamilyIndex’;

DataModule1.Table1.SetKey;

DataModule1.Table1.FieldByName(‘Family’).AsString := Form3.Edit1.Text;

DataModule1.Table1.GotoNearest;

end;

Данный код заставляет всплыть диалог поиска (Form3) в модальном режиме (метод ShowModal). Данный режим предполагает, что все сообщения, поступающие в программу в случае открытого модального окна, обрабатываются только этим окном. Если пользователь выбирает кнопку ОК, то осуществляется поиск введенной строки. Если же выбирается кнопка «Отмена», то происходит отказ от выбранного действия, т.е. выход из подпрограммы. Далее устанавливается вторичный индекс по полю, в котором будет происходить поиск. После этого таблица устанавливается в режим SetKey и потом таблице сообщается о поиске конкретной строки в поле Family. В заключении вызывается GotoNearest и таблица подводиться как можно ближе к разыскиваемой записи, т.е. имеется возможность выполнять частичные поиски (можно использовать неполное или неточное написание фамилии).

  1. Для обеспечения работы с пунктом меню “По дате рождения” необходимо проделать действия, аналогичные выполненным с предыдущим пунктом, с соответствующими изменениями. В результате чего обработчик события OnClick будет иметь следующий вид:

procedure TForm1.Date_ptClick (Sender: TObject);

begin

IF Form4.ShowModal = mrCancel THEN Exit;

DataModule1.Table1.IndexName := ‘BirthdayIndex’;

DataModule1.Table1.SetKey;

DataModule1.Table1.FieldByName(’Birthday’).AsString := Form4.Edit1.Text;

DataModule1.Table1.GotoNearest;

end;

  1. Активизируем теперь пункт меню “По номеру” подменю “Сортировка” и в появившемся обработчике события OnClick введем следующие строки:

procedure TForm1.Number_ptClick (Sender: TObject);

begin

DataModule1.Table1.IndexName := ‘Number’;

DataModule1.Table1.SetKey;

DataModule1.Table1.GotoNearest;

end;

  1. Определим действия, выполняемые пунктом меню “По фамилии” подменю “Сортировка”, следующим образом: активизируем данный пункт меню и в появившемся обработчике события OnClick запишем следующий код:

procedure TForm1.Family2_ptClick (Sender: TObject);

begin

DataModule1.Table1.IndexName := ‘FamilyIndex’;

DataModule1.Table1.SetKey;

DataModule1.Table1.FieldByName(‘Family’).AsString := ‘A’;

DataModule1.Table1.GotoNearest;

end;

Во избежании возможности появления пустых записей в начале таблицы после сортировки по фамилии производится поиск записи, поле Family которой является ближайшим для согласования со строкой ‘A’.

  1. Запустим программу командой Run|Run и убедимся в правильности работы созданного меню.

  2. Закроем приложение либо кнопкой «Выход», либо командой главного меню Файл|Выход.

  3. Сохраним все изменения в проекте.