| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Как создать свой 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. Ну как, получилось? Основа в этом контроле заложена - а расширять его свойства, методы и события Вам никто не запрещает. Полный листинг можно посмотреть здесь. [Назад][Содержание][Вперед] |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|