Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы по Delphi

.pdf
Скачиваний:
63
Добавлен:
05.06.2015
Размер:
768.49 Кб
Скачать

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

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

Элемент меню класса TMenuItem

Элемент меню может представлять собой либо подменю, либо команду, либо разделительную линию. К какой категории относится конкретный элемент, зависит от его характеристик. Несмотря на это, любой элемент меню принадлежит к одному и тому же классу – TmenuItem, и каждый может рассматриваться как самостоятельное меню.

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

Для того, чтобы элемент меню представлял собой разделительную линию, следует его свойству Caption задать значение «-».

Элементы меню могут объединяться в группы. Информация о принадлежности элементов к группам может использоваться при слиянии меню нескольких форм и при использовании взаимосвязанных элементов меню. При этом группы элементов меню должны идти в определенном порядке – по возрастанию их номеров.

Характеристики элемента меню задают его внешний вид и место в структуре меню. Среди его свойств отметим следующие:

Break свойство, определяющее наличие разбиения меню на столбцы на текущем элементе.

Caption свойство типа string, содержащее текст элемента меню. Здесь можно задать клавишу быстрого перехода с помощью символа &, помещаемого перед соответствующим символом текста.

Checked свойство логического типа, определяющее, является ли элемент меню отмеченным (если имеет значение True, элемент помечается «галочкой»).

Default – свойство логического типа; если оно имеет значение True,

текст элемента меню выделяется полужирным шрифтом, а двойное нажатие мышью старшего элемента приводит к появлению у

текущего элемента события OnClick. По умолчанию имеет значение

False.

Enabled – свойство логического типа; если оно имеет значение True,

элемент меню реагирует на события от мыши и клавиатуры (элемент меню разрешен).

GroupIndex – свойство целого типа, содержащее номер группы, к

которой принадлежит элемент меню. По умолчанию имеет нулевое значение.

Items[Index] – свойство-массив типа TMenuItem (индекс Index – целого типа), задающее младшие элементы меню по отношению к текущему элементу. Число элементов определяется свойством Count. Нумерация начинается с нуля и используется только для чтения.

MenuIndex – свойство целого типа, содержащее индекс текущей

компоненты в списке Items старшей компоненты.

RadioItem – свойство логического типа; если оно имеет значение

True, элемент меню выполняет роль переключателя, т.е. помеченным может быть только один элемент одной группы.

ShortCut – свойство целого типа, определяющее код клавиш

быстрого управления, при нажатии которых активизируется элемент меню. Для работы с кодами клавиш быстрого управления используются подпрограммы ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut.

Visible – свойство логического типа; если оно имеет значение True,

элемент меню отображается на экране, если False – нет.

В классе TMenuItem определено одно событие – OnClick.

Класс имеет ряд методов, в основном связанных с корректировкой структур.

Add(Item) – процедура, добавляющая элемент Item (класса TMenuItem) в список младших элементов.

Delete(Index) – процедура, удаляющая из списка младших элементов элемент с индексом Index. При этом элемент из динамической памяти не удаляется и может быть повторно использован.

На стадии проектирования тому или иному элементу меню можно задать клавишу (клавиши) быстрого управления, используя свойство ShortCut, выбрав из выпадающего списка подходящее сочетание либо набрав их непосредственно с помощью клавиатуры.

Можно эту операцию осуществить и на стадии выполнения программы, но, сделать это несколько труднее. Для этой цели можно воспользоваться специальными стандартными подпрограммами, позволяющими выполнять различные преобразования (ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut).

Главное меню Main Menu

Обычно главное меню формируется на стадии проектирования. С этой целью следует воспользоваться компонентой Main Menu из страницы Standart палитры компонент, а затем применить свойство Items. При активизации мышью этого свойства открывается конструктор меню (работа с ним будет описана ниже). Характеристики элементов меню задаются с помощью инспектора объектов. При необходимости (например, для создания подменю) используется локальное меню конструктора.

Можно создать меню или отдельные его элементы и на стадии выполнения программы. Для этого нужно использовать следующие стандартные функции: NewItem, NewLine, NewSubMenu, NewMenu.

Локальное меню Popup Menu

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

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

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

Alignment – свойство типа TPopupAlignment, которое определяет расположение локального меню относительно курсора мыши.

AutoPopup – свойство логического типа. Если свойство имеет значение True, локальное меню появляется при нажатии правой клавиши мыши, если имеет значение False, меню не появляется (в этом случае следует использовать метод Popup).

OnPopup – событие, возникающее при выводе локального меню на экран путем нажатия правой клавиши мыши (если свойство AutoPopup имеет значение True) или вызова метода Popup. Это единственное событие, которое обрабатывает локальное меню.

Popup(X, Y) – процедура, выводящая на экран меню, при этом координаты его верхнего левого угла равны X и Y.

На стадии проектирования локальное меню создается так же, как и главное меню. В форме размещается компонента Popup Menu из страницы Standart палитры компонент. Далее активизируется его свойство Items и с помощью конструктора меню набирается структура меню. Завершается создание локального меню привязкой его к конкретному элементу управления (элементам управления) через свойство PopupMenu элемента управления.

Для создания локального меню на стадии выполнения программы можно использовать стандартную функцию NewPopupMenu.

Для формирования открытого массива Items элементов меню здесь также можно воспользоваться стандартными функциями NewItem, NewLine и NewSubMenu.

Конструктор меню

Окно конструктора меню содержит структуру имеющегося меню или один пустой прямоугольник (если создается новое меню), соответствующий первому создаваемому подменю.

При создании нового главного меню в инспекторе объектов появляется информация, соответствующая новому создаваемому элементу меню. В этой информации важным является свойство Caption, куда следует поместить название элемента, которое будет отображаться на экране. При вводе этого названия наряду с остальными можно использовать и буквы кириллицы. Перед какой-либо буквой можно поставить символ &, задающий клавишу быстрого перехода. Здесь же можно задать и клавиши быстрого управления, позволяющие выполнять определенную для этого элемента команду. Для названий подменю главного меню клавиши быстрого управления не отображаются, однако выполняют свои функции.

Для добавления элемента в любом месте меню (за исключением конечных элементов, которые создаются автоматически при прекращении работы с предыдущим элементом) необходимо выделить элемент, перед которым следует поместить новый элемент, и выполнить команду Insert локального меню конструктора. В результате этого появится пустой элемент в соответствующем месте, с которым дальше проводится работа, как указано выше.

Для удаления любого элемента меню или даже группы элементов следует выполнить команду Delete.

Все изменения главного меню сразу же отражаются на его виде, появляющемся в форме.

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

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

Завершается работа с конструктором меню закрытием его окна.

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

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

рождения, проводить сортировку по номеру записи, а также по фамилии, кроме этого оно дает возможность произвести печать содержимого БД «Телефонная книжка».

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

1. Откроем DataBase Desktop 7.0 и создадим необходимые нам вторичные индексы по полям Family, Birthday и IDPeople, назвав их FamilyIndex, BirthdayIndex и Number соответственно.

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

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

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

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

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

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

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

5.1.Со страницы Standart палитры компонент поместим на форму Form1 компоненту MainMenu в правый нижний угол формы.

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

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

свойству Name – Exit_pt.

5.4.У следующего элемента главного меню (пустой прямоугольник справа от элемента меню Файл) свойству Caption зададим значение Поиск, а свойству Name – Search-pt. Подпункты элемента меню Поиск

– По фамилии, По дате рождения – создадим аналогично элементам Печать и Выход (их свойствам Name зададим значения Family1_pt и Date_pt соответственно).

5.5.Аналогичным образом создадим элемент меню Сортировка, который включает в себя пункты По номеру (свойство Name

Number_pt) и По фамилии (свойство Name – Family2_pt).

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

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

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

USES MyExUnitDB3;

на раздел

USES MyExUnitDB7;

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

USES MyUnitReport;

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

procedure TForm1.Print-ptClick (Sender: TObject); begin

Form2.QuickRep1.Preview; end;

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

procedure TForm1.Exit-ptClick (Sender: TObject); begin

Close;

end;

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

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

8.2.Со страницы Standart поместим на форму, в ее верхнюю часть, компоненту Label. Изменим ее свойство Caption на «Введите фамилию

искомого человека», а через сложное свойство Font изменим шрифт на полужирный.

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

8.4.Ниже, под компонентами Label1 и Edit1, приблизительно в центре формы поместим две кнопки BitBtn со страницы Additional палитры компонент. Активизируем первую кнопку и изменим следующие ее свойства: Caption на ОК, Kind на bkOK, ModalResult на mrOK и Name

на OKBtn. В результате мы получим стандартную кнопку ОК. Теперь активизируем вторую кнопку и изменим ее свойства следующим образом: Caption на Отмена, Kind на bkCancel, ModalResult на mrCancel

и Name на CancelBtn, т.е. создадим стандартную кнопку Cancel.

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

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

USES MyUnitReport, Search7, Search7-1;

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

procedure TForm1.Family1-ptClick (Sender: TObject); begin

IF Form3.ShowModal = mrCancel THEN Exit;

Form1.Table1.IndexName := ‘FamilyIndex’; Form1.Table1.SetKey;

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

end;

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

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

10. Для обеспечения работы с пунктом меню «По дате рождения» необходимо проделать действия, аналогичные выполненным. Обработчик события OnClick будет иметь следующий вид:

procedure TForm1.Date-ptClick (Sender: TObject); begin

IF Form4.ShowModal = mrCancel THEN Exit; Form1.Table1.IndexName := ‘BirthdayIndex’; Form1.Table1.SetKey;

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

end;

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

procedure TForm1.Number-ptClick (Sender: TObject); begin

Form1.Table1.IndexName := ‘Number’; Form1.Table1.SetKey; Form1.Table1.GotoNearest;

end;

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

procedure TForm1.Family2-ptClick (Sender: TObject); begin

Form1.Table1.IndexName := ‘FamilyIndex’; Form1.Table1.SetKey; Form1.Table1.FieldByName(‘Family’).AsString := ‘A’; Form1.Table1.GotoNearest;

end;

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

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

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

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

Задание к лабораторной работе № 5

1. Используя приложение, созданное в лабораторной работе № 2, спроектируйте создайте главное меню, предоставляющее следующие возможности (состав и структуру меню и его подменю определить самостоятельно):

1. Завершение работы.

2.Печать отчета, созданного в лабораторной работе № 3, (можно использовать любой из созданных отчетов).

Атакже:

Вариант 1.

1. Поиск поставщика по фамилии.

2.Поиск детали по номеру

3.Сортировка записей по фамилиям поставщика.

4.Сортировка по номерам деталей.

5.Вывод списка деталей одного и того же цвета (цвет задается пользователем).

6.Вывод списка деталей одного и того же веса (вес задается пользователем).

Вариант 2.

1. Поиск участника по фамилии.

2.Поиск участника по фамилии тренера.

3.Поиск участника по городу.

4.Сортировка по городам.

5.Сортировка по фамилиям участников.

6.Вывод списка участников, приехавших из одного города (название города задается пользователем).

Вариант 3.

1. Поиск студента по фамилии.

2.Сортировка по номерам групп.

3.Сортировка по фамилиям студентов.

4.Вывод списка заданий по одной и той же дисциплине (дисциплина задается пользователем).

5.Вывод списка студентов с максимальным суммарным баллом.

6.Вывод списка студентов с их данными, выполнившими хотя бы одно задание.

Вариант 4.

1. Поиск по должности.

2.Поиск по фамилии.

3.Поиск по дате поступления на работу.

4.Сортировка по названиям должностей.

5.Сортировка по стажу работника.

6.Вывод максимальной заработной платы.

Вариант 5.

1. Поиск по фамилии.

2. Поиск по типу изделия.

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

4.Сортировка по типам изделий.

5.Вывод фамилии рабочего, изготовившего за неделю наибольшее количество деталей.

6.Вывод списка изделий, имеющих одну и ту же стоимость (стоимость задается пользователем).

Вариант 6.

1. Поиск изделий по категориям.

2.Поиск по фамилии.

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

4.Сортировка по фамилиям.

5.Вывод списка рабочих из одного и того же цеха (название цеха задается пользователем).

6.Вывод фамилии рабочего, собравшего наибольшее количество изделий по всем категориям.

Вариант 7.

1. Поиск телефона по номеру.

2.Поиск по фамилии.

3.Сортировка по годам установки телефонов.

4.Сортировка по номерам телефонов.

5.Вывод списка абонентов, имеющих спаренный телефон.

6.Вывод списка льготных номеров телефонов и их владельцев.

Вариант 8.

1. Поиск игрушки по ее названию.

2.Поиск игрушки по названию фабрики.

3.Сортировка по цене игрушек.

4.Сортировка по количеству игрушек.

5.Вывод списка игрушек, сгруппированных по возрастным категориям, с данными об изготовителе.

6.Вывод названия самой дорогой игрушки.

Вариант 9.

1. Поиск по фамилии.

2.Сортировка по индексу групп.

3.Сортировка по фамилиям.

4.Вывод списка студентов, имеющих собственную семью.

5.Вывод списка студентов, не сдавших сессию (более двух неудовлетворительных оценок).

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

Вариант 10.

1. Поиск спортсмена по фамилии.

2.Поиск спортсмена по названиям стран.

3.Сортировка по фамилии спортсмена.

4.Сортировка по названиям стран.

5.Вывод списка спортсменов из одной страны (задается пользователем).