Обзор
некоторых особенностей элементов управления
библиотеки FM20.DLL
В данной статье я хочу познакомить Вас с
библиотекой FM20.DLL. Не то чтобы Вы ее не знали,
скорее всего, открывали, видели, что она
повторяет стандартные элементы управления, и
забывали про нее.
Откуда же берется эта библиотека? Ответ прост:
это элементы управления из VBA (Visual Basic for Application).
Сама по себе библиотека, конечно, великовата - 1,05
Mb. И прежде чем просто включать ее в исходники
своего приложения десять раз подумаешь: окупает
ли данный объем, то, что она предоставляет из себя.
А предоставляет она несколько больше чем
стандартные элементы управления VB.
Давайте откроем ее и исследуем еще раз. Создайте
новый проект StandardEXE. Далее меню: Project/Components ... В
диалоговом окне выберем Microsoft Forms 2.0 Object Library. То,
что появилось у нас на левой панели инструментов,
практически один к одному повторяет стандартный
набор. Это
Frame
Label
CommandButton
TextBox
ListBox
ComboBox
CheckBox
OptionButton
ScrollBar
Image
Ага, вот пошли и отличия:
ToggleButton
TabStrip
SpinButton
MultyPage
Давайте "покопаемся" в них. Для просмотра
некоторых эффектов, расположите на форме
картинку (свойство Picture), лучше фотографию.
Элемент 1 - CommandButton.
Размещаем на форме и устанавливаем свойство
BackStyle = 0 (fmBackStyleTransparent). У Вас были до этого
прозрачные кнопки? Кстати, прозрачность здесь
поддерживается очень хорошо. Зайдите в свойство
Picture и выберите любую иконку - нормальное
отображение "вырезанной" иконки на фоне
прозрачной кнопки. А свойство PicturePosition - говорит
само за себя (расположение иконки на кнопке с
различных сторон от надписи). И еще 2 необычных
для кнопки свойства: AutoSize и WordWrap. Действуют они
абсолютно так же как и для стандартного Label, но в
общем-то эффект неожиданный.
Так же необходимо обратить внимание на события
данного элемента управления. Некоторые
стандартные - отсутствуют, но зато появилась пара
новых: CommandButton1_BeforeDragOver и CommandButton1_BeforeDropOrPaste,
название которых объясняет их работу. Кстати, эти
два события имеются в наличии практически у всех
контролов данной библиотеки.
Элемент 2 - Label.
Чего-то неожиданного ждать от простой надписи не
приходится, и все же: Наличие свойств Picture и
PicturePosition, как и у CommandButton позволяет вставлять
картинку. А свойство SpecialEffect превращает лейбл в
панели с различными видами окантовки (так может
это все-таки Panel, а не Label?).
Элемент 3 - TextBox.
Сразу же обращают на себя внимание два свойства:
AutoSize и WordWrap. Есть ли необходимость в раздвижке
текстового поля по мере ввода в него текста - не
знаю, но свойства такие у него существуют и
работают :)
Свойство TextAlign работает точно так же, как и у
RichTextBox, т.е. текст выравнивается именно так, как
указано в свойстве.
Естественно, присутствует наличие прозрачности
и различных видов рамок (свойства BackStyle и SpecialEffect).
Интересный эффект несет свойство AutoWordSelect. Если
оно установлено в True, то при установке курсора в
середине слова и расширении выделения,
происходит захват выделением всего слова.
И еще одно свойство AutoTab. Так же служит больше для
удобств пользователя, чем программиста. При
значении True, происходит автоматическое
переключение фокуса на следующий элемент
управления при достижении количества символов,
определяемых в свойстве MaxLenght. Образцом
реализации этого свойства служит
инсталляционная программа Windows или Office, в том
месте, где имеются несколько полей, куда надо
вводить серийный номер. После ввода пятой цифры/буквы
происходит самостоятельное перемещение курсора
в следующее текстовое поле.
Добавлены два метода Copy и Cut, соответственно
копирующие или вырезающие выделенный текст в
буфер обмена (Clipboard). В помощь им существует
свойство CanPaste (только для чтения). CanPaste будет True,
если содержимое можно буфера обмена можно
вставить в данный элемент управления. И будет False
- если нельзя (например, картинку в текстовое поле).
Элементы 4 и 5 - CheckBox и OptionButton.
Как и у вышеуказанных элементов поддерживают
свойства прозрачности, окантовки, автоизменения
размеров.
Свойство GroupName позволяет, минуя контейнеры (типа
Frame или PictureBox) объединять данные элементы
управления в различные группы, что особенно
актуально для OptionButton.
NB! В отличие от стандартных ЭУ данные CheckBox и
OptionButton НЕ ПОДДЕРЖИВАЮТ свойство Style. Для этого
используется элемент ToggleButton.
Элемент 6 - ScrollBar.
Чем отличается от стандартного? Тем, что он один,
а не два (VScroll и Hscroll). Но зато имеет свойство
Orientation, где мы можем указать, как его расположить.
Кстати, мы можем заняться его раскраской. За цвет
всего контрола отвечает свойство BackColor, а за цвет
треугольничков на кнопках - ForeColor.
NB! Очередная недоделка Microsoft! Изменение раскраски
на элементе происходит только после изменения
какого-либо другого свойства, или запуска всего
проекта.
Еще два (бесполезных?) свойства. Первое - Delay.
Отражает время в миллисекундах между щелчком на
контроле и началом обработки события. Второе -
ProportionalThumb. Интересуется, как отображать размер
бегунка: пропорционально области прокрутки или
фиксированного размера.
Элемент 7 - Image.
Особых различий по сравнению со стандартным Image,
я не нашел. В этом плане мне более перспективным
представляется Label из этой же библиотеки, который
может еще выводить и надписи.
NB! Смотри NB! к 6 элементу.
Элемент 8 - ListBox.
Что сразу бросается в глаза, так это отсутствие
свойства List в окне свойств. Так что заполнение
списка возможно только программным путем :(
Отсутствует так же свойство Sort, т.е. сортировку
необходимо проводить самому :(
Зато меня откровенно порадовало свойство TextAlign -
это то, что давно не хватало стандартному списку.
Расширено свойство MatchEntry, которое реагирует при
попадании фокуса на список: отыскивает первое
слово по первой введенной букве, слову целиком
или не реагирует вовсе.
Наконец-то реализовано размещение значений в
несколько столбцов. Хотя, на мой взгляд,
несколько заумно. Расположите на форме ListBox и
добавьте следующий код:
Private Sub Form_Load()
With ListBox1
.ColumnCount = 2
.AddItem "Строка 1, Столбец 1"
.List(0, 1) = "Строка 1, Столбец 2"
.List(0, 2) = "Строка 1, Столбец 3"
.AddItem "Строка 2, Столбец 1"
.List(1, 1) = "Строка 2, Столбец 2"
.List(1, 2) = "Строка 2, Столбец 3"
End With
End Sub
Свойство TextColumn, указывает номер столбца,
содержимое которого выводится при вызове
свойства Text.
Элемент 9 - ComboBox.
Если смотреть с позиций предыдущих элементов
управления, то ComboBox представляет собой гибрид
ListBox и TextBox, объединяя в себе все их достоинства,
ну и недостатки то же :)
Наличие таких свойств как TextAlign, ColumnCount, MatchEntry, List
и TextColumn абсолютно соответствует ListBox (см. Элемент
8). А вот наличие свойств (идентичных в работе TextBox
- см. Элемент 3) AutoSize, AutoTab, AutoWordSelect, MaxLenght и даже
BackStyle (прозрачность!) + методы Cut, Copy, Paste придает
определенную изюминку этому контролу. Из
индивидуальных свойств, конечно, надо отметить
ListRows. Немало было сломано копий в различных
форумах и конференциях, как изменить высоту
выпадающей части списка. А здесь все просто:
отдельное свойство, указываешь количество строк
и все. Удобно!
Элемент 10 - "знакомые незнакомцы" - Frame.
Для чего служит Frame в VB? Для двух целей: визуально
выделить часть формы и работать контейнером (чаще
всего для OptionButton). Frame из библиотеки VBA так же
может выполнять эти две функции. Однако на этом
ее возможности не заканчиваются. Frame может
работать и как Image, практически полностью
поддерживая все его свойства и методы. В том
числе и PictureTilling - "размножение" мелких
картинок на все пространство элемента
управления. Плюс свойство KeepScrollBarsVisible -
автоматическое встраивание полос прокрутки для
изображения. Используя еще 4 свойства: ScrollHeight,
ScrollWidth, ScrollTop, ScrollLeft, Вы можете регулировать
расположение этих полос прокрутки.
NB! Объявление ScrollHeight, ScrollWidth в коде ОБЯЗАТЕЛЬНО
должно располагаться перед ScrollTop, ScrollLeft.
Чего не может данный Frame? Удивительно, но он не
может стать прозрачным. Ну не предусмотрели
разработчики такого свойства :(
Ну вот, со стандартными элементами вроде бы
разобрались. Осталось еще 4. Нестандартными их
назвать можно с натяжкой. В том или ином виде они
встречаются в других библиотеках.
Элемент 11 - SpinButton.
Чего-то нового, по сравнению с тем, что было в VB4, я
не нашел. Элемент прост и этим изящен, хотя и
уступает по возможностям UpDown.
Элемент 12 - ToggleButton ("западающая" кнопка).
Суррогатный заменитель всего-навсего одного
свойства у стандартных CheckBox и OptionButton, свойства
Style = 1 (Graphical). В остальном, взял все у стандартной
кнопки из этой библиотеки.
Элементы 13 и 14 - TabStrip и MultiPage.
Идентичные по структуре и выполняемым функциям
два элемента управления. Все различие
заключается в том, что у MultiPage имеются уже
встроенные контейнеры для каждой странички, что
значительно облегчает визуальное построение
приложения.
NB! Для расположения различных элементов на
страницах MultiPage, щелкните на элементе правой
кнопкой мыши и в контекстном меню выберите Edit.
Элемент управления получит другой вид окантовки.
Если теперь щелкнуть правой кнопкой мыши на
ярлыках, то появится возможность добавлять,
удалять и переименовывать ярлыки.
Основные методы работы с MultiPage производятся
через коллекцию Pages и класс Page (подробнее можно
ознакомиться через Object Browser).
Принципы работы с TabStrip можно показать на
следующем примере. Разместите на форме TabStrip и 2
PictureBox: Picture1 и Picture2. Раскрасьте в различные цвета
PictureBox, чтобы легче различать.
Private Sub Form_Load()
Picture1.Move TabStrip1.Left, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
Picture2.Move -20000, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
End Sub
Private Sub TabStrip1_Click(Index As Long)
Select Case TabStrip1.Value
Case 0
Picture1.Move TabStrip1.Left, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
Picture2.Move -20000, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
Case 1
Picture1.Move -20000, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
Picture2.Move TabStrip1.Left, TabStrip1.Top + TabStrip1.Height, _
TabStrip1.Width
End Select
End Sub
На этом, пожалуй, краткий обзор библиотеки FM20.DLL
можно завершить. В задачи этой статьи не входило
подробное изучение каждого контрола, для этого
существует хелп по VBA (FM20.CHM). Но думаю, что
основную задачу я выполнил - навел Вас на
размышления: а так ли уж хороши ЭУ в самом VB? Или
действительно хороши? В заключение немного об
общих недоработках:
1. наверно, надо отметить отсутствие у всех
вышеуказанных контролов свойства hDC - хэндла (идентификатора),
что значительно сокращает использование API-функций,
большинство которых, требуют его.
2. отсутствие ряда контролов, таких как PictureBox, Timer
или группы контролов для работы с файлами.
Лирическое отступление.
Для тех, кто всерьез заинтересуется данной
библиотекой, рекомендую обратить внимание на ряд
классов, никак не отраженных в вышеперечисленных
контролах (DataObject, NewFont, группа классов HTML).
Счастливой охоты!
ОБСУДИТЬ СТАТЬЮ
НА ФОРУМЕ