Visual Basic, .NET, ASP, VBScript
 

   
 

Михаил Эскин немало сделал для развития русскоязычных VB сайтов. Многие знают его по статьям про ActiveX на VB сайтах, другие читают статьи Михаила уже на его собственном сайте. Михаил родился в Городском роддоме №1 города Астрахани, в “черную пятницу”, ну, так скажем, почти сорок лет назад. По-прежнему живет на Юге, правда теперь уже Германии, в прекрасном городе Мюнхене.

 
     
   
 

В данной статье я хочу познакомить Вас с библиотекой 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). Счастливой охоты!

 
     

   
   
     
  VBNet рекомендует