Программирование на Visual Basic

Как создать собственную DLL средствами Visual Basic?

Техника объектно-ориентированного программирования хороша тем, что позволяет многократно и эффективно использовать созданные вами программные компоненты. В этой статье рассказывается, как создавать классы в VB. С помощью классов можно разрабатывать объекты и таким образом извлекать пользу из техники объектно-ориентированного программирования. При работе над большими проектами каждый участник, например, может создавать определенный класс и скомпилировать его в библиотеку ActiveX DLL, тем самым сделав его доступным для использования другими членами команды. Если вам приходилось использовать стандартные элементы управления VB, то вы уже знакомы с классами и объектами. Когда вы помещаете в форму текстовое поле, то в действительности создаете экземпляр класса текстового поля. Если вы поместили в форму пять текстовых полей - это значит, что вы создали пять экземпляров класса текстового поля. Несмотря на то, что эти экземпляры различны, все они создаются по одному шаблону.
Экземпляры класса - это объекты. Каждый класс представляет собой шаблон, по которому создаются объекты определенного типа. Например, класс текстового поля определяет, что текстовое поле имеет свойство Text. Однако само по себе определение класса не содержит никакой информации о значениях свойств. Именно объект, например txtLastName, который вы создаете из этого класса, будет содержать конкретную информацию.
Объектно-ориентированное программирование (ООП) применяется для построения программы из многократно используемых объектов. Как и любой другой вид программирования, ООП начинается со стадии разработки, когда вы определяете объекты и их применение. Чтобы проект можно было считать объектно-ориентированным, объекты должны удовлетворять некоторым требованиям. Фундаментальные концепции ООП можно свести к следующему:
  • Инкапсуляция - или сокрытие информации означает, что объекты скрывают детали своей работы. Например, когда вы используете свойство Text текстового поля, вы не знаете (и не заботитесь) о том, как прорисовываются буквы в текстовом поле. Сокрытие информации позволяет разработчику объекта изменять внутренние принципы его функционирования, не оказывая при этом никакого влияния на пользователя объекта.
  • Наследование. Новый объект можно определить на основе уже существующих объектов, при этом он может содержать те же методы и свойства. Например, вы можете создать новый объект, содержащий все стандартные свойства и методы существующего объекта и несколько дополнительных свойств и методов. От вас требуется всего лишь добавить свои свойства, а существующие будут просто "наследоваться". Строго говоря, Visual Basic не поддерживает наследование.
  • Полиморфизм. Многие объекты могут иметь одноименные методы, которые могут выполнять различные действия в разных объектах. Благодаря полиморфизму, программа выполняет метод, соответствующий текущему объекту. Например, оператор "+" может использоваться как для строковых, так и для целых переменных. Несмотря на то, что в обоих случаях применяется один и тот же символ, VB знает, что он определяет совершенно разные операции.

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

Закончим со скучной теорией и перейдем к более интересной практике.

Чтобы создать ActiveX DLL, вам нужно поместить свой класс в проект типа ActiveX DLL. Проще всего создать проект этого типа, выбрав в диалоговом окне New Project пиктограмму ActiveX DLL. Visual Basic автоматически создаст в новом проекте модуль класса под именем Class1. Переименуйте его в более удобное clsTagInfo. Ниже приводится текст класса, позволяющего считывать и записывать теги ID3v1 файлов формата MP3. Подробнее о MP3 и тегах вы можете почитать здесь.

Option Explicit "объявление переменных
Dim sStr As String * 128 " строка, в которую запишем тег

Dim HasTag As Boolean " флаг наличия или отсутствия тега
Private varFileName As String
" имя файла
Private Type ID3" объявление пользовательского типа, описывающего тег
sTitle As String
* 30 " название песни
sArtist As String * 30 " исполнитель
sAlbum As String * 30 " альбом
sYear As String * 4 " год
sComment As String * 28 " комментарий
sTrack(1) As Byte " номер трека
sGenre As Byte
" жанр
End Type
Dim info As ID3


Private Function Read()" функция, считывающая тег
Dim nFile As Integer
" номер файла
Dim Tag As String * 3
On Error Resume Next
" не останавливать программу при ошибке
nFile = FreeFile" получаем номер свободного файла
Open varFileName For Binary As
nFile " открываем файл varFileName для побайтового доступа под номером nFile
Get nFile, LOF(nFile) - 127, sStr " записываем 127 последних символов файла в переменную sStr
Close nFile " закрываем файл
Tag = Mid(sStr, 1, 3) " ищем метку тега ID3v1
If Tag = "TAG" Then " если метка есть
HasTag = True "
присваиваем флагу Истина
Else
HasTag = False
" если нет метки, то флаг - Фальшь
End If
If HasTag = True Then
" разбиваем тег на отдельные составляющие
info.sTitle = Mid(sStr, 4, 30)
info.sArtist = Mid(sStr, 34, 30)
info.sAlbum = Mid(sStr, 64, 30)
info.sYear = Mid(sStr, 94, 4)
info.sComment = Mid(sStr, 98, 28)
info.sTrack(1) = Asc(Mid(sStr, 127, 1))
info.sGenre = Asc(Mid(sStr, 128, 1))
End If
End Function


Public Function Save() " функция, записывающая в файл новый тег
Dim nFile
info.sTrack(0) = 0
nFile = FreeFile
If HasTag = True Then
" если тег есть
Open varFileName For Binary As nFile " открываем файл
Put nFile, LOF(nFile) - 124, info " записываем тег
Close nFile " закрываем файл
Else "
если тега нет
Open varFileName For Binary As nFile " открываем файл
Put nFile, LOF(nFile) - 127, "TAG" " записываем метку тега
Close nFile " закрываем файл
Call Save " выполняем рекурсию
End If
End Function

" для доступа к классу используем процедуры свойств Property Get и Property Let

Public Property Get Title() As String
Title = Trim(info.sTitle)
End Property

Public Property Let Title(ByVal vNewValue As String)
info.sTitle = vNewValue
End Property

Public Property Get FileName() As String
End Property

Public Property Let FileName(ByVal vNewValue As String)
varFileName = vNewValue
Read
End Property

Public Property Get Artist() As String
Artist = Trim(info.sArtist)
End Property

Public Property Let Artist(ByVal vNewValue As String)
info.sArtist = vNewValue
End Property

Public Property Get Album() As String
Album = Trim(info.sAlbum)
End Property

Public Property Let Album(ByVal vNewValue As String)
info.sAlbum = vNewValue
End Property

Public Property Get Year() As String
Year = Trim(info.sYear)
End Property

Public Property Let Year(ByVal vNewValue As String)
info.sYear = vNewValue
End Property

Public Property Get Comment() As String
Comment = Trim(info.sComment)
End Property

Public Property Let Comment(ByVal vNewValue As String)
info.sComment = vNewValue
End Property

Public Property Get Track() As Variant
Track = info.sTrack(1)
If Track = 0 Then Track = ""
End Property

Public Property Let Track(ByVal vNewValue As Variant)
If Not IsNumeric(vNewValue) Or vNewValue > 255 Then
MsgBox "Введите цифру не больше 255"
Else
info.sTrack(1) = vNewValue
End If
End Property


Public Property Get Genre() As Variant
Genre = info.sGenre
End Property

Public Property Let Genre(ByVal vNewValue As Variant)
info.sGenre = vNewValue
End Property

Скомпилируйте библиотеку, например, TagInfo.dll. Для использования библиотеки в своих проектах, её необходимо зарегистрировать в реестре, например, "regsvr32.exe TagInfo.dll". Также её нужно подключить к текущему проекту с помощью диалогового окна References. Пример использования:

Private Sub Form_Load()

Dim info As clsTagInfo
Set info = New clsTagInfo

info.FileName = "C:/Music/ролл.mp3"
cboGenre.ListIndex = info.genre
txtAlbum.Text = info.Album
txtArtist.Text = info.Artist
txtComment.Text = info.Comment
txtTitle.Text = info.Title
txtTrack.Text = info.Track
txtYear.Text = info.Year
End Sub

Hosted by uCoz