Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 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