Главная страница

Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1


Скачать 2.61 Mb.
НазваниеУчебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1
Дата15.01.2023
Размер2.61 Mb.
Формат файлаdoc
Имя файлаlab_OOTP.doc
ТипУчебное пособие
#886736
страница25 из 33
1   ...   21   22   23   24   25   26   27   28   ...   33

Таблица 8.16. Важнейшие свойства компонента ToolButton

8.5.3. Значки на кнопках

Главным атрибутом кнопки является значок. Он определяется значением свойства ImageIndex (номер значка в списке Images компонента ToolBar). Установим на кнопках значки, воспользовавшись ранее созданным списком ImageList.

Шаг 57. Выделите на форме компонент ToolBar, перейдите к окну свойств и установите свойству Images значение ImageList (рисунок 8.57).



Рисунок 8.57. На кнопках панели инструментов появились значки

Вот здорово! На всех кнопках появились разные значки, хотя мы не устанавливали свойство ImageIndex ни в одной из кнопок. Это произошло потому, что компонент ToolBar сделал это за нас, назначив каждой кнопке номер значка в соответствии с очередностью добавления кнопок на панель.

Признаемся, что мы немного схитрили, заранее расположив значки в компоненте ImageList в том порядке, в котором они расположены на панели инструментов. В реальных задачах вам, вероятно, потребуется вручную указывать номера значков для каждой кнопки с помощью свойства ImageIndex.

8.5.4. Надписи на кнопках

Шаг 58. Кнопка может содержать надпись рядом со значком. Текст надписи устанавливается в свойстве Caption. Сначала он не виден и, чтобы его показать, задайте в компоненте ToolBar свойству ShowCaptions значение True (рисунок 8.58).



Рисунок 8.58. Кнопки панели инструментов могут содержать надписи (свойство ShowCaptions равно True)

Результат получился немного неожиданный: стандартные надписи на кнопках эквивалентны их программным идентификаторам и расположены под значками вместо того, чтобы находиться справа.

Шаг 59. Подправим надписи. В окне свойств переключите свойство List в значение True (рисунок 8.59).



Рисунок 8.59. Надписи на кнопках располагаются справа от значков (свойство List равно True)

Как вы уже догадались, свойство List управляет расположением текста и значков относительно друг друга.

Шаг 60. Теперь измените надписи на кнопках (свойство Caption), чтобы получить панель инструментов, показанную на рисунке 8.60.



Рисунок 8.60. Кнопкам заданы правильные надписи

Шаг 61. Чтобы панель инструментов выглядела лучше, подгоним размеры кнопок под размеры надписей. Для этого воспользуемся свойством AutoSize, которое есть у каждой кнопки. При установке этого свойства применим технику группового редактирования компонентов.

Шаг 62. Выделите щелчком мыши первую кнопку, а затем, удерживая клавишу Shift, выделите щелчками мыши все остальные кнопки. В окне свойств произойдут следующие изменения:

  • вместо имени активного компонента будет показано общее количество выделенных компонентов:

  • в списке свойств останутся только общие для выделенных компонентов свойства и события;

  • свойства и события, которые у выделенных компонентов имеют разные значения, окажутся пустыми.

Перейдите к окну свойств и установите свойство AutoSize в значение True (рисунок 8.61).



Рисунок 8.61. Применение техники группового редактирования при установке во всех кнопках свойства AutoSize в значение True

Теперь выполните компиляцию и запустите программу. Результат представлен на рисунке 8.62.



Рисунок 8.62. Программа для просмотра графических файлов имеет панель инструментов, однако кнопки пока еще не работают

Кнопки нажимаются, но реакции на них пока нет. Мы этим займемся потом, а сейчас придадим панели инструментов более современный вид. Избавимся от чрезмерного количества 3D-эффектов на кнопках.

Шаг 63. Закройте приложение и вы вернетесь в среду Delphi. Выделите на форме компонент ToolBar и переключите его свойство Flat в значение True. Теперь снова запустите программу и полюбуйтесь на результат (рисунок 8.63).



Рисунок 8.63. Кнопки панели инструментов получили современный «плоский» вид

Кнопки приобретают рельефный вид только при наведении на них указателя мыши.

8.5.5. Разделительные линии

Важными элементами панели инструментов являются разделительные линии, которые используются для группировки кнопок.

Шаг 64. В нашем примере логично отделить группу кнопок, отвечающих за размеры рисунка (Half Size, Normal Size и Double Size), от кнопок Open и Save As. Для этого вызовите контекстное меню панели инструментов и выберите команду New Separator (рисунок 8.64).



Рисунок 8.64. Создание разделительной линии на панели инструментов с помощью команды New Separator контекстного меню

На панель инструментов будет добавлен новый компонент, имеющий вид вертикальной черты. С помощью мыши отбуксируйте его на место между кнопками Save As и Half Size (рисунок 8.65):



Рисунок 8.65. Буксировка разделительной линии на место между кнопками Save As и Half Size

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



Рисунок 8.66. Кнопки на панели инструментов внешне сгруппированы по назначению

Напоследок заметим, что разделительная линия представлена обычным компонентом ToolButton. То, какой вид имеет этот компонент (кнопка или разделительная линия), определяется свойством Style. Это свойство имеет много значений, которые перечислены в таблице 8.16.

8.5.6. Кнопки-переключатели

Кнопки панели инструментов могут работать как переключатели, «залипая» при нажатии. Для того, чтобы кнопка была переключателем, ее свойство Style должно содержать значение tbsCheck. Состояние кнопки (нажата она или нет) определяется значением свойства Down.

Кнопки-переключатели могут работать согласовано, т.е. включение одной из них означает выключение остальных. Именно так должны работать кнопки выбора масштаба отображения рисунка. Согласованная работа кнопок обеспечивается не так, как согласованная работа пунктов меню. Кнопки панели инструментов не имеют свойства GroupIndex, они группируются по другому принципу. Сгруппированными считаются расположенные рядом кнопки, у которых свойство Grouped равно значению True и свойство Style равно значению tbsCheck.

Шаг 65. Сгруппируйте кнопки Half Size, Normal Size и Double Size. Они уже находятся рядом друг с другом, поэтому просто установите их свойства Grouped и Style как показано на рисунке 8.67.



Рисунок 8.67. Кнопки Half Size, Normal Size и Double Size сгруппированы в трехпозиционный переключатель

У кнопки NormalSize установите свойство Down в значение True, предварительно убрав выделение кнопок HalfSize и NormalSize (рисунок 8.68).



Рисунок 8.68. Начальное положение трехпозиционного переключателя — Normal Size

Выполните компиляцию и запустите программу. Проверьте, что кнопки HalfSize, NormalSize и DoubleSize работают как трехпозиционный переключатель (рисунок 8.69).



Рисунок 8.69. Кнопки-переключатели в работе

Шаг 66. Завершая дизайн панели инструментов, сделайте кнопки Save As, Half Size, Normal Size и Double Size недоступными, установив у них свойство Enabled в значение False (рисунок 8.70). Эти кнопки будут оставаться недоступными, пока пользователь не откроет какой-нибудь рисунок.



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

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

8.5.7. Обработка нажатий кнопок

При нажатии кнопок возникают события OnClick, которые должны обрабатываться точно так же, как и команды меню. Поскольку все события OnClick имеют одинаковый формат для всех компонентов, просто подключите к кнопкам уже существующие обработчики событий.

Шаг 67. Группа кнопок, управляющих масштабом рисунка, должна правильно переключаться даже тогда, когда пользователь устанавливает масштаб с помощью команд меню. Поэтому дополните обработчики событий так, как показано ниже:

procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);

begin

HalfSizeToolButton.Down := True; // кнопка согласуется с пунктом меню

...

end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);

begin

NormalSizeToolButton.Down := True; // кнопка согласуется с пунктом меню

...

end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);

begin

DoubleSizeToolButton.Down := True; // кнопка согласуется с пунктом меню

...

end;

Шаг 68. Чтобы кнопки становились доступными или недоступными в зависимости от того, открыт рисунок или нет, подправьте метод EnableCommands:

procedure TPictureForm.EnableCommands(Enable: Boolean);

begin

...

SaveAsToolButton.Enabled := Enable;

HalfSizeToolButton.Enabled := Enable;

NormalSizeToolButton.Enabled := Enable;

DoubleSizeToolButton.Enabled := Enable;

end;

Вроде бы все. После компиляции и запуска программы вы получите работающую панель инструментов (рисунок 8.71). Нажмите кнопку Open и выберите рисунок. Когда рисунок откроется, все остальные кнопки станут доступными. Понажимайте кнопки, отвечающие за масштаб, и убедитесь, что они работают согласовано с командами меню.



Рисунок 8.71. Программа для просмотра графических файлов получила работоспособную панель инструментов

Панель инструментов работоспособна, но в ней не хватает одной мелочи — подсказок к кнопкам.

8.5.8. Подсказки к кнопкам

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



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

Обе подсказки хранятся в свойстве Hint, которое имеет следующий формат:

<всплывающая подсказка>|<подсказка в строке состояния>

Всплывающая подсказка отделяется вертикальной чертой от подсказки для строки состояния.

Если в программе есть строка состояния, то при попадании указателя мыши на визуальный компонент в ней автоматически отображается поясняющий текст, записанный справа от символа вертикальной черты. Это легко проверить. Впишите в свойстве Hint кнопки Open текст "Open an existing file...|Open an existing file...". После запуска программы вы обнаружите, что подсказка для кнопки работает точно так же, как и подсказка к пункту меню.

Наиболее удобный вид подсказок — это всплывающие подсказки. Всплывающая подсказка появляется спустя секунду после того, как пользователь задерживает указатель мыши над компонентом. Приятная особенность всплывающих подсказок состоит в том, что они вообще не требуют программирования — достаточно просто разрешить компоненту отображать всплывающую подсказку, и подсказка начнет работать.

Шаг 69. В каждом визуальном компоненте существует булевское свойство ShowHint, определяющее, появляется подсказка, или нет (рисунок 8.73). Его значение может устанавливаться напрямую, а может копироваться из содержащего компонента (например, из формы). Копирование значения происходит тогда, когда вспомогательное свойство ParentShowHint установлено в True. Таким образом, появлением подсказок можно управлять из содержащего компонента. Этой возможностью мы воспользуемся в нашей задаче. Принимая во внимание, что во всех компонентах свойство ParentShowHint изначально равно True, просто установите в компоненте ToolBar (владелец кнопок) свойство ShowHint в значение True. В результате во всех кнопках свойство ShowHint тоже получит значение True и это заставит их отображать свои подсказки.



Рисунок 8.73. Свойство ShowHint управляет отображением всплывающих подсказок

Шаг 70. Впишите для каждой кнопки текст подсказки (свойство Hint). Как вы знаете, свойство Hint может содержать сразу две подсказки: всплывающую подсказку и подсказку в строке состояния (они разделяются символом вертикальной черты). Если вторая кажется вам лишней, просто не набирайте ее, но символ вертикальной черты поставьте (рисунок 8.74).



Рисунок 8.74. Символ вертикальной черты в тексте подсказки оставлен, чтобы подсказка не отображалась в строке состояния

Выполните компиляцию и запустите программу. Убедитесь, что панель инструментов работает правильно.

Давайте придадим приложению завершенность и доработаем обработчики команд меню View | Toolbar и View | Status bar.

8.5.9. Управление видимостью панели кнопок

Шаг 71. Обработка команд View | Toolbar и View | Statusbar выполняется на удивление просто — у соответствующей панели изменяется значение булевского свойства Visible на противоположное. При этом панель исчезает или появляется в окне вместе с изменением значения свойства. Проще не придумаешь! Окончательный вариант обработчиков будет следующим:

procedure TPictureForm.ToolBarMenuItemClick(Sender: TObject);

begin

ToolBar.Visible := not ToolBar.Visible;

ToolBarMenuItem.Checked := not ToolBarMenuItem.Checked;

end;
procedure TPictureForm.StatusBarMenuItemClick(Sender: TObject);

begin

StatusBar.Visible := not StatusBar.Visible;

StatusBarMenuItem.Checked := not StatusBarMenuItem.Checked;

end;

Итак, приложение для просмотра графических файлов обладает полным набором функциональных возможностей. Выполните его компиляцию и посмотрите, как исчезают и появляются панель инструментов и строка состояния при выборе в меню View соответствующих команд.

8.6. Список команд

Часто одна и та же команда дублируется в разных местах пользовательского интерфейса: и в главном меню, и в контекстном меню, и на панели инструментов. Например, команды управления масштабом рисунка присутствуют во всех перечисленных местах программы Picture Viewer. Это очень удобно для пользователя, но добавляет работы программисту, поскольку изменение команды в одном месте требует таких же изменений во всех других местах. На помощь приходит компонент ActionList, который централизованно управляет всеми командами пользовательского интерфейса. Рассмотрим его использование.

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;

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



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

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



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

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



Рисунок 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;

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;

Height := Picture.Height * 2;

Stretch := True;

end;

end;

А теперь воспользуемся свойством AutoCheck компонентов Action, чтобы избавиться от необходимости программно переключать метку в пунктах Toolbar и Statusbar главного меню. Когда свойство AutoCheck равно True, то при выполнении команды свойство Checked автоматически меняет свое значение на противоположное. Это отражается на связанных с командой пунктах меню и кнопках-переключателях.

Шаг 91. У команд ToolBarAction и StatusBarAction установите свойства AutoCheck и Checked в значение True.

Шаг 92. Подправьте методы ToolBarActionExecute и StatusBarActionExecute:

procedure TPictureForm.ToolBarActionExecute(Sender: TObject);

begin

ToolBar.Visible := ToolBarAction.Checked;

end;
procedure TPictureForm.StatusBarActionExecute(Sender: TObject);

begin

StatusBar.Visible := StatusBarAction.Checked;

end;

8.6.5. Управление состоянием команд

Компонент ActionList имеет удобный механизм управления состоянием команд (например, доступна/недоступна). После выполнения очередной команды и во время простоя программы в компоненте возникает событие OnUpdate. Реакцией на это событие может быть изменение состояния отдельных команд, например переключение в них свойства Enabled. Напомним, что сейчас для этих целей используется метод EnableCommand, вызываемый при открытии и закрытии файла. Избавимся от него.

Шаг 93. Выделите на форме компонент ActionList, и в окне свойств на вкладке Events отыщите событие OnExecute. Двойным щелчком мыши создайте обработчик:

procedure TPictureForm.ActionListUpdate(Action: TBasicAction;

var Handled: Boolean);

var

NonEmpty: Boolean;

begin

NonEmpty := Image.Picture.Graphic <> nil;

SaveAsAction.Enabled := NonEmpty;

CloseMenuItem.Enabled := NonEmpty;

HalfSizeAction.Enabled := NonEmpty;

NormalSizeAction.Enabled := NonEmpty;

DoubleSizeAction.Enabled := NonEmpty;

Handled := True;

end;

Шаг 94. Удалите метод EnableCommands и обращения к нему из методов OpenActionExecute и CloseActionExecute. Вот, что должно получиться:

procedure TPictureForm.OpenActionExecute(Sender: TObject);

begin

if OpenDialog.Execute then

begin

Image.Picture.LoadFromFile(OpenDialog.FileName);

NormalSizeAction.Execute;

end;

UpdateStatusBar;

end;
procedure TPictureForm.CloseActionExecute(Sender: TObject);

begin

with Image do

begin

Picture.Graphic := nil;

Width := 0;

Height := 0;

end;

NormalSizeAction.Execute;

UpdateStatusBar;

end;

Шаг 95. Программа полностью готова, выполните компиляцию и запустите ее. Наслаждайтесь результатами своего труда, просматривая рисунки на жестком диске (рисунок 8.92).



Рисунок 8.92. Окончательный вариант программы для просмотра графических файлов

Напоследок вернитесь к исходному тексту программы и взгляните на то, какими лаконичными стали обработчики событий. В них нет ничего лишнего. Все второстепенные вещи за вас сделали стандартные компоненты среды Delphi, а вы смогли сосредоточиться на главном — логике прикладной задачи.

8.7. Итоги

В этой главе вы в деталях изучили важнейшие средства управления программой — главное и контекстное меню, строку состояния, панель инструментов. Вы умеете их создать и должным образом настроить. Вы способны создать “хребет” любой программы, что и доказали на деле, разработав весьма неплохое приложение для просмотра картинок, которое наверняка пригодиться в практической работе. Храбро вставляйте его в свои проекты и пользуйтесь, постигайте мир графических изображений через окно вашего персонального вьюера. После столь серьезных успехов рекомендуем вам немного передохнуть и перейти к другой важной проблеме — организации диалога между программой и человеком.

1   ...   21   22   23   24   25   26   27   28   ...   33


написать администратору сайта