Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2 семестр.doc
Скачиваний:
42
Добавлен:
27.05.2015
Размер:
777.73 Кб
Скачать

6.4. Панели инструментов

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

Кнопка SpeedButton прежде всего, она отличается от других кнопок тем, что не имеет фокуса ввода. Что это означает? При работе программы один из компонентов имеет фокус ввода, он выделен. Если это компонент для ввода текста (Edit, Memo), то пользователь сразу может вводить текст. Если это кнопка, то пользователь может нажать <Enter>, что будет равносильно нажатию на кнопку мышью. Кроме того, клавишей <Tab> можно перемещать фокус ввода от одного компонента к другому, порядок выделения компонентов определяется их свойством TabOrder. А кнопка SpeedButton фокуса ввода не имеет, ее нельзя выделить клавишей <Tab>, а если вы щелкните по ней мышью, то фокус ввода вернется к тому компоненту, в котором был до этого.

У кнопок SpeedButton, как и у других кнопок, имеется свойство Caption — надпись, но в этих кнопках оно обычно оставляется пустым, так как вместо надписи используется пиктограмма.

Свойство Glyph у этой кнопки работает также, как у BitBtn и позволяет загрузить на кнопку изображение.

Изображение на кнопке задается свойством Glyph.

Глиф – это растровое изображение, которое обычно помещается на элементе управления SpeedButton или BitBtn.

Свойство Glyph любого компонента представляет собой объект типа TBitmap.

Cвойство NumGlyphs определяет число используемых пиктограмм, свойства Layout и Margin определяют расположение изображения,

а свойство Spacing — расстояние между изображением и надписью

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

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

  1. Кнопка в отпущенном состоянии (нормальный вид);

  2. Кнопка недоступна (затененное изображение)

  3. Кнопка в нажатом состоянии;

  4. Кнопка в зафиксированном состоянии.

Обычно глиф связывается с элементом управления в процессе разработки формы, но вы можете загрузить битовые карты и при выполнении программы, используя метод LoadFromFile:

SpeedButton.Glyph.LoadFromFile (‘c:\alarm.bmp’);

SpeedButton.NumGlyph:=3;

Во всех современных приложениях такие кнопки обычно выглядят более плоскими. Чтобы убрать выпуклость кнопки, измените свойство Flat на True.

Особенностью кнопок SpeedButton являются свойства GroupIndex (индекс группы), AllowAllUp (разрешение отжатого состояния всех кнопок группы) и Down (исходное состояние — нажатое).

Свойство GroupIndex: TInteger позволяет объединять кнопки в группы. Если у любой из кнопок в группе установить свойство Down (нажата) в True, другие кнопки, будут отжаты Down будет иметь значение False. Именно таким образом вы можете, к примеру, выбрать начертание шрифта или выравнивание абзаца в MS Word.

Вы можете устанавливать сколько угодно групп, и каждой присваивайте в свойстве GroupIndex свою цифру. Если GroupIndex = 0, означает, что кнопка не принадлежит, ни к какой группе и ведет себя так же, как Button и BitBtn. При нажатии пользователем кнопки она погружается, а при отпускании возвращается в нормальное состояние. У кнопки с групповым индексом 0 вы просто не сможете перевести свойство Down в True.

В этом случае свойства AllowAllUp и Down не влияют на поведение кнопки.

Перемещаемые панели инструментов

Если вам в приложении потребуется лишь пару-тройку кнопок в панели инструментов, то проще воспользоваться первым вариантом. Но если вы делаете серьезное приложение и желаете, чтобы у него была профессиональная панель инструментов, то лучше воспользоваться перемещаемой панелью, как у программ из MS Office. Такие панели можно двигать, можно отрывать их от формы и делать из них отдельное окно.

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

Если вы поместите компонент ToolBar на форму, то по умолчанию он расположится вверху, поскольку его свойство Align по умолчанию равно alTop.

Если вы хотите, чтобы панель располагалась иначе, установите Align = alNone, после чего можете придать панели любую форму и расположить ее в любом месте.

Свойство Wrap, установленное в true, приводит к тому, что после этой кнопки ряд кнопок на панели прерывается и следующие кнопки размещаются в следующем ряду.

Занесение компонентов на панель ToolBar можно, в принципе, осуществлять обычным способом — переносом их из палитры компонентов. Но для занесения кнопок имеется и более простой вариант. Щелкните на ToolBar правой кнопкой мыши и выберите из всплывшего меню команду New Button. На форме появится очередная кнопка — объект типа TToolButton. Его вид и поведение определяется ее свойством Style, которое по умолчанию равно tbsButton — кнопка.

Изображение на кнопке определяется не свойством Glyph, а свойством ImageIndex. Оно определяет индекс изображения, хранящегося во внешнем компоненте ImageList. Указание на этот компонент может задаваться такими свойствами компонента ToolBar, как Images, DisabledImages (указывает на список изображений кнопок в недоступном состоянии) и HotImages (указывает на список изображений кнопок в моменты, когда над ними перемещается курсор мыши).

Свойство MenuItem позволяет задать раздел главного или контекстного меню, который дублируется данной кнопкой.

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

Значение Style = tbsCheck определяет, что после щелчка пользователя на кнопке она остается в нажатом состоянии. Повторный щелчок на кнопке возвращает ее в отжатое состояние.

Если при этом в нескольких кнопках установлено свойство Grouped = true, то эти кнопки образуют группу, из которой только одна кнопка может находиться в нажатом состоянии.

Значение Style = tbsDropDown соответствует кнопке в виде выпадающего списка. Этот стиль удобен для воспроизведения выпадающего меню.

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

Значение Style = tbsSeparator приводит к появлению разделителя, позволяющего отделить друг от друга кнопки разных функциональных групп.

Свойство кнопки Indeterminate задает ее третье состояние — не нажатая и не отпущенная. Свойство Marked выделяет кнопку.

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

Основное свойство компонента PageScrollerControl. Оно указывает компонент, который должен размещаться и прокручиваться в окне PageScroller. Благодаря наличию этого свойства вы можете проектировать свою инструментальную панель, например, ToolBar, не задумываясь о ее размере.

А после того, как вы спроектировали панель, можно ввести на форму компонент PageScroller и установить его свойство Control. В этот момент ваша инструментальная панель переместится в окно компонента PageScroller и появится, если необходимо, кнопка прокрутки.

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

Свойство AutoScroll определяет, должна ли прокрутка осуществляться автоматически, как только курсор мыши пройдет над кнопкой прокрутки. Опробуйте режим автоматической прокрутки экспериментально. На мой взгляд лучше оставлять значение AutoScroll равным false, поскольку такая автоматическая прокрутка не очень удобна пользователю.

Еще большую свободу перестроений дает пользователю компонент ControlBar. В ней может широко применяться техника перетаскивания и встраивания Drag&Doc, широко используемая в Delphi.

Поместите на форму компонент ControlBar и перенесите на него несколько компонентов.

Установите у компонентов, размещенных на ControlBar, свойство DragMode = dmAutomatic и DragKind = dkDock. Это означает автоматическое выполнение операций Drag&Doc.

Свойства компонента ControlBar RowSize и RowSnap определяют процедуру встраивания.

Свойство RowSize задает размеры полос, в которые могут встраиваться компоненты, a RowSnap определяет захват полосами встраиваемых компонентов.

Свойство AutoDrag определяет, можно (при значении true), или нельзя простым перетаскиванием вынести полосу за пределы ControlBar.

Компонент ActionList является последним на вкладке Standard коллекции компонентов. Это невизуальный компонент. Назначение этого компонента – организация механизма действий. Копировать одинаковое действие в три разных места – для команды главного меню, всплывающего меню и для кнопки на панели инструментов? Можно, но это неудобно, и неэффективно.

ActionList позволяет нам организовать механизм действий. Мы привязываем к какому-нибудь действию этого компонента свои команды, изображение, подсказку. А затем присваиваем это действие нужному пункту главного и всплывающего меню, нужной кнопке на панели инструментов. И какой бы способ отдать команду пользователь не выбрал, выполнится один и тот же код, указанный в действии ActionList. Более того, этот компонент имеет собственную коллекцию часто применяемых действий. Достаточно только вставить их и переименовать на русский язык, код действий писать уже не нужно. Удобно? Не то слово, такой способ организации программы сэкономит вам много времени, особенно на сложных проектах.

Суть действий компонента проста. Вначале вы создаете действие с помощью встроенного в компонент редактора действий. Присваиваете действию имя, изображение (если вы используете ImageList с коллекцией изображений), подсказку, категорию. Затем создаете для действия событие onExecute, где описываете все команды, которые должны выполняться при выборе данной команды. Затем вы связываете данное действие с нужной командой главного и всплывающего меню, с кнопкой панели инструментов. Вот и все!