Дополнительные кнопки Delphi (TSpeedButton и TBitBtn)
Мы уже познакомились с кнопкой TButton с вкладки Standard. В Delphi есть еще два вида кнопок на вкладке Additional— TBitBtn и TSpeedButton. Помимо простого текста, они могут содержать и изображения, разница только в том, что TBitBtn может получать фокус ввода с клавиатуры, a TSpeedButton нет.
Что значит "получение фокуса ввода"? Когда вы щелкаете мышью по какому-то элементу управления, то он получает фокус ввода. Например, вы щелкнули по строке ввода TEdit. После этого в ней появляется курсор для ввода текста, и все события от клавиатуры будут посылаться именно этому компоненту. Точно так же с кнопкой. Если вы щелкнули по ней, то все нажатия на клавиатуре будут посылаться кнопке. Правда, кнопка не может получать текст, но если вы нажмете клавишу
<Enter>, когда фокус находится на кнопке, то это будет равносильно щелчку по этой кнопке мышью.
Кнопка TSpeedButton не может получать фокуса. Это значит, что если вы набирали какой-то текст в строке ввода, а потом щелкнули по такой кнопке, то обработается соответствующее событие и фокус возвратится обратно в строку ввода. Он не останется на кнопке.
Как вы знаете, фокус выделенного компонента в программах можно менять клавишей <ТаЬ>. Если вы нажмете ее, то будет выделен следующий по счету компонент. Так вот клавишей <ТаЬ> невозможно выделить кнопку TSpeedButton.
Объект TBitBtn хорошо подходит там, где нужна кнопка с изображением, a TSpeedButton для кнопок панели инструментов, потому что такие кнопки никогда не должны получать фокуса ввода. Наверное, поэтому TSpeedButton отображается в Delphi на панели инструментов в виде квадратной кнопки, ведь на панели инструментов в большинстве программ кнопки квадратные.
Давайте попробуем создать небольшое приложение, в котором будут использоваться оба типа этих кнопок. Запустите Delphi и создайте новый проект.
Установите на форму компонент TPanei с вкладки Standard. Измените у него свойство Align на alTop, чтобы панель растянулась по верху формы. Теперь удалите текст в свойстве caption и измените высоту (свойство Height) на 24. Как показывает мой опыт, такие панели наиболее эстетичны, а кнопки получаются достаточного для работы размера.
Установите на панель кнопку TSpeedButton и установите у нее свойства Left (левая позиция) в 0 и тор (верхняя позиция) в 1. Ширина (width) кнопки должна быть равна 23, а высота (Height) — 22. Давайте изменим имя кнопки на ExitButton, потому что по нажатии этой кнопки мы будем закрывать программу.
Если вы все сделали правильно, то у вас должно получиться нечто похожее на рис. 11.1.
Теперь дважды щелкните по свойству Glyph, и перед вами должно открыться окно загрузки изображения (см. рис. 11.2). Нажмите на кнопку Load, и загрузите картинку. К Delphi прилагается большая библиотека готовых изображений. Расположены они в папке \Program Files\Common Files\Borland Shared\Images\Buttons.
Загружаемая картинка по умолчанию должна иметь размер 16x16. Пусть будет загрузка картинки, которая идет вместе с Delphi под названием dooropen.bmp. Можете сделать то же самое. Как только вы выберете картинку, нажмите ОК, чтобы закрыть окно загрузки изображения. Теперь на кнопке отображается выбранная картинка. Запустите программу, чтобы посмотреть на результат ее работы.
Теперь создадим для кнопки событие onclick. Для этого нужно дважды щелкнуть левой кнопкой мыши по самой кнопке или выделить ее и на вкладке Events объектного инспектора и мышью дважды щелкнуть по свойству onclick. В созданном обработчике события напишите код вызова метода закрытия формы:
Теперь можно запустить программу и проверить ее работу в действии.
Усложним задачу и поместим на форме еще две кнопки. Пусть они будут расположены так, как это показано на рис. 11.3. В первую из них загружена картинка из файла Bulboff.bmp (BuiboffButton), а во вторую — Bulbon.bmp В скобках указаны имена кнопок.
Теперь установите у обеих КНОПОК СВОЙСТВО Grouplndex равным 1 и у любой из них измените свойство Down на true. Таким образом, мы назначили этим кнопкам один и тот же индекс группы, и они стали сгруппированными. Можно устанавливать любой индекс больше нуля. При нулевом значении считается, что группировки нет. Кнопка, у которой свойство Down установлено в true, по умолчанию выглядит нажатой.
Попробуйте теперь запустить программу и нажимать на новые кнопки. Когда нажата одна из них, то другая автоматически отпускается. Это связано с тем, что кнопки сгруппированы и работают как одно целое.
Таким способом часто оформляют операции выравнивания. Например, в том же текстовом редакторе Word кнопки выравнивания работают именно так.
Возможность кнопки находиться в нажатом и нормальном состоянии появилась после того, как были сгруппированы две кнопки, путем присвоения их свойству Grouplndex значения 1. Вы можете создать еще одну группу кнопок (количество кнопок не ограничено двумя) и присвоить ей значение 2. В этом случае новая группа кнопок будет работать независимо от первой.
ВНИМАНИЕ. Свойство Down может быть равно true только у одной кнопки в группе.
Теперь установим на форму кнопку TBitBtn и назовем ее startBtn. В свойстве caption напишите слово "Старт" и загрузите сюда любую картинку. Загрузка происходит точно таким же образом, как и при использовании TSpeedButton.
Кнопки TBitBtn и TSpeedButton очень похожи и имеют практически все одинаковые свойства и методы, поэтому больше тут сказать уже почти нечего.
Очень интересным является свойство Layout, которое показывает, где должна располагаться картинка, а где текст. На рис. 11.4 показаны разные варианты кнопок, а снизу приписаны установленные значения в свойстве Layout.
Другим интересным свойством является Kind. В нем заложен список заранее подготовленных стандартных кнопок. При выборе любого из них автоматически изменяется текст и изображение на кнопке. На рис. 11.5 вы можете увидеть различные кнопки и соответствующие им значения Kind. Жаль только, что текст англоязычный, но его изменить очень легко. Помимо картинки и текста, изменяется свойство ModalResult — результат, который вернет кнопка для диалогового окна.
Давайте напишем пример, который будет запускать дочернее модальное окно по нажатии кнопки Старт.
Создайте еще одну форму. Если вы работаете в Delphi 7 и ниже, то сразу откройте
менеджер проектов (Project Manager), чтобы легче было переключаться между формами (для этого нужно выбрать меню View | Project Manager). Теперь установите на новую форму три кнопки. Желательно расположить их так, как это показано на рис. 11.6.
Для первой кнопки установим свойство Kind в Ькок, для второй— в bcCancel, а для третьей — bkAbort.
Теперь вернемся в первую форму (для этого дважды щелкните мышью в окне Project Manager по первой форме) и создадим обработчик события onclick для кнопки Старт. В нем нужно написать содержимое листинга 11.1.
procedure TMainForm.StartBtnClick(Sender: TObj ect); begin
Form2.ShowModal; // Показываю вторую форму if Form2.ModalResult=mrOk then
Application.MessageBox('Вы нажали кнопку OK', 'Вы нажали'); if Fonn2 .ModalResult=mrCancel then
Application.MessageBox('Вы нажали кнопку Cancel', 'Вы нажали'); if Form2.ModalResult=mrAbort then
Application.MessageBox('Вы нажали кнопку Abort', 'Вы нажали'); end;
В первой строке кода показывается вторая форма как модальное окно. Если пользователь нажмет одну из трех кнопок, модальное окно закроется и в свойстве формы Form2 .ModaiResuit будет находиться результат, который указан у нажатой кнопки в свойстве ModaiResuit. Вот именно этот результат мы проверяем после закрытия окна, и в зависимости от этого выводится на экран необходимое сообщение. Попробуйте запустить этот пример и посмотреть его в действии.