Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi.pdf
Скачиваний:
188
Добавлен:
24.02.2016
Размер:
6.84 Mб
Скачать

Самая ответственная часть работы завершена, список команд сформирован. Теперь привяжем команды к визуальным компонентам: кнопкам и пунктам меню.

8.6.3. Привязка команд

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

Шаг 78. Привязку команд начнем с кнопки Open на панели инструментов. Выделите ее и в раскрывающемся списке свойства Action выберите значение

OpenAction (рисунок 8.83).

Рисунок 8.83. К кнопке OpenToolButton привязывается команда OpenAction

Обратите внимание, что надпись на кнопке изменилась. Это результат копирования значения свойства Caption из компонента OpenAction в

компонент OpenToolButton.

Шаг 79. Аналогичным образом привяжите команду OpenAction к пункту Open… главного меню (рисунок 8.84).

413

Рисунок 8.84. К пункту меню OpenMenuItem привязывается команда OpenAction

Проверим, что у нас получилось. Выполните компиляцию и запустите программу (рисунок 8.85).

Рисунок 8.85. При запуске программы команда Open оказалась недоступна

Странно: и кнопка Open… на панели инструментов, и пункт Open… в главном меню недоступны. Это объясняется отсутствием у компонента OpenAction обработчика события OnExecute. Им сейчас и займемся.

8.6.4. Реакция на команды

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

414

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).

415

Рисунок 8.86. Команда Open опять доступна пользователю (компонент OpenAction обрабатывает событие OnExecute)

Закрыв программу, вернитесь к проекту в среде Delphi, чтобы продолжить настройку оставшихся команд.

Шаг 81. Обойдите все пункты меню (не забудьте про контекстное меню) и кнопки панели инструментов и установите в каждом из них свойство Action в соответствующее значение. Попутно значения некоторых других свойств тоже изменятся, например свойство Enabled получит значение True. Пусть вас это не беспокоит, так и должно быть (рисунок 8.87).

Рисунок 8.87. Все пункты меню и кнопки панели инструментов привязаны к командам

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

416

Шаг 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);

417

begin Close;

end;

procedure TPictureForm.CloseActionExecute(Sender: TObject); begin

with Image do begin

Picture := nil; Width := 0; Height := 0;

end;

NormalSizeAction.Execute; // Вместо NormalSizeMenuItem.Click; EnableCommands(False);

UpdateStatusBar;

end;

Шаг 85. Теперь настало время команд ToolBarAction и StatusBarAction:

procedure TPictureForm.ToolBarMenuItemClick(Sender: TObject); begin

end;

procedure TPictureForm.StatusBarMenuItemClick(Sender: TObject); begin

end;

procedure TPictureForm.ToolBarActionExecute(Sender: TObject); begin

ToolBarAction.Checked := not ToolBarAction.Checked; ToolBar.Visible := not ToolBar.Visible;

end;

procedure TPictureForm.StatusBarActionExecute(Sender: TObject); begin

StatusBarAction.Checked := not StatusBarAction.Checked; StatusBar.Visible := not StatusBar.Visible;

end;

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

Шаг 86. Вернитесь к окну редактирования списка команд и выделите команду HalfSizeAction. После этого нажмите клавишу Ctrl и, удерживая ее,

выделите команды NormalSizeAction и DoubleSizeAction. Перейдите к окну свойств и установите свойство GroupIndex в значение 1 (рисунок 8.89).

418

Рисунок 8.89. Группировка команд с помощью свойства GroupIndex

Шаг 87. Свойство Checked компонента NormalSizeAction установите в значение True — при запуске программы рисунок не масштабируется

(рисунок 8.90).

Рисунок 8.90. Начальное значение для переключателя масштаба — Normal Size

Шаг 88. Установите свойство Enabled команд HalfSizeAction,

NormalSizeAction и DoubleSizeAction в значение False — при запуске программы рисунок еще не загружен, поэтому команды переключения масштаба должны быть недоступны (рисунок 8.91).

419

Рисунок 8.91. Команды переключения масштаба отключены до тех пор, пока пользователь не откроет какой-нибудь графический файл

Шаг 89. Теперь создадим обработчики команд HalfSizeAction,

NormalSizeAction и DoubleSizeAction. Для каждой команды определите обработчик события OnExecute и перенесите код из уже имеющихся методов:

procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject); begin

end;

procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject); begin

end;

procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject); begin

end;

...

procedure TPictureForm.HalfSizeActionExecute(Sender: TObject); begin

HalfSizeToolButton.Down := True;

HalfSizeMenuItem.Checked := True;

HalfSizePopupItem.Checked := True; with Image do

begin

AutoSize := False;

Width := Picture.Width div 2; Height := Picture.Height div 2; Stretch := True;

end;

420

end;

procedure TPictureForm.NormalSizeActionExecute(Sender: TObject); begin

NormalSizeToolButton.Down := True;

NormalSizeMenuItem.Checked := True;

NormalSizePopupItem.Checked := True; Image.AutoSize := True;

end;

procedure TPictureForm.DoubleSizeActionExecute(Sender: TObject); begin

DoubleSizeToolButton.Down := True;

DoubleSizeMenuItem.Checked := True;

DoubleSizePopupItem.Checked := True; with Image do

begin

AutoSize := False;

Width := Picture.Width * 2;

Height := Picture.Height * 2; Stretch := True;

end;

end;

Шаг 90. Обработчики можно упростить за счет управления состоянием пунктов меню и кнопок через компоненты Action, т.е. первые три оператора каждого обработчика заменяются на один оператор:

procedure TPictureForm.HalfSizeActionExecute(Sender: TObject); begin

HalfSizeAction.Checked := True; with Image do

begin

AutoSize := False;

Width := Picture.Width div 2; Height := Picture.Height div 2; Stretch := True;

end;

end;

procedure TPictureForm.NormalSizeActionExecute(Sender: TObject); begin

NormalSizeAction.Checked := True; Image.AutoSize := True;

end;

procedure TPictureForm.DoubleSizeActionExecute(Sender: TObject); begin

DoubleSizeAction.Checked := True; with Image do

begin

AutoSize := False;

Width := Picture.Width * 2;

421

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]