Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.05.2024
Просмотров: 154
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Шаг 11. В ответ на выбор пользователем пунктов Toolbar и Status bar будем переключать флажок. Вы уже знаете, как определить обработчик события OnClick для пункта меню, поэтому сразу приведем то, что вы должны получить:
procedure TPictureForm.ToolBarMenuItemClick(Sender: TObject);
begin
// Спрятать или показать панель инструментов
ToolBarMenuItem.Checked := not ToolBarMenuItem.Checked;
end;
procedure TPictureForm.StatusBarMenuItemClick(Sender: TObject);
begin
// Спрятать или показать строку состояния
StatusBarMenuItem.Checked := not StatusBarMenuItem.Checked;
end;
Готово, соберите проект и проверьте, что пункты Toolbar и Status bar стали работать как переключатели. Позже, когда вы создадите в своем приложении строку состояния и панель инструментов, мы допишем эти обработчики событий. А сейчас рассмотрим еще один тип пунктов меню — взаимоисключающие переключатели.
8.1.9. Взаимоисключающие переключатели
Кроме обычных переключателей в меню широко применяются взаимоисключающие переключатели. Такие пункты работают согласовано — включение одного из них означает выключение остальных. В нашем примере с помощью взаимоисключающих переключателей удобно реализовать выбор масштаба для рисунка. Рассмотрим, как это делается.
Шаг 12. Добавьте в меню View три пункта: Half Size (программное имя HalfSizeMenuItem), Normal Size (программное имя NormalSizeMenuItem) и Double Size (программное имя DoubleSizeMenuItem), отделив их от остальных пунктов меню с помощью разделительной линии.
Шаг 13. Объедините только что созданные пункты меню в одну согласовано работающую группу. Для этого у всех пунктов установите одинаковое ненулевое значение свойства GroupIndex (например, 1). Кроме того, установите для всех этих пунктов свойство RadioItem в значение True, чтобы метка имела вид жирной точки. Один из пунктов (например, Normal Size) переведите во включенное состояние, установив его свойство Checked в значение True (рисунок 8.13).
Рисунок 8.13. Взаимоисключающие переключатели в меню
Шаг 14. Чтобы привести в действие механизм переключения пунктов, определите в них следующие обработчики события OnClick:
procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок половинного размера
HalfSizeMenuItem.Checked := True;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок нормального размера
NormalSizeMenuItem.Checked := True;
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок двойного размера
DoubleSizeMenuItem.Checked := True;
end;
Выполнив компиляцию, запустите программу и проверьте, что новые пункты меню работают как взаимоисключающие переключатели.
8.1.10. Недоступные пункты меню
Некоторые пункты меню могут быть недоступны пользователю в тот или иной момент времени. Такие пункты выглядят блеклыми, а попытки их выбрать ни к чему не приводят. Согласитесь, что легче запретить выбор отдельных пунктов меню, чем программировать логику поведения на случай, когда пользователь выбрал неправильную команду.
Шаг 15. В нашем примере логично было бы сделать недоступными пункты SaveAs..., Close, а также HalfSize, NormalSize и DoubleSize, когда нет открытого графического файла. Для этого в каждом из указанных пунктов меню установите свойство Enabled в значение False (рисунок 8.14).
Рисунок 8.14. Недоступные пункты меню
Шаг 16. Во время работы приложения нужно еще динамически делать пункты меню доступными или недоступными в зависимости от того, открыт графический файл или нет. Так как эти действия достаточно универсальны, оформим их в виде отдельного метода EnableCommands:
type
TPictureForm = class(TForm)
...
private
{ Private declarations }
procedure EnableCommands(Enable: Boolean);
end;
...
procedure TPictureForm.EnableCommands(Enable: Boolean);
begin
SaveAsMenuItem.Enabled := Enable;
CloseMenuItem.Enabled := Enable;
HalfSizeMenuItem.Enabled := Enable;
NormalSizeMenuItem.Enabled := Enable;
DoubleSizeMenuItem.Enabled := Enable;
end;
Параметр Enable данного метода определяет, в какое состояние перевести пункты меню: доступны — True или недоступны — False.
Шаг 17. Создайте обработчики команд Open... и Close. Как вы понимаете, в обработчик команды меню Open... следует поместить вызов метода EnableCommands с параметром True, а в обработчик команды Close — вызов метода EnableCommands с параметром False:
procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin
// Открыть рисунок и разрешить команды
EnableCommands(True);
end;
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
// Закрыть рисунок и запретить команды
EnableCommands(False);
end;
Выполните компиляцию и запустите программу. Посмотрите, как изменилось ее меню (рисунок 8.15).
Рисунок 8.15. Меню работающей программы. Некоторые пункты недоступны.
В самом начале работы отдельные пункты выпадающих меню File и View недоступны. Они становятся доступными после выбора команды File|Open..., а после выбора команды File|Close — снова недоступными.
Итак, вы изучили все основные аспекты программирования главного меню, поэтому перейдем к вопросу разработки контекстных меню.
8.1.11. Контекстное меню
Контекстное (вспомогательное) меню представлено в среде Delphi компонентом PopupMenu (рисунок 8.16). Отыщите его в палитре компонентов на вкладке Standard и поместите на форму. Дайте новому компоненту имя PopupMenu.
Рисунок 8.16. Компонент PopupMenu
Прежде, чем перейти к практическому использованию контекстных меню, кратко опишем отличительные свойства компонента PopupMenu (таблица 8.4).
Свойство | Описание |
Alignment | Определяет место появления меню относительно указателя мыши: paLeft — левый верхний угол меню совпадает с позицией курсора мыши; paCenter — середина верхнего края меню совпадает с позицией курсора мыши; paRight — правый верхний угол меню совпадает с позицией курсора мыши. |
AutoHotkeys | Значение maAutomatic избавляет программиста от необходимости назначать пунктам меню "горячие" клавиши (с помощью специального символа & в тексте пунктов); компонент автоматически подбирает "горячие" клавиши. Значение maManual требует, чтобы "горячие" клавиши назначил программист (см. параграф 8.1.3). |
AutoLineReduction | Если равно значению maAutomatic, то при отображении меню подряд идущие пункты-разделители рисуются как один разделитель, а пункты-разделители, находящиеся в начале или конце меню вообще не показываются. Свойство AutoLineReduction применяется при программном добавлении и удалении пунктов меню, чтобы избежать нежелательных явлений вроде повторяющихся и повисших разделительных линий. Если свойство AutoLineReduction равно значению maManual, то все пункты меню отображаются как есть. |
AutoPopup | Если равно значению True, то меню появляется автоматически по нажатию правой кнопки мыши. Если равно значению False, то меню необходимо отображать программно. |
Images | Список значков, отображаемых рядом с пунктами меню. Свойство Images используется совместно со свойством ImageIndex компонентов MenuItem (см. параграф 8.1.12). |
Items | Обеспечивает нумерованный доступ к пунктам меню. |
MenuAnimation | Набор флажков, определяющих способ появления меню на экране: maLeftToRight — слева направо, maRightToLeft — справа налево, maTopToBottom — сверху вниз, maBottomToTop — снизу вверх, maNone — мгновенное отображение. Чтобы флажки начали работать, запустите программу настройки экрана (Start–>Settings–>Control Panel–>Display) и на вкладке Effects выберите способ появления меню и подсказок — Scroll Effect. |
OwnerDraw | Если равно значению True, то каждый пункт меню получает возможность участвовать в процессе своего отображения при помощи специальных событий OnMeasureItem и OnDrawItem. Событие OnMeasureItem происходит в пункте меню, когда расчитываются размеры пункта. Событие OnDrawItem происходит в пункте меню, когда пункт рисуется на экране. Если свойство OwnerDraw равно значению False, то пукнты меню имеют стандартный вид и события OnMeasureItem и OnDrawItem не происходят. |
TrackButton | Кнопка мыши для выбора пункта меню: tbLeftButton — левая кнопка, tbRightButton — еще и правая кнопка. |
OnChange | Происходит при изменении структуры меню. |
OnPopup | Происходит при вызове меню пользователем. |
Таблица 8.4. Важнейшие свойства и события компонента PopupMenu
Шаг 18. Контекстное меню наполняется пунктами, как и главное меню, в дизайнере меню. Двойным щелчком мыши на компоненте PopupMenu откройте окно констурктора меню и, используя уже известные вам приемы, добавьте в меню пункты HalfSize (с идентификатором HalfSizePopupItem), NormalSize (с идентификатором NormalSizePopupItem) and DoubleSize (с идентификатором DoubleSizePopupItem). Во всех пунктах контекстного меню установите следующие свойства:
Enabled = False
GroupIndex = 1
RadioItem = True
Кроме этого пометьте пункт NormalSize, установив в нем свойство Checked в значение True. Таким образом, команды всплывающего меню дублируют некоторые команды главного меню, обеспечивая пользователю дополнительные удобства (рисунок 8.17).
Рисунок 8.17. Команды контекстного меню
Проектирование меню завершено и сейчас перейдем к программированию обработчиков событий. В данном примере команды контекстного меню обрабатываются так же, как и команды одноименных пунктов главного меню. Поскольку для пунктов главного меню обработчики уже написаны, то их просто нужно связать с пунктами контекстного меню. Это делается очень просто.
Шаг 19. Активизируйте в дизайнере меню пункт HalfSize и выберите в окне свойств вкладку Events. Выберите обработчик HalfSizeMenuItemClick из раскрывающегося списка события OnClick. То же самое проделайте с пунктами NormalSize и DoubleSize, установив для них обработчики NormalSizeMenuItemClick и DoubleSizeMenuItemClick соответственно (рисунок 8.18).
Рисунок 8.18. Установка обработчиков команд контекстного меню
Шаг 20. Для синхронной работы главного и контекстного меню нужно еще подправить некоторые обработчики:
procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок половинного размера
HalfSizeMenuItem.Checked := True;
HalfSizePopupItem.Checked := True;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок нормального размера
NormalSizeMenuItem.Checked := True;
NormalSizePopupItem.Checked := True;
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin
// Показать рисунок двойного размера
DoubleSizeMenuItem.Checked := True;
DoubleSizePopupItem.Checked := True;
end;
procedure TPictureForm.EnableCommands(Enable: Boolean);
begin
SaveAsMenuItem.Enabled := Enable;
CloseMenuItem.Enabled := Enable;
HalfSizeMenuItem.Enabled := Enable;
HalfSizePopupItem.Enabled := Enable;
NormalSizeMenuItem.Enabled := Enable;
NormalSizePopupItem.Enabled := Enable;
DoubleSizeMenuItem.Enabled := Enable;
DoubleSizePopupItem.Enabled := Enable;
end;
Шаг 21. Контекстное меню готово, осталось сделать так, чтобы оно вызывалось по щелчку правой кнопки мыши на форме. Нет ничего проще — активизируйте форму и запишите в значении свойства PopupMenu