Часть
1. Основы Visual Basiс
|
||||||
21.10.2004 | ||||||
Глава
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
|