Урок 2
ActiveX Control, невидимый во время работы
Вставка окна About в разрабатываемый контрол
Ну что ж, продолжим наши уроки. Сегодня мы будем создавать 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 был виден во время разработки приложения и невидим во время выполнения установите в окне Properties его свойство InvisibleAtRuntime равным True.
Запустим API Viewer, откроем файл Win32api.txt. В поле API Type выберем Declares и в появившемся списке найдем 4 функции, необходимые нам. Это: CharToOem, OemToChar, GetACP и GetOEMCP. Скопируем их в приложение в начало, в раздел деклараций.
NB! При копировании API-функций в коды UserControl'а, не забудьте установить опцию Private. Если API-функции копируются, допустим, в отдельный модуль, то они должны быть Public.
Сделаем не изменяемыми размеры нашего контрола:
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 аналогична предыдущей.
NB! В VB6 существует модель объектно-ориентированного метода работы с файлами - FSO (File System Object), которая упрощает работу с файлами последовательного доступа.
Функция проверки на соответствие кодовых таблиц:
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.
Ну как, получилось? Основа в этом контроле заложена, а расширять его свойства, методы и события Вам никто не запрещает.
Полный листинг можно посмотреть здесь.
1999 г