|
Часть
1. Основы Visual Basiс
|
||||||
|
Глава
4.
|
||||||
|
ASCII-коды.
Полоса прокрутки ScrollBar.
Цикл For...Next.. |
||||||
| ASCII-коды. |
В этой главе мы попробуем поработать с объектом формы ScrollBar'ом. А попутно будем знакомится с новыми операторами и прочей фигней. Все рассмотрим на примере программы Reader. Объясняю смысл. Мы в текстовое поле Text1 будем записывать различные символы (буковки, циферки и может даже значки), а наша программа будет брать их по одному и представлять в виде ASCII-кода. В этой программке мы заодно разберем и цикл For..Next.
Что такое ASCII-код? Как известно, компьтер буковок-то и не различает. А чтобы он отличал А от Б, каждому символу присваивается свой ASCII-код. Например строчная латинская буква a имеет код 97, а заглавная латинская А - 65. Всего кодов 255: с 0 по 31 - это управляющие коды, такие, как табуляция, возврат каретки и т.п.; с 32 по 127 -это символу буковок, циферек и знаков и всяких знаков препинания; с 128 по 255 - это символы псевдографики, иностранные алфавиты (расширенная таблица символов). И вот когда мы шлепаем по клавиатуре, она, т.е. клава, и генерирует ASCII-код того, что нарисовано на кнопках.
Чтобы
узнать конкретный ASCII-код имеющегося у нас символа, используется функция
Asc ("символ")
А, чтобы наоборот,
узнать, какой символ соответствует конкретному коду, есть обратная функция
Chr (номер кода)
Эту теоретическую
байду должен знать каждый уважающий себя пацан.
| Полоса прокрутки ScrollBar. |
Если ты обратил внимание, почти любая программа под Windows имеет такие ползунки, позволяющие пользователю перемешаться по данным вверх-вниз или влево-вправо. Есть они и у нас. Называется этот объект полоса прокрутки ScrollBar. Сам объект получает имя по умолчанию VScroll1, если это вертикальный ползунок, или HScroll1, если - горизонтальный. Свойства и события у обоих одинаковые, поэтому, чтобы не раздувать код, используем один СкроллБар - вертикальный. Я использую в основном его.
Итак, основные рабочие свойства ScrollBar это:
.Value - это главное значение, оно меняется, когда мы двигаем ползунок ScrollBar' а.
.Max - задает максимальное значение, до какого будет менятся значение .Value. Главный недостаток этого объекта в том, что значение .Max, а стало быть и .Value не моджет превышать 32767. Это всегда надо учитывать при работе с этим объектом.
.Min - задает минимальное значение .Value. Здесь тоже ограничения до -32768.
.SmallChange - задает, насколько меняется .Value, если мы кликаем мышью по стрелочкам вверху или внизу объекта ScrollBar
.LargeChange - задает, насколько меняется .Value, если мы кликаем мышью по полю скроллбара, а не по стрелочке. т.е. соответствует, как-бы листанию страниц.
Чтобы реально посмотреть, как работает этот объект, создадим новый проект и положим на форму Text1 и VScroll1. Затем дважды щелкнем мышью по объекту VScroll1. У нас откроется окно кода и создастся процедура VScroll1_Change().
Впишем в нее такую строчку кода: Text1.Text = VScroll1.Value и запустим программу. Как только мы начинаем двигать ползунок, в текстовом поле отражается значение VScroll1.Value от 0 до 32767 (поскольку мы ничего не задали иначе.
Остановим программу и создадим процедуру Form_Load(), выбрав в верхнем левом окне кода значение Form и щелкнув по нему. Впишем в эту процедуру значения свойств, о которых мы только-что говорили. Должно получиться следующее:
Option Explicit
Private Sub Form_Load()
VScroll1.Value = 0
VScroll1.Max = 32767
VScroll1.Min = -32768
VScroll1.LargeChange = 100
VScroll1.SmallChange = 1
End Sub
Private Sub VScroll1_Change()
Text1.Text = VScroll1.Value
End Sub
А чтобы ползунок не мигал так противно, поставим в окне свойств VScroll1 свойство TabStop в значение False. Запустим программу. Значение .Value мы задали 0, а поскольку интервал у нас от 32767 до -32768, то ползунок стоит посередине. При щелканьи мыши по стелочкам вверху и внизу, значение .Value изменяется на 1, а при щелканьи по полю VScroll1 - на 100. Рис. 8 должен помочь тебе во всем разобраться.

Рисунок 8.
После того, как мы разобрались, как в принципе работает ScrollBar, применим наши знания на практике. Мы нашу учебную заготовку переделаем в программку для определения ASCII-кодов.
Добавим на форму текстовые поля (Text2 и Text3). Сделаем их небольшими прямоугольниками и расположим их в ряд под большим полем Text1, которое у нас уже есть. Щелкнем по нему правой кнопкой мыши и в меню выберем "Копировать", потом щелкнем правой кнопкой по форме и в выпавшем меню выберем "Вставить". Появится меню запроса, создавать ли control array (Рис 9).

Рисунок 9
Если мы выберем НЕТ, то на форму просто скопируется новое текстовое поле Text4. Мы же выберем Да. Тогда у нас создастся группа текстовых полей под названием Text2. Имена у них будут Text2(0), Text2(1) и т.д. Повторим эту операцию еще три раза с тем, чтобы у нас получилось пять полей Text2 (от 0 до 4) и расположим их столбиком. Тоже сделаем с объектом Text3. В Textы2 у нас будут выводится символы из Text1 по отдельности, а в Textы3 - значения ASCII-кода. Еще добавим кнопку Command1. Выглядеть это должно примерно следующим образом (Рис.10):

Рисунок 10.
А теперь спрашивается, нафига мы выбрали создание Control array? А именно из-за этих циферек в скобочках. Все пять TextBox'ов представляют собой как-бы один объект (массив текстбоксов). И мы можем перебирать все его элементы по номеру в скобках. Это свойство и называется оно .Index. Кроме того, чтобы результы работы нашей программы выглядели более привлекательно, в окне свойств всех элементов Text2 и Text3 (их можно выделить все разом) кликните на свойство Font и в окне "Выбор шрифтов" выберем начертание - полужирное, а размер - 14. Кроме того, чтобы выставить наши данные по центру, свойство Alignment поставим 2- центровка. Ну и уж, чтобы не выводились дурацкие надписи Text2 и Text3 сотрем свойство Text (это уж по одному надо делать). Для кнопки Command1 в окне свойств в свойстве Caption напишем слово КОД.
Теперь пропишем в процедуре Form_Load() следующее:
Form1.Caption
= "ACSII-reader"
Text1.Text = "Сюда можно ввести всякие буковки и циферки , Fuck их!"
Первая строка определяет название нашей формы, а вторая заполняет Text1 каким-нибудь текстом. Чтобы текст переносился по строкам, нужно в окне свойств Text1 свойство MultiLine поставить в состояние True. Кроме того сюда же добавим полосу прокрутки (свойство ScrollBars в 2 - вертикаль).
| Цикл For ... Next. |
Теперя вот что. Далее мы будем использовать цикл For ... Next. Это очень важная и удобная вещь. И используется почти в каждой программе. Выглядит он так:
For переменная=число To другое число Step Шаг
Всякие операторы
Next переменная
Здесь переменная - это числовая, обязательно объявленная оператором Dim переменная, число - любое число с которого начинается цикл, но может быть и переменной, другое число - это число, которым цикл заканчивается, Шаг - это на сколько за один цикл изменяется переменная. Если не ставить, то по умолчанию Step принимается за единицу. Всякие операторы - это любой программный код, который ты вставишь. Он будет выполняться каждый цикл. Например такой цикл
For
x=0 To 10 Step 2
Text1. Text = Text1.Text &" " & "x"
Next x
добавляет изменяющееся значение x в Text1. Цикл сработает шесть раз, в первый проход x примет значение 0, и в Text1 запишется 0, во второй переменная x примет значение 2 (0+Step), в третий 4 и т.д. В Text1 выведется
0 2 4 6 8 10
Далее в разделе (General) руками, т.е. с помощью кнопок на клавиатуре, запишем объявление необходимых нам переменных, собственной одной:
Option Explicit
Dim ZnachenieScroll As Long
'сюда будет считываться значение
'Vscroll1.Value,
' которое будет изменяться всякий раз при изменении положения ползунка
Значения
переменной будут доступны всем процедурам нашей формы.
В процедуре Form_Load()
изменим операторы и свойства, чтобы получилось следующее:
Private Sub
Form_Load()
VScroll1.Value = 1
VScroll1.Min = 1
VScroll1.LargeChange = 5
VScroll1.SmallChange = 1
Form1.Caption = "ACSII-reader" '
это заголовок нашей формы(вместо Form1)
Text1.Text = "Сюда можно ввести всякие буковки и циферки , Fuck их!"
' этот текст вводится автоматом в Text1
ShowKod ' это имя нашей процедуры, которую мы создадим
ниже
End Sub
В теле процедуры уберем нашу тестовую строчку и напишем две новые:
Private Sub
VScroll1_Change()
ZnachenieScroll = VScroll1.Value
Записываем
текущее значение VSvroll1 в переменную.
Можно было обойтись и без нее, но я хотел проллюстрировать различное объявление
переменных.
ShowKod ' это опять тоже имя нашей процедуры, которую
мы создадим ниже
End Sub
Теперь, мы создадим следующую собственную процедуру ShowKod() имя которой мы уже использовали в процедурах Form_Load() и VScroll1_Change(). Разберем ее подробно:
Private Sub
ShowKod()
Dim X As
Long
Обратите
внимание, что здесь мы переменную объявляем локально, внутри процедуры, для
организации цикла. Ее значение будет недоступно в других процедурах нашей формы.
Далее
мы определяем, сколько символов записано в Text1. Делается это с помощью функции
Len(). Затем присваиваем это значение свойству .Max, т.е. наш ползунок
не будет давать значение .Value больше, чем количество символов.
VScroll1.Max = Len(Text1.Text)
Теперь,
для того, чтобы выводить наши значения по 5, используем цикл For...Next. Начальное
значение цикла принимаем за значение VScroll1.Value, а конечное на 4 больше.
Таким образом, если наш ползунок имеет положение, например, 4, то в цикле мы
будем считывать символы из Text1 4, 5, 6, 7 и 8.
For X = ZnachenieScroll
To ZnachenieScroll + 4
Затем,
с помощью функции Mid (в ней три аргумента: 1- текст, откуда считываем, 2 -
с какого знака, считая слева начинаем считывание и наконец 3 - сколько знаков
считываем), мы считываем по одному пять знаков (потому что цикл будет работать
пять раз). Но переменную Х мы не можем использовать как есть для определения,
в какой из пяти Text2 записать полученный символ. Ведь при значении ползунка,
например 5, потребуется объект Text2(5), а у нас его нету, только с 0 до 4.
Возникнет ошибка и программа аварийно прервется. Поэтому мы из значения X вычитаем
значение ползунка. Тогда мы всегда вложимся в зону 0-4. Подумай, как это происходит.
Text2(X - ZnachenieScroll).Text = Mid(Text1.Text, X, 1)
Если
ты подумал и не понял как, поясняю подробнее. Значение переменной ZnachenieScroll
может быть любое в пределах, нами заданных, т.е. от 1 до Len(Text1.Text)
(до длины нашей строки). Нам же нужно, чтобы из этих значений у нас получались
числа (0,1,2,3,4), соответствующие существующим индексам Text2(X) - от 0 до
4: Text2(0).Text, Text2(1).Text, Text2(2).Text, Text2(3).Text и Text2(4).Text.
Если мы это не учтем, то при первом же срабатывании цикла возникнет проблема,
значение X у нас будет принимать значение 1, 2, 3, 4, 5. Но Text2(5).Text как
я гововорил, не существует. При нашем же способе решения, при первом проходе
ZnachenieScroll
=1. Таким образом значения X
будут от 1 до 5. А наш индекс получит следующие значения:
X - ZnachenieScroll=1-1=0
(X в цикле принимает значение 1)
X - ZnachenieScroll=2-1=1
(X в цикле
принимает значение 2)
X - ZnachenieScroll=3-1=2
(X в цикле
принимает значение 3)
X - ZnachenieScroll=4-1=3
(X в цикле
принимает значение 4)
X - ZnachenieScroll=5-1=4
(X в цикле принимает значение 5) , т.е. мы укладываемся в наш интервал.
При сдвиге ползунка на один, ZnachenieScroll
станет равным 2. Значения X
будут от 2 до 6. Но все равно мы из него его же и вычитаем, т.е. результат не
изменится. А наш индекс получит следующие значения:
X - ZnachenieScroll=2-2=0
(X в цикле принимает значение 2)
X - ZnachenieScroll=3-2=1
(X в цикле
принимает значение 3)
X - ZnachenieScroll=4-2=2
(X в цикле
принимает значение 4)
X - ZnachenieScroll=5-2=3
(X в цикле
принимает значение 5)
X - ZnachenieScroll=6-2=4
(X в цикле принимает значение 6) , т.е. мы снова укладываемся в наш интервал.
Может продолжить эту аналогию, сколько хочешь, так будет всегда.
Ну и теперь полученное значение в Text2(X-ZnachenieScroll) мы с помощью функци
Asc() преврашаем в ASCII-код. Единственое но. Используя оператор If
(без него никуда) и все той же функции Len() проверяем не пустое ли значение
в Text2, т.е. не равна ли длина строки нулю, а то опять возникнет ошибка. Если
длина строки - ноль, тогда мы в Text3 вписываем пустое значение (можно что угодно).
If Len(Text2(X - ZnachenieScroll).Text) > 0
Then
Text3(X - ZnachenieScroll).Text = Asc(Text2(X - ZnachenieScroll).Text)
Else
Text3(X - ZnachenieScroll).Text = ""
End If
Все.
конец цикла.
Next X
End Sub
Да, чтобы мы могли вписать любой свой текст и запустить программу по-новой, напишем коротенький код для кнопки Command1.
Private Sub
Command1_Click()
ShowKod
End Sub
В принципе, все предельно просто. Исходник кода можно скачать вначале страницы. Следующую главу посвятим прибамбахам на форме - вставка иконки программы, изменение курсора и прочей ерунде.
|
|
Copyright
|