Назад.

ПРОЕКТИРОВАНИЕ СТРОКИ СОСТОЯНИЯ

Строка состояния (status bar) — это панель в нижней части окна, предназначенная для вывода вспомогательной информации: параметров документа, с которым работает пользователь, подсказок к пунктам меню и т.д. В Delphi 2.0 она организуется с помощью компонента StatusBar, расположенного в Палитре Компонентов на странице Win95.

Шаг 34. Опустите компонент на форму и дайте ему имя StatusBar (рис. 6.31).

Следующая таблица знакомит вас с основными свойствами компонента StatusBar. Когда вы изучите компонент, она пригодится вам в качестве справочника, а сейчас просто окиньте ее взглядом и двигайтесь дальше.

Свойство

Описание

Align

Способ выравнивания строки состояния в пределах владельца (формы).

Panels

Информационные панели, отображаемые на строке состояния.

SimplePanel

Если равно True, то вместо информационных панелей на строке состояния отображается одна простая строка текста, хранящаяся в свойстве SimpleText.

SimpleText

Строка текста, отображаемая в строке состояния, когда свойство SimplePanel равно True.

SizeGrip

Если равно True, то в правом нижнем углу строки состояния рисуется «гармошка», работающая как размерная рамка.

Как только вы добавили на форму строку состояния, она тут же прижалась к нижнему краю формы и растянулась по всей ее ширине (рис. 6.32). Какая сообразительная! А ну-ка изменим ширину формы. Ба! Строка состояния тоже корректирует свою ширину и всегда занимает всю нижнюю часть формы.

Такое поведение обеспечивает свойство Align, которое в компоненте StatusBar по умолчанию установлено в значение alBottom. Свойство Align есть во многих визуальных компонентах Delphi. С его помощью вы можете заставить компонент подгонять свои размеры и положение при изменении размеров своего владельца (формы или компонента, на котором он находится). Возможные значения свойства Align описаны в таблице:

Значение

Описание

alNone

Позиция и размеры компонента остаются неизменными в пределах владельца.

alTop

Компонент прижимается к верхнему краю владельца и растягивается по всей его ширине.

alBottom

Компонент прижимается к нижнему краю и растягивается по всей его ширине.

alLeft

Компонент прижимаетс к левому краю владельца и растягивается по всей его высоте.

alRight

Компонент прижимаетс к правому краю владельца и растягивается по всей его высоте.

alClient

Компонент подгоняется под размеры владельца.

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

Шаг 35. Вернемся к примеру и приспособим строку состояния для отображения размеров картинки и имени файла, в котором картинка хранится на диске. С этой целью разобьем строку состояния на две информационные панели. Выберите в Инспекторе Объектов свойство Panels и щелчком мыши на многоточии в значении свойства откройте Редактор Панелей (рис. 6.33).

Шаг 36. В этом окне создаются, редактируются и удаляются панели строки состояния. Создайте первую панель щелчком на кнопке New и установите ее свойства так, чтобы она получилась шириной 70 пикселов (Width = 70), продавленной (Bevel = Lowered) и с центрированным текстом (Alignment = Center). В этой панели будут отображаться размеры картинки. Аналогично создайте вторую панель неограниченной ширины (—1), продавленной (Bevel = Lowered) и с прижатым влево текстом (Alignment = Left). В ней будет отображаться имя файла. Закройте Редактор Панелей, щелкнув на кнопке ОК.

Строка состояния спроектирована и сейчас рассмотрим, как вывести на нее текст. Доступ к панелям обеспечивает свойство Panels строки состояния. Объект Panels содержит массив Items, элементами которого являются объекты-панели. Каждая панель имеет свойство Text, в котором хранится отображаемый на панели текст. Итак, установка содержимого строки состояния в нашем примере будет выглядеть так:

StatusBar.Panels.Items[0].Text := Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);

StatusBar.Panels.Items[1].Text := OpenDialog.FileName;

Учитывая, что массив Items выступает главным свойством объекта Panels, эти операторы можно записать чуть короче:

StatusBar.Panels[0].Text := Format('%d x %d', [Image.Picture.Width, Image.Picture.Height]);

StatusBar.Panels[1].Text := OpenDialog.FileName;

Для вывода информации на первую панель (с индексом 0) мы воспользовались функцией Format, форматирующей строку. Первый параметр функции — это исходная форматная строка, а второй — открытый массив аргументов, подставляемых вместо управляющих символов форматной строки.

Шаг 37. Обновление строки состояния удобно оформить в виде частного (private) метода формы:

procedure TPictureForm.UpdateStatusBar;

begin

if Image. Width <> 0 then { в компоненте Image есть картинка } begin

StatusBar.Panels[0].Text := Format('%d x %d ', [Image.Picture.Width, Image.Picture.Height]) ;

StatusBar.Panels[1].Text := OpenDialog.FileName;

end

else { в компоненте Image нет картинки } begin

StatusBar.Panels[0].Text := '';

StatusBar.Panels[1].Text := '';

end;

end;

Шаг 38. Вызовы метода UpdateStatusBar поместите в обработчики команд меню Open... и Close.

Наконец, выполните компиляцию приложения и проверьте, что строка состояния работает. Например, откройте какой-либо файл с картинкой. В строке состояния отобразятся размеры картинки и путь к файлу (рис. 6.34).

ПОДСКАЗКИ НА СТРОКЕ СОСТОЯНИЯ

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

Для того чтобы вы могли получить строку состояния с описанной выше логикой работы, в компоненте StatusBar предусмотрен режим отображения простого текста. Его обеспечивает булевское свойство SimplePanel. По умолчанию оно равно False и в строке состояния отображаются панели объекта Panels. Если установить свойство SimplePanel в значение Тше, то в строке состояния будет отображаться текст, хранящийся в свойстве SimpleText. Итак, задача состоит в том, чтобы при активизации меню записывать подсказку выбранного пункта в свойстве SimpleText и, в том случае если подсказка содержит текст, устанавливать свойство SimplePanel в True. Для решения этой задачи вы должны представлять механизм работы подсказок в Delphi-приложениях. Его суть состоит в следующем.

Каждый пункт меню имеет свойство Hint для хранения поясняющего текста (подсказки). Когда вы выделяете пункт меню с помощью мыши или клавиатуры, поясняющий текст переписывается из пункта меню в объект Application, у которого тоже есть свойство Hint. При этом в объекте Application возникает событие OnHint. В ответ на это событие нужно отобразить Hint объекта Application в строке состояния.

Шаг 39. Поскольку объект Application не виден в Инспекторе Объектов, вы должны сами объявить новый обработчик, полностью записать его программный код и назначить объекту Application. Результат первых двух действий будет следующим:

type

TPictureForm = class(TForm)

public procedure ApplicationHint (Sender: TObject) ;

end;

procedure TPictureForm.ApplicationHint(Sender: TObject) ;

begin with StatusBar do begin

SimpleText := Application.Hint;

SimplePanel := SimpleText <> '';

end;

end;

Шаг 40. Установку обработчика выполним при создании формы по событию OnCreate:

procedure TPictureForm. FormCreate (Sender: TObject) ;

begin

Application.OnHint := ApplicationHint;

end;

Шаг 41. Программная часть готова. Теперь в свойстве Hint каждого пункта меню впишите угодную вам строку-подсказку (рис. 6.35).

 

Скомпилируйте и запустите программу — вы получите приложение с полностью работающей строкой состояния.

Если критически взглянуть на нынешний вариант приложения, то среди прочих мелких замечаний выделяется существенный недостаток: форма неправильно прокручивает свое содержимое, когда размеры картинки превышают размеры формы. Дело в том, что в прокрутке участвует и строка состояния, а этого быть не должно. Строка состояния должна оставаться на своем месте, прижимаясь к нижнему краю формы. Чтобы разобраться с этой ошибкой, читайте следующий раздел.

ПРОКРУТКА

ПРОКРУТКА В РАБОЧЕЙ ОБЛАСТИ ФОРМЫ

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

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

Форма имеет встроенную поддержку прокрутки, благодаря чему реализуется просмотр содержимого формы при любом изменении ее размеров. Когда размеры или координаты управляющих элементов превышают размеры формы, форма создает одну или две полосы прокрутки и пользователь получает возможность прокручивать изображение. Полосы прокрутки представлены на форме составными свойствами HorzScrollBar и VertScrollBar. Свойство HorzScrollBar описывает горизонтальную полосу прокрутки, а VertScrollBar — вертикальную полосу. Их вложенные свойства кратко описаны в таблице:

Свойство

Описание

Increment

Величина “информативной строки” в пикселах

Margin

Минимальный отступ прокручиваемых элементов от края области прокрутки.

Position

Позиция бегунка на полосе прокрутки. Range Виртуальный размер области прокрутки.

Tracking

Если True, то прокрутка изображения происходит в процессе isis передвижения бегунка с помощью мыши.

Visible

Определяет, видна ли полоса прокрутки пользователю.

 

Наибольший интерес представляют вложенные свойства Tracking и Increment. Установка булевского свойства Tracking в Тше обеспечивает прокрутку изображения в процессе передвижения бегунка с помощью мыши. Свойство Increment задает величину “информативной строки” в пикселах. Уменьшив его значение до 1, вы получите более плавную прокрутку.

ПРОКРУТКА В ОТДЕЛЬНОЙ ПРЯМОУГОЛЬНОЙ ОБЛАСТИ

Как ни крути, а форма не позволяет организовать прокрутку в отдельной своей части. Например, в приложении для просмотра графических файлов хотелось бы организовать прокрутку картинки, но так, чтобы строка состояния в прокрутке не участвовала. Форма этого сделать не позволяет. Здесь на помощь приходит компонент ScrollBox, реализующий отдельную область прокрутки. Он расположен в Палитре Компонентов на странице Additional (рис. 6.37).

Следующая таблица содержит краткую характеристику его отличительных свойств:

Свойство

Описание

Align

Способ выравнивания области прокрутки в пределах владельца.

AutoScroll

Если равно True, полосы прокрутки появляются и скрываются автоматически по мере необходимости.

BorderStyle

Определяет, имеет ли область прокрутки рамку.

HorzScrollBar

Определяет параметры и поведение горизонтальной полосы прокрутки.

VertScrollBar

Определяет параметры и поведение вертикальной полосы прокрутки.

Компонент ScrollBox характеризуется тем, что служит владельцем для других компонентов и обеспечивает прокрутку внутри своей прямоугольной области. Давайте поместим на него картинку (компонент Image), а область прокрутки расположим между меню и строкой состояния. В результате большие картинки будут прокручиваться уже не формой, а компонентом ScrollBox и строка состояния останется на своем месте прижатой к нижнему краю формы. Приступим к реализации намеченного плана.

Шаг 42. Активизируйте на форме компонент Image и временно удалите его в буфер (команда меню Edit | Cut). Теперь опустите на форму компонент ScrollBox, выбрав его из Палитры Компонентов. Назовите новый компонент ScrollBox и подгоните его под всю незанятую область формы, установив свойство Align в значение alClient (рис. 6.38).

Шаг 43. А сейчас вставьте из буфера компонент Image (команда меню Edit | Paste) и убедитесь, что он стал в левый верхний угол области прокрутки.

Готово. Скомпилируйте и запустите приложение, загрузите в него какую-нибудь картинку. Увеличивая и уменьшая окно, понаблюдайте за тем, как появляются и исчезают полосы прокрутки между меню и строкой состояния. Обратите внимание, что величина бегунков на полосах прокрутки зависит от соотношения видимой части и всего изображения. Это работает компонент ScrollBox (рис. 6.39). Правда здорово?! А самое главное — без единой строчки кода.

 

ПОЛОСЫ ПРОКРУТКИ

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

ScrollBar — это отдельная полоса прокрутки без области прокрутки. Ее согласованная работа с другими компонентами обеспечивается программистом. Для этого в компоненте ScrollBar предусмотрено событие OnScroll, в ответ на которое и нужно выполнять необходимые действия. Должны вам сообщить, что компонент ScrollBar не имеет никакого отношения ни к форме, ни к компоненту ScrollBox. И вообще, он используется очень редко. Авторы этой книги будут вам признательны, если вы сообщите им о применении компонента ScrollBar в реальной задаче.

Следуя традиции данной книги, мы приводим табличное описание свойств компонента. После таблицы приводится рисунок, который наглядно поясняет смысл парочки свойств (рис. 6.41).

Свойство

Описание

Kind

Вид полосы прокрутки: горизонтальная или вертикальная.

LargeChange

Величина “информативной страницы”.

Min, Max

Начальная и конечная виртуальные позиции на полосе прокрутки.

Position

Позиция бегунка на полосе прокрутки.

SmallChange

Величина “информативной строки”.

Ну вот вы и разобрались с прокруткой. Уверены, что вам понравилось, как она реализована в Delphi. Действительно компонентное программирование. Взял компонент ScrollBox, поместил на форму, набросал в него других компонентов — и готово. А теперь пора засучить рукава, ибо вас ждет самая увлекательная часть этой главы — проектирование инструментальной панели.

 

ПАНЕЛЬ ИНСТРУМЕНТОВ

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

В Delphi панель инструментов строится из нескольких компонентов. Панель делается из компонента Panel, кнопки-инструменты — из компонентов SpeedButton, рельефная канавка между инструментальной панелью и меню — из компонента Bevel. Воспользуемся названными компонентами и разработаем инструментальную панель с кнопками, дублирующими команды меню Open..., Save As..., Half Size, Normal Size, Double Size.

ПАНЕЛЬ

Сначала создадим панельподложку для кнопок. В данный момент на форме нет свободного места, поэтому панель скорее всего угодит в область прокрутки. А ее нужно разместить между строкой главного меню и областью прокрутки. Чтобы преодолеть это затруднение, сделайте следующее.

Шаг 44. Активизируйте область прокрутки, временно уберите для нее выравнивание (установите свойство Align в значение aINone) и приспустите ее верхнюю границу, освободив на форме немного места (рис. 6.42).

Шаг 45. Теперь активизируйте форму и поместите на нее компонент Panel (он находится в Палитре Компонентов на странице Standard) (рис. 6.43).

Шаг 46. Назовите новый компонент ToolBar и выровняйте его по верхней стороне формы, установив свойство Align в значение alTop. Наконец, восстановите в области прокрутки свойство Align в значение alClient (рис. 6.44).

Основу для панели инструментов вы создали, и в качестве передышки мы вам пробежаться по наиболее важным свойствам компонента Panel и поэксперименти-ровать с их значениями (см. табл. 6. 13). Особый интерес представляют свойства Bevellnner и BevelOuter. Изменяя их значения, вы получите выпуклую, вдавленную ограниченную канавкой или выступом панель.

Свойство

Описание

Align

Способ выравнивания панели в пределах владельца.

Bevellnner

Рельефность внутреннего контура панели: bvLowered – вдавленный контур; bvRaised – выпуклый контур; bvNone – нерельефный контур.

BevelOuter

Рельефность внешнего контура панели: bvLowered – вдавленный контур; bvRaised – выпуклый контур; bvNone – нерельефный контур.

BevelWidth

Глубина рельефа в пиклелях.

BorderWidth

Расстояние в пикселях между внутренним и внешним контуром.

BorderStyle

Определяет, имеет ли панель рамку.

Caption

Текст на панели.

Шаг 47. Продолжим настройку панели. Во-первых, уберите с нее текст (просто очистите свойство Caption), а во-вторых, откажитесь от рельефа (для этого установите свойства Bevellnner и BevelOuter в значение bvNone). Вы конечно же спросите, чем плоха выступающая панель. Всем хороша, но взгляните на инструментальные панели других Windows-приложений, например, WordPad, Word, Excel. Они намного элегантнее и просто отделены горизонтальной канавкой от строки меню. Разве ваше приложение хуже? В общем, вы тоже хотите такую же канавку. Ее легко получить с помощью компонента Bevel.

КАНАВКА

Компонент рельефа Bevel позволяет создавать на поверхности формы различные рельефные эффекты: углубления, выпуклости, бордюры, канавки. Он расположен в Палит ре Компонентов на странице Additional (рис. 6. 45).

Выполняя роль украшения, этот компонент вообще не имеет списка событий. Его внешний вид регулируется с помощью свойств, описанных в таблице:

Свойство

Описание

Align

Способ выравнивания компонента в пределах владельца.

Shape

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

Style

Определяет, является рельефный элемент выпуклым или вдавленным.

Шаг 48. Активизируйте на форме панель и опустите на нее компонент Bevel, затем установите свойства нового компонента в следующие значения:

Align = alTop; Height = 2; Shape = bsTopLine

Взгляните на панель инструментов. Совсем другое дело! Теперь она выглядит в современном стиле Windows.

КНОПКИ-ИНСТРУМЕНТЫ

Панель готова, приступим к созданию кнопок. Напомним, что кнопки-инструменты представлены компонентами SpeedButton. Вы найдете этот компонент в Палитре Компонентов на странице Additional (рис. 6. 47).

Шаг 49. Активизируйте на форме панель и поместите на нее компонент SpeedButton — первую кнопку. Дайте кнопке имя OpenBtn. Активизируйте панель снова и поместите на нее вторую кнопку с именем SaveBtn. Аналогичным образом добавьте еще три кнопки с идентификаторами HalfSizeBtn, NormalSizeBtn и DoubleSizeBtn. Расположите кнопки на панели так, как показано на рисунке ниже.

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

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

• очистится селектор объекта;

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

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

Шаг 51. Перейдите в окно Инспектора Объектов и установите следующие значения для свойств:

Height = 24; Width =24; Top = 6

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

Свойство

Описание

AllowAllUp

Если равно True, то все кнопки одной группы могут находится в отжатом состоянии.

GroupIndex

Задает группу кнопок, работающих согласованно.

Down

Если равно True, то кнопка нажата, иначе кнопка отжата.

Caption

Текст на кнопке.

Glyph

Картинка на кнопке.

Layout

Положение картинки относительно текста.

Margin

Расстояние от границы кнопки до картинки. Если равно -1, то картинка вместе с текстом центрируются на кнопке.

Spacing

Расстояние от картинки до текста. Если равно -1, то текст центрируется между картинкой и границей кнопки.

 

КАРТИНКИ НА КНОПКАХ

Кнопка инструментальной панели может содержать текст и картинку. Текст определяется значением свойства Caption, а картинка — значением свойства Glyph.

Шаг 52. Изначально на кнопке нет ни текста, ни картинки. Чтобы назначить кнопке картинку, сделайте двойной щелчок мыши в значении свойства Glyph. Появится окно Редактора Картинки, в котором существуют средства просмотра, загрузки, сохранения картинок формата BMP (рис. 6. 49).

Шаг 53. Нажмите кнопку Load... и загрузите файл Open. bmp, который находится на компакт-диске. Закройте Редактор Картинки щелчком по кнопке ОК.

Шаг 54. Проделайте все те же действия для остальных кнопок, загрузив картинки из файлов Save. bmp, Halfsize. bmp, Normsize. bmp и Dblsize. bmp.

Шаг 55. Пока в приложении нет открытого файла, не имеет смысла делать все кнопки, кроме первой, доступными для пользователя, поэтому установите в них свойство Enabled в значение False. Результирующий вид формы после всех этих действий показан ниже (рис. 6. 50).

Иногда кнопки инструментальной панели имеют и картинку, и текст. В этом случае их взаимное расположение регулируется с помощью свойств Layout, Margin и Spacing. Смысл этих свойств наглядно поясняет рисунок (рис. 6. 51).

Свойство Layout определяет общую ориентацию картинки по отношению к тексту: снизу (bIGIyphBottom), слева (bIGIyphLeft), справа (bIGIyphRight) или сверху (bIGIyphTop). По умолчанию картинка располагается слева от текста (значение свойства равно bIGIyphLeft). Свойства Margin и Spacing регулируют расстояния (в пикселах) от границы кнопки до картинки и от картинки до текста. Если значение Margin равно -1, то картинка и текст центрируются на кнопке. Если значение Spacing равно — 1, то текст центрируется между картинкой и границей кнопки.

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

ВЗАИМОИСКЛЮЧАЮЩИЕ КНОПКИ

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

Шаг 56. Чтобы сгруппировать кнопки HalfSizeBtn, NormalSizeBtn и DoubleSizeBtn, установите свойство Grouplndex каждой из них в одно и то же ненулевое значение (например, 1). Среднюю кнопку сделайте нажатой, установив ее свойство Down в значение True.

ОБРАБОТКА НАЖАТИЙ КНОПОК

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

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

procedure TPictureForm. Half SizeItemClick (Sender: TObject);

begin

HalfSizeBtn. Down; = True; { кнопка согласуется с пунктом меню}

end;

procedure TPictureForm. NormalSizeItemClick (Sender: TObject);

begin

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

end;

procedure TPictureForm. DoubleSizeItemClick (Sender: TObject);

begin

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

end;

Шаг 58. Чтобы обеспечить динамическое разрешение и запрещение кнопок при открытии и закрытии файла картинки, скорректируйте еще метод EnabIeCommands:

procedure TPictureForm. EnabIeCommands (Enable: Boolean);

begin

SaveBtn. Enabled: = Enable;

HalfSizeBtn. Enabled: = Enable/NormalSizeBtn. Enabled: = Enable;

DoubleSizeBtn. Enabled: = Enable;

{ Delphi неправильно разрешает нажатые кнопки}

{ Следующие операторы устраняют ошибку}

if Enable then begin

HalfSizeBtn. Down: = True;

NormalSizeBtn. Down: = True;

end;

end;

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

Панель инструментов работоспособна, но чего-то в ней не хватает. Конечно же, подсказок к кнопкам, наподобие тех, что имеются в Windows 95, Delphi и во всех хороших приложениях. Ими сейчас и займемся.

ПОДСКАЗКИ К КНОПКАМ

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

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

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

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

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

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

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

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

УПРАВЛЕНИЕ ВИДИМОСТЬЮ ПАНЕЛИ ИНСТРУМЕНТОВ

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

procedure TPictureForm. ToolbarItemClick (Sender: TObject);

begin

Toolbarltem. Checked: = not Toolbarltem. Checked;

PopToolbarItem. Checked: =not PopToolbarItem. Checked;

ToolBar. Visible: = not ToolBar. Visible;

end;

procedure TPictureForm. StatusbarItemClick (Sender: TObject);

begin

Statusbarltem. Checked: =not Statusbarltem. Checked;

PopStatusbarItem. Checked: =not PopStatusbarItem. Checked;

StatusBar. Visible: = not StatusBar. Visible;

end;

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

ИТОГИ

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