InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Как создать свой ActiveX Control - 2


Михаил Эскин 


В предыдущей статье я показал Вам, как создать ActiveX Control. Наверно самым большим моим упущением было то, что я не сказал, что данный пример - учебный. Т.е. был создан функционирующий OCX, однако он был где-то неполноценен, не хватало некоторых свойств и методов. Статья подразумевала дать основы, заинтересовать в написании мини-программ, коими и являются ActiveX Control'ы и, возможно, заставить читателя добавить и расширить свойства, методы и события данного приложения.

Ну что ж, продолжим наши уроки. Сегодня мы будем создавать ActiveX Control невидимый во время работы программы (типа таймера). Будет он нести в себе только 2 функции (ConvertToDOS и ConvertToWin), позволяющие преобразовывать файлы из DOS-кодировки в Windows'кую и наоборот.

Не буду повторяться как надо создать приложение, я думаю Вы этому уже научились : ) . Перейдем сразу к делу: Назовем проект prjConverter, а сам контрол DosWin. В Project Description запишем "Конвертер кодировочных таблиц DOS-Windows". Разместим на ActiveX Control'е Image с координатами 0, 0 и поместим в него bmp-ешку с размерами 32 х 32 пиксела. Рисунок на Ваше усмотрение. Хорошим тоном считается если в свойство Toolbox Bitmap Вы поместите такой же рисунок но с форматом 16 х 15 пиксел.

Чтобы ActiveX Control был виден во время разработки приложения и невидим во время выполнения установите его свойство InvisibleAtRuntime равным True.

Запустим API Viewer, откроем файл Win32api.txt. В поле API Type выберем Declares и в появившемся списке найдем 4 функции, необходимые нам. Это: CharToOem, OemToChar, GetACP и GetOEMCP. Скопируем их в приложение.

Сделаем не изменяемыми размеры нашего контрола:

Private Sub UserControl_Resize()

UserControl.Size Image1.Width, Image1.Height

End Sub

NB! функция Size работает только с твипами

Теперь создадим 3 функции - 2 основные через которые мы будем обращаться (они, естественно, будут Public) и одну для внутренней проверки (эта - Private).

' функция конвертации из Win в DOS

Public Sub ConvertToDOS(PathStartingFile As String, PathConvertedFile As String)

'файл должен быть не более 32 кб

Dim InputStr$, OutputStr$, NewFile$

Dim Code&

' проверка на соответствие кодировочных таблиц

If Verification = True Then Exit Sub

On Error GoTo ErrDOSWin

'считываем и конвертируем

Open PathStartingFile For Input As #1

Do While Not EOF(1)

' считываем строку файла

Line Input #1, InputStr

'необходимо создать вначале пустую строку

OutputStr = Space$(Len(InputStr))

' кодируем и записываем значение в переменную OutputStr

Code = CharToOem(InputStr, OutputStr)

NewFile = NewFile & OutputStr & vbCrLf

Loop

Close #1

'а теперь записываем в новый файл

Dim F%

F = FreeFile

Open PathConvertedFile For Output As #F

Write #F, NewFile

Close #F

Exit Sub

' при наличии ошибки выводим ее номер и описание

ErrDOSWin:

MsgBox "<" & Err.Number & "> - " & Err.Description

End Sub

' функция конвертации из DOS в Win

' все делается аналогично предыдущей функции

Public Sub ConvertToWin(PathStartingFile As String, PathConvertedFile As String)

'файл должен быть не более 32 кб

Dim InputStr$, OutputStr$, NewFile$

Dim Code&

If Verification = True Then Exit Sub

On Error GoTo ErrWinDOS

Open PathStartingFile For Input As #1

Do While Not EOF(1)

Line Input #1, InputStr

OutputStr = Space$(Len(InputStr))

Code = OemToChar(InputStr, OutputStr)

NewFile = NewFile & OutputStr & vbCrLf

Loop

Close #1

Dim F%

F = FreeFile

Open PathConvertedFile For Output As #F

Write #F, NewFile

Close #F

Exit Sub

 

ErrWinDOS:

MsgBox "<" & Err.Number & "> - " & Err.Description

End Sub

 

'функция проверки на соответствие кодовых таблиц

Private Function Verification() As Boolean

Dim OemCP&, AnsiCP&

OemCP = GetOEMCP

AnsiCP = GetACP

If OemCP <> 866 Or AnsiCP <> 1251 Then

MsgBox "Несоответствие кодовых таблиц", vbExclamation + vbOKOnly, "Ошибка!"

Verification = True

Exit Function

End If

Verification = False

End Function

Вот собственно говоря и все, контрол - готов. Однако, все в этом мире склонно к развитию, склероз тоже : ) . Поэтому сделаем комментарии для себя и "того парня", который будет пользоваться Вашим контролом. Откроем окно с контролом (иначе меню будет заблокировано), а затем выберем меню Tools/Procedure Attributes… Выберем в поле Name - ConvertToDos, а в поле Description впишем: "Конвертирует файлы, записанные в кодовой таблице Windows, в кодовую таблицу DOS", затем выбираем ConvertToWin и записываем ему "Конвертирует файлы, записанные в кодовой таблице DOS, в кодовую таблицу Windows". Теперь эти комментарии станут доступны через Object Browser, а для свойств также и в нижней части окна свойств при его выборе.

"Страна должна помнить своих героев". Давайте добавим в окно свойств строку (About), по щелчку на котором выходит информация о создателе приложения и о самом приложении. Выберем меню Project/Add Form … В открывшемся окне щелкнем на About Dialog (в дальнейшем Вы будете делать свои окна About, а в даннойситуации мы просто упрощаем пример создания контрола). Вернемся в UserControl и запишем:

Public Sub About()

frmAbout.Show vbModal

End Sub

В Tools/Procedure Attributes… в поле Name выбираем метод About, нажимаем кнопку Advanced и в поле Procedure ID выберем опцию AboutBox.

Для проверки работоспособности нашего контрола создадим еще один проект Standart EXE. В окне проектов щелкнем на нем правой клавишей мыши и выберем меню Set us Start Up. Назовем проект prjTest, а форму frmTest. Размещаем наш контрол DosWin на форме: местоположение несущественно - он ведь невидим во время работы : ) . Обратите внимание на окно свойств для него - их там минимум. Добавим кнопку. В события кнопки вписываем:

' преобразование файла из DOS'овской кодировки в Window'скую

Private Sub Command1_Click()

' здесь для облегчения поиска файла можно подключить CommonDialog

DosWin1.ConvertToWin "C:\...", "C:\..." ' пути, естественно, укажете свои

MsgBox "Готово!"

End Sub

Eсли в окне свойств мы выберем (About), то появится наше окно frmAbout.

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

Полный листинг можно посмотреть здесь.

[Назад][Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua