Некоторые пункты меню могут быть недоступны пользователю в тот или иной момент времени. Такие пункты выглядят блеклыми, а попытки их выбрать ни к чему не приводят. Согласитесь, что легче запретить выбор отдельных пунктов меню, чем программировать логику поведения на случай, когда пользователь выбрал неправильную команду.
Шаг 15. В нашем примере логично было бы сделать недоступными пункты Save As..., Close, а также Half Size, Normal Size и Double Size, когда нет открытого графического файла. Для этого в каждом из указанных пунктов меню установите свойство 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 - снова недоступными.
Итак, вы изучили все основные аспекты программирования главного меню, поэтому перейдем к вопросу разработки контекстных меню.
Контекстное меню
Контекстное (вспомогательное) меню представлено в среде 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 откройте окно констурктора меню и, используя уже известные вам приемы, добавьте в меню пункты Half Size (с идентификатором HalfSizePopupItem), Normal Size (с идентификатором NormalSizePopupItem) and Double Size (с идентификатором DoubleSizePopupItem). Во всех пунктах контекстного меню установите следующие свойства:
· Enabled = False
· GroupIndex = 1
· RadioItem = True
Кроме этого пометьте пункт Normal Size, установив в нем свойство Checked в значение True. Таким образом, команды всплывающего меню дублируют некоторые команды главного меню, обеспечивая пользователю дополнительные удобства (рисунок 8.17).
Рисунок 8.17. Команды контекстного меню
Проектирование меню завершено и сейчас перейдем к программированию обработчиков событий. В данном примере команды контекстного меню обрабатываются так же, как и команды одноименных пунктов главного меню. Поскольку для пунктов главного меню обработчики уже написаны, то их просто нужно связать с пунктами контекстного меню. Это делается очень просто.
Шаг 19. Активизируйте в дизайнере меню пункт Half Size и выберите в окне свойств вкладку Events. Выберите обработчик HalfSizeMenuItemClick из раскрывающегося списка события OnClick. То же самое проделайте с пунктами Normal Size и Double Size, установив для них обработчики 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 имя разработанного ранее контекстного меню - PopupMenu. Вы можете ввести это значение с клавиатуры или выбрать из раскрывающегося списка (рисунок 8.19).
Рисунок 8.19. Привязка контекстного меню к форме
Готово, выполните компиляцию и запустите программу. Нажатие правой кнопки мыши в окне приложения вызовет появление контекстного меню. Все его пункты окажутся недоступными. Чтобы пункты контекстного меню заработали, выполните команду главного меню File / Open. После этого проверьте, что контекстное меню работает синхронно с главным меню.