Программирование для карманных компьютеров
Шрифт:
13. Теперь этот листинг надо детально рассмотреть. В качестве ссылок будут использоваться номера комментариев в тексте.
1) Объявляется переменная типа MenuBarMenu. Переменная одна, значит, на панели команд устройства будет один пункт меню.
2) Объявляются переменные типа MenuBarButton. Переменных этого типа четыре, значит, на панели команд устройства будет четыре кнопки.
3) Создается объект типа MenuBarMenu как элемент коллекции. При создании ему присваивается уникальный идентификатор mnuFile, задаем надпись, которая будет отображаться на кнопке меню, и этот объект связывается с переменной mnuFile.
4) Поскольку пункт меню может содержать в себе команды, коллекция команд содержится в свойстве Items. Она может быть пополнена при помощи вызова метода Add, что и происходит в этом фрагменте кода. Добавляются команды меню Файл и Редактирования шрифта. В качестве аргументов метода Add выступает индекс добавляемого элемента (1), уникальный ключ (itFont) и надпись, которая будет выведена в пункт меню – Редактированиешрифта. То, к какой именно команде меню относятся данные действия, определяется индексом, который указывается в скобках после свойства Item.
5) Каждая команда пункта меню может содержать вложенные меню.
6) К подменю Размер добавляются три вложенных подменю – 8, 10 и 12. Подменю 8 помечается звездочкой, чтобы указать текущее значение размера шрифта.
7) Следующая команда меню не имеет ни ключа, ни надписи, потому что во второй строке этого фрагмента кода для нее устанавливается стиль разделителя, и она просто будет отображать горизонтальную полосу в списке команд меню.
8) Добавляется команда Открыть.
9) Добавляется разделитель.
10) Добавляется команда Завершить работу.
11) Добавляется очередная кнопка. Для нее устанавливается стиль разделителя (mbrSeparator). Это значит, что на панели команд эта кнопка будет отображена в виде вертикальной черты.
12) Добавляются еще три кнопки. Для всех трех кнопок задается стиль mbrButtonGroup. Этот стиль объединит кнопки в зависимую группу, и пользователь сможет нажимать только одну кнопку из группы.
13) Работа с меню временно завершена. Теперь нужно установить положение фрейма на форме и очистить список.
14. Еще один фрагмент кода свяжет зависимые кнопки с процедурой установки фонового цвета в приложении. Этот код приведен в листинге 3.14.
Листинг 3.14Private Sub MenuBar1_ButtonClick(ByVal Button As MenuBarLib.MenuBarButton)
Select Case Button.Key
Case "1"
Label1.BackColor = &H80000005
Label2.BackColor = &H80000005
Label3.BackColor = &H80000005
List1.BackColor = &H80000005
Case "2"
Label1.BackColor = &HC0FFFF
Label2.BackColor = &HC0FFFF
Label3.BackColor = &HC0FFFF
List1.BackColor = &HC0FFFF
Case "3"
Label1.BackColor = &HC0FFC0
Label2.BackColor = &HC0FFC0
Label3.BackColor = &HC0FFC0
List1.BackColor = &HC0FFC0
End Select
End SubВ обработчик события ButtonClick передается копия объектной переменной Button, по ключу которой (Button.Key) можно понять, на какой кнопке был произведен щелчок. Далее в операторе выбора Select выбирается действие для соответствующей кнопки. В приведенном коде устанавливается фоновый цвет для компонентов, содержащих текст.
15. Еще один фрагмент кода, завершающий работу приложения при выборе команды меню Завершить работу, приведен в листинге 3.15.
Листинг 3.15Private Sub MenuBar1_MenuClick(ByVal Menu As MenuBarLib.MenuBarMenu)
Select Case Menu.Key
Case «itExit»
App.End
End Select
End SubВ этом случае на одно событие MenuClick устанавливается оператор выбора Select (к концу работы над проектом он будет достаточно объемным) и по ключу производится выбор выполняемой команды.
16. Нужно снова запустить приложение и проверить работу созданного меню. Нажатие на кнопки должно приводить к изменению цвета в соответствующих компонентах, выбор пункта меню Завершить работу должен приводить к завершению работы приложения. Результат должен выглядеть так, как показано на рис. 3.29.
17. Теперь нужно добавить к проекту еще один компонент ActiveX с наименованием Microsoft CE Image List Control. Его следует разместить на форме. Как и компонент MenuBar, компонент ImageList надо инициализировать и использовать программно, так как визуальных настроек у него нет.
18. Прежде чем настраивать ImageList, надо подготовить для него изображения. Для этого нужно в любом графическом редакторе создать три рисунка. Это должны быть рисунки размером 16x16, 256 цветов, с именами white.bmp, yellow.bmp и green.bmp. В центре первого рисунка будет незакрашенный квадрат 14x14 пикселов, в центре второго – квадрат, закрашенный желтым цветом. Третий рисунок должен содержать квадрат с зеленой заливкой.
19. Эти рисунки нужно поместить в каталог проекта и добавить их в проект командой Project ? Add File. В окне, которое будет выведено на экран, нужно выбрать тип файлов All Files (*.*), взвести флажок Add As Related Document, выбрать нужный файл и нажать кнопку ОК. Эту последовательность действий нужно выполнить для каждого рисунка. Добавление файлов к проекту позволит среде автоматически копировать их на устройство и включать в состав поставочного комплекта. После того как файлы будут добавлены к проекту, окно структуры проекта должно выглядеть, как на рис. 3.30.
20. Теперь можно добавить изображения к компоненту ImageList. Для этого в начало метода Form_Load нужно добавить код, приведенный в листинге 3.16. Листинг 3.16
Dim imLst As ImageList
Set imLst = ImageList1
imLst.Add «\Windows\Start Menu\white.bmp»
imLst.Add «\Windows\Start Menu\yellow.bmp»
imLst.Add «\Windows\Start Menu\green.bmp»
MenuBar1.ImageList = imLst.hImageListВ этом коде создается объектная переменная типа ImageList. Она связывается с компонентом ImageList1, после чего к коллекции рисунков добавляются созданные ранее изображения. Затем остается лишь связать коллекцию рисунков с компонентом MenuBar1. Должен быть указан полный путь к добавляемому рисунку от корневого каталога устройства. Поскольку для проекта в настройках его свойств был задан путь \Windows\Start Menu\, то для изображений нужно добавить этот путь в виде префикса к имени файла.
21. В тех фрагментах кода, где устанавливалось свойство Caption для кнопок, нужно закомментировать строки установки Caption и вместо них ввести команды присвоения изображений. Поскольку сам ImageList с компонентом MenuBar
Rem mnuClr1.Caption = «1»
mnuClr1.Image = 1
…
Rem mnuClr2.Caption = «2»
mnuClr2.Image = 2
…
Rem mnuClr3.Caption = «3»
mnuClr3.Image = 322. Теперь можно запустить проект и удостовериться, что изображения выведены на поверхность кнопок.
23. Также программа должна взять текстовый файл, считать из него фразу на русском языке и вывести в верхнее текстовое поле, считать соответствующую ей английскую фразу и вывести ее в нижнее текстовое поле, находящееся на заднем плане, а затем в случайном порядке считать английские слова в количестве в три раза большем, чем надо для составления фразы, и заполнить ими список ListBox.
24. Прежде всего нужно создать текстовый файл. Достаточно в Блокноте открыть текстовый файл, назвать его phrase.txt и сохранить в каталоге проекта. Содержимое файла приведено в листинге 3.18.
Листинг 3.18Kak dela
Vsego horoshego
Do vstrechi
how are you
good luck
see you later25. Этот файл нужно добавить к проекту, как это было сделано с файлами рисунков. Русские фразы написаны транслитерацией, поскольку эмулятор не русифицирован. В случае запуска данной программы на корректно русифицированном Pocket PC 2003 русские фразы можно писать кириллицей.
26. Чтобы загрузить файл, нам понадобятся еще две ActiveX библиотеки – File System и Common Dialog. Их нужно добавить в проект, а затем разместить на форме. Библиотека File System при добавлении к проекту создает компоненты File и FileSystem. Компонент FileSystem дает возможность осуществлять манипуляции с файлами и каталогами, такие как создание, удаление, переименование, перемещение, изменение атрибутов. В нашем приложении этот компонент не потребуется, на форме надо разместить только компонент File, который позволяет открыть файл, читать из него и записывать информацию в файл.
27. После размещения этих компонентов на форме нужно добавить объявления переменных в начало модуля, как это показано в листинге 3.19.
Листинг 3.19Option Explicit
Dim intText, intInt, intStep, intCount As Integer
Dim varText, varEnText
Dim varStrng As String
Rem Объявляем переменную и связываем ее с объектом File
Dim flFile As File
Set flFile = File1
Rem Объявляем переменную и связываем ее с объектом диалога
Dim fdOpen As CommonDialog
Set fdOpen = CommonDialog128. Теперь необходимо создать обработчик события щелчка на пункте меню Открыть. Для этого в уже имеющийся обработчик события Private Sub MenuBar1_ MenuClick нужно добавить еще одну секцию Case. Код будет выглядеть так, как показано в листинге 3.20. Листинг 3.20
Private Sub MenuBar1_MenuClick(ByVal Menu As MenuBarLib.MenuBarMenu)
Select Case Menu.Key
Case «itExit»
App.End
Case «itOpen»
Rem 1
fdOpen.ShowOpen
Rem 2
If fdOpen.FileName <> "" Then
Rem 3
flFile.Open fdOpen.FileName, fsModeInput, 1
Rem 4
intText = 0
While Not flFile.EOF
intText = intText + 1
flFile.LineInputString
Wend
Rem 5
flFile.Close
flFile.Open fdOpen.FileName, fsModeInput, 1
Rem 6
For intCount = 1 To intText
varText = flFile.LineInputString
If intCount > intText/2 Then varEnText=varEnText +" "+varText
Next
intStep = 1
flFile.Close
Rem 7
flFile.Open fdOpen.FileName, fsModeInput, 1
For intCount = 1 To intText
varText = flFile.LineInputString
If intCount = intStep Then Label1.Caption = varText
If intCount = intStep+intText/2 Then Label2.Caption=varText
Next
Rem 8
intStep = 2
flFile.Close
Dim strAr
Dim strSt As StringRem 9
varEnText = Trim(varEnText)
Rem 10
strAr = Split(varEnText, " ", – 1, vbTextCompare)
Rem 11
intInt = 10000
For intCount = 0 To intInt
On Error Resume Next
List1.AddItem strAr(intCount)
If Err.Number Then
Err.Clear: Exit For
End If
Next
Rem 12
Dim intCount2 As Integer
For intCount = 1 To List1.ListCount
For intCount2 = intCount + 1 To List1.ListCount
If (StrComp(List1.List(intCount), List1.List(intCount2), vbTextCompare) = 0)
Then
List1.RemoveItem (intCount2): intCount2=intCount2-1
End If
Next
Next
End If
End Select
End Sub
Будут рассмотрены те блоки кода, где установлены комментарии.
1) На экран выводится диалог открытия файла.
2) Если диалог открытия файла вернул имя файла, то происходит переход к блоку 3.
3) Открывается файл с переданным именем при помощи объекта File.
4) Инициализируется переменная intText, и в нее считывается количество строк в файле.
5) После прохождения файла до конца при помощи функции LineInputString его необходимо открыть заново.
6) Считывается «английская» часть файла одной строкой в переменную varEnText.
7) Первая русская фраза выводится в текстовое поле Label1, а соответствующая ей английская фраза – в текстовое поле Label2.
8) Счетчик фраз увеличивает свое значение.
9) Пробелы справа и слева удаляются.
10) Строка varEnText разбивается на слова, которые помещаются в массив strAr. Массив динамический, поэтому нельзя сразу сказать, сколько в нем элементов.
11) Значение intInt предполагает, что в массиве не более 10 000 элементов. Каждый элемент массива заносится в список List1 до тех пор, пока не будет достигнут конец массива. Следующий шаг вызывает исключительную ситуацию, которая перехватывается при помощи блока On Error Resume Next. Проверка значения Err.Number позволяет определить наличие исключительной ситуации, вызов Err.Clear очищает флаг ошибки, а оператор Exit For завершает цикл.
12) В последнем блоке кода из списка удаляются все повторяющиеся слова.
29. На этом этапе программа уже выводит на экран русскую фразу и список английских слов. Осталось написать обработчики для работы с кнопками.
30. Щелчок стилусом на слове в списке добавляет это слово к предложению, составляемому в поле Label3. Соответствующий код приведен в листинге 3.21.
Листинг 3.21Private Sub List1_Click
varStrng = Label3.Caption
Label3.Caption = Label3.Caption + List1.List(List1.ListIndex) + " "
End Sub