Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.05.2024
Просмотров: 139
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
8.6.1. Создание списка команд
Отыщите в палитре компонентов на вкладке Standart компонент ActionList и добавьте его в форму (рисунок 8.75).
Рисунок 8.75. Компонент ActionList
Дайте компоненту имя ActionList (рисунок 8.76).
Рисунок 8.76. Компонент ActionList на форме
Ознакомьтесь со свойствами компонента ActionList в таблице 8.17.
Свойство | Описание |
Images | Список значков, отображаемых в компонентах, использующих команды. Свойство Images используется совместно со свойством ImageIndex компонентов Action. |
State | Позволяет временно запретить выполнение всех команд списка. Возможные значения: asNormal — команды работают в обычном режиме и доступность каждой команды определяется значением свойства Enabled в соответствующем компоненте Action; asSuspended — все команды недоступны, но при этом не затрагиваются свойства Enabled в компонентах Action; asSuspendedEnabled — все команды недоступны, но имеют обычный вид благодаря тому, что свойство Enabled каждого компонента Action устанавливается в значение True. |
OnChange | Происходит при модификации команд в списке. Однако не происходит при создании и уничтожении команд. |
OnExecute | Происходит при выполнении команды. |
OnStateChange | Происходит при изменении свойства State. Следует учитывать, что из-за ошибки в библиотеке VCL событие не происходит при переводе свойства State в значение asSuspended. |
OnUpdate | Происходит при выполнении команды и периодически во время простоя программы. Позволяет отслеживать и изменять состояния команд. |
Таблица 8.17. Важнейшие свойства и события компонента ActionList
Шаг 72. Создание списка команд начнем с команды Open. В контекстном меню компонента ActionList выберите команду Action List Editor… (рисунок 8.77).
Рисунок 8.77. Вызов списка команд из контекстного меню компонента ActionList
Перед вами откроется окно команд (рисунок 8.78).
Рисунок 8.78. Окно команд компонента ActionList
Окно команд работает в паре с окном свойств. Создание и удаление команд осуществляется в окне команд, а свойства отдельно взятой команды устанавливаются в окне свойств (рисунок 8.78).
Шаг 73. Щелчком на первой кнопке добавьте в список новую команду. Свойства команды немедленно появятся в окне свойств.
8.6.2. Команды
Когда вы создаете очередную команду в компоненте ActionList, среда Delphi добавляет в описание формы компонент Action. Компонент Action не существует отдельно от компонента ActionList и поэтому отсутствует в палитре компонентов. В остальном это обычный компонент, его важнейшие свойства приведены в таблице 8.18.
Свойство | Описание |
AutoCheck | Если равно значению True, то выполнение команды (вызов метода Execute) автоматически приводит к изменению значения свойства Checked на противоположное. Если равно значению False, то изменением состояния свойства Checked управляет сам программист. |
Caption | Заголовок команды. |
Category | Категория команды. |
Checked | Если равно значению True, то команда считается выбранной. В этом случае связанные с командой пунткы меню содержат метку, а кнопки имеют вдавленный вид. |
Enabled | Определяет, доступна ли команда пользователю. |
GroupIndex | Команды с одинаковым положительным значением GroupIndex согласовано переключают свойство Checked — установка у одной команды свойства Checked в значение True приводит к устновке его в значение False в других командах. |
ImageIndex | Номер значка в списке Images компонента ActionList. Значок отображается рядом с текстом пункта меню (см. параграф 8.1.12). Отрицательное значение свойства ImageIndex говорит о том, что для пункта меню значок не задан. Свойство ImageIndex имеет приоритет над свойством Bitmap. |
SecondaryShortCuts | Дополнительные комбинации клавиш. |
ShortCut | Комбинация клавиш для выполнения команды. |
Visible | Определяет, видна ли пользователю команда. |
OnExecute | Происходит при выполнении команды. |
OnHint | Происходит в момент появления всплывающей подсказки. |
OnUpdate | Происходит при выполнении команды и периодически во время простоя программы. Позволяет отслеживать и изменять состояние команды. |
Таблица 8.18. Важнейшие свойства и события компонента Action
Шаг 74. Перейдем к настройке команды, созданной на предыдущем шаге. Дайте команде имя OpenAction, в свойстве Caption впишите текст Open... и в свойстве ShortCut выберите значение Ctrl+O (рисунок 8.79).
Рисунок 8.79. Для команды Open задана комбинация клавиш Ctrl+O
Команда может иметь значок. Он определяется значением свойства ImageIndex (номер значка в списке Images компонента ActionList). Прежде чем выбрать значение для свойства ImageIndex, нужно указать список значков компоненту ActionList.
Шаг 75. Выделите на форме компонент ActionList и перейдите к окну свойств. Выберите в свойстве Images значение ImageList (рисунок 8.80).
Рисунок 8.80. Для компонента ActionList задается компонент ImageList со списком значков
Шаг 76. А теперь установим компоненту OpenAction соответствующий значок. Перейдите к окну команд и выделите команду OpenAction. Затем в окне свойств отыщите свойство ImageIndex и выберите значок с номером 0 (рисунок 8.81).
Рисунок 8.81. Для команды Open задан значок с индексом 0
Шаг 77. С командой OpenAction мы разобрались, теперь самостоятельно создайте команды SaveAsAction, CloseAction, ExitAction, ToolBarAction, StatusBarAction, HalfSizeAction, NormalSizeAction, DoubleSizeAction (рисунок 8.82) с соответствующими заголовками (свойство Caption).
Рисунок 8.82. Полный список команд для программы
Самая ответственная часть работы завершена, список команд сформирован. Теперь привяжем команды к визуальным компонентам: кнопкам и пунктам меню.
8.6.3. Привязка команд
Кнопки, пункты меню и некоторые другие визуальные компоненты имеют свойство Action, с помощью которого к ним привязываются команды. В результате установки свойства Action визуальный компонент копирует к себе значения свойств команды (надпись, значок, подсказку и др.). Кроме того, команда запоминает, к каким компонентам она привязана с тем, чтобы изменение свойств команды вызывало изменение соответствующих свойств во всех связанных с ней компонентах.
Шаг 78. Привязку команд начнем с кнопки Open на панели инструментов. Выделите ее и в раскрывающемся списке свойства Action выберите значение OpenAction (рисунок 8.83).
Рисунок 8.83. К кнопке OpenToolButton привязывается команда OpenAction
Обратите внимание, что надпись на кнопке изменилась. Это результат копирования значения свойства Caption из компонента OpenAction в компонент OpenToolButton.
Шаг 79. Аналогичным образом привяжите команду OpenAction к пункту Open… главного меню (рисунок 8.84).
Рисунок 8.84. К пункту меню OpenMenuItem привязывается команда OpenAction
Проверим, что у нас получилось. Выполните компиляцию и запустите программу (рисунок 8.85).
Рисунок 8.85. При запуске программы команда Open оказалась недоступна
Странно: и кнопка Open… на панели инструментов, и пункт Open… в главном меню недоступны. Это объясняется отсутствием у компонента OpenAction обработчика события OnExecute. Им сейчас и займемся.
8.6.4. Реакция на команды
Когда пользователь нажимает кнопку или выбирает пункт меню, происходит событие OnExecute. Если для команды не определен обработчик события OnExecute, то все компоненты, использующие эту команду, становятся недоступными (свойство Enabled устанавливается в значение False).
Шаг 80. Определим в компоненте OpenAction обработчик события OnExecute. Обратитесь к контекстному меню компонента ActionList и вызовите окно команд. В этом окне выберите команду OpenAction, после чего в окне свойств выберите вкладку Events. Теперь сделайте двойной щелчок мыши на значении события OnExecute. Среда Delphi создаст заготовку для будущего обработчика:
procedure TPictureForm.OpenActionExecute(Sender: TObject);
begin
end;
Обработчик у нас уже есть в виде метода OpenMenuItemClick, поэтому мы просто перенесем код этого метода (слегка подправив его) в только что созданный метод, удалив код метода OpenMenuItemClick.
procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin
end;
...
procedure TPictureForm.OpenActionExecute(Sender: TObject);
begin
if OpenDialog.Execute then
begin
Image.Picture.LoadFromFile(OpenDialog.FileName);
EnableCommands(True);
NormalSizeAction.Execute; // Вместо NormalSizeMenuItem.Click;
end;
UpdateStatusBar;
end;
Сохраните проект; пустой метод OpenMenuItemClick будет автоматически удален из исходного текста.
Обратите внимание, что компонент Action автоматически подменяет обработчики OnClick в связанных с ним компонентах. Поэтому если вы перейдете к окну свойств и посмотрите на событие OnClick в компоненте OpenMenuItem, то обнаружите там метод OpenActionExecute (обработчик события OnExecute компонента OpenAction).
Выполните компиляцию и запустите программу. Команда Open снова доступна пользователю (рисунок 8.86).
Рисунок 8.86. Команда Open опять доступна пользователю (компонент OpenAction обрабатывает событие OnExecute)
Закрыв программу, вернитесь к проекту в среде Delphi, чтобы продолжить настройку оставшихся команд.
Шаг 81. Обойдите все пункты меню (не забудьте про контекстное меню) и кнопки панели инструментов и установите в каждом из них свойство Action в соответствующее значение. Попутно значения некоторых других свойств тоже изменятся, например свойство Enabled получит значение True. Пусть вас это не беспокоит, так и должно быть (рисунок 8.87).
Рисунок 8.87. Все пункты меню и кнопки панели инструментов привязаны к командам
Восстановим правильную логику работы кнопок и пунктов меню.
Шаг 82. Сделайте недоступной команду SaveAsAction, установив ее свойство Enabled в значение False. Одновременно кнопка и пункт меню Save As... станут недоступными (рисунок 8.88).
Рисунок 8.88. Команда Save As отключена до тех пор, пока пользователь не откроет какой-нибудь графический файл
Шаг 83. Создайте для компонента SaveAsAction обработчик события OnExecute и перенесите код метода SaveAsMenuItemClick в только что созданный метод SaveAsActionExecute:
procedure TPictureForm.SaveAsMenuItemClick(Sender: TObject);
begin
end;
procedure TPictureForm.SaveAsActionExecute(Sender: TObject);
begin
if SaveDialog.Execute then
Image.Picture.SaveToFile(SaveDialog.FileName);
end;
Шаг 84. Доработку команды SaveAsAction мы закончили и теперь по аналогии доработаем команды ExitAction и CloseAction:
procedure TPictureForm.ExitMenuItemClick(Sender: TObject);
begin
end;
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
end;
procedure TPictureForm.ExitActionExecute(Sender: TObject);
begin
Close;
end;
procedure TPictureForm.CloseActionExecute(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeAction.Execute; // Вместо NormalSizeMenuItem.Click;