Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект VB.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать

Integer ‘целое число со знаком от –32 768 до 32767

String ‘строка символов

Boolean ‘логическое, принимает два значения или “True” (Истина) или “False” (Ложь)

Пока что нам этого хватит. Если интересно, то перечень типов данных, поддерживаемые VB, можно посмотреть здесь.

Теперь, где и как их объявлять. Если ты объявишь переменную в теле процедуры объекта, например кнопки, то доступна она будет только в этой процедуре. В другой, скажем, кнопке, ее использовать нельзя. Чтобы переменную использовать во всей форме, надо объявить ее в разделе деклараций (это в самом верху кода – (General) – (Declarations). Для этих случаев можно использовать инструкцию Dim. Ну, а чтоб она была доступна во всей программе (в разных, например, формах) она должна быть объявлена в стандартном модуле с ключевым словом Public. Но модулей мы пока не создавали и оставим это до поры в стороне. Ну вот, на первое время этого о переменных хватит. Чтобы было совсем понятно, вот пример объявления переменных:

Option Explicit

Dim MyStream As String Dim K14 As Long Dim Flag As Boolean Dim Numder As Integer

Private Sub Form_Load() Dim Flag2 As Boolean Dim m99little As String End Sub

Таймер. Программа “Часики”.

Теперь разберем использование нового объекта - Timer (таймера). Слева, где компоненты формы, они же инструменты-элементы, нарисован такой будильничек. Это таймер и есть. Он всегда невидимый, но нужный элемент. Всего их одновременно можно использовать около 30 штук. Но нам такое количество таймеров не надо.  Создадим новый exe-проект и поместим один таймер на форму. На основе его мы сделаем сейчас маленькие часики. В свойствах этого таймера поставьте следующие установки:

Enabled – False (по умолчанию True) означает, что таймер выключен

Interval – 1000 (время, в миллисекундах, через которое таймер срабатывает, если конечно включен). Таймер будет срабатывать каждые 1000 мск, т.Е. Каждую секунду, как в нормальных часах.

Кроме того, нам понадобятся три лейбла: Label1 для секунд, Label2 для минут и Label3 – сами догадайтесь для чего. Правильно, для часов. Все.

Изменим свойства лейблов следующим образом:

Alignment – 2-Центровка (Это чтоб цифры были по центру лейблов) BorderStyle – 1-Фиксировано (это чтоб размер формы нельзя было изменить) Caption – 00 (на всякий случай, т.е. значение лейблов изначально будет “00”) Нажми Font и выбери размер шрифта 14, а начертание – полужирное. После этого подбери подходящий размер окон Лейблов, чтобы цифры в них выглядели симпатично.

Должно получиться как на рис.8.

Рисунок 8.

Создадим процедуру Form_Load .

Option Explicit

Private Sub Form1_Load()

Затем в теле процедуры, как у всякой приличной программы, меняем заголовок формы.

Form1.Caption = "Часики"

Дальше, для того, чтобы наши часы сразу показывали текущее время, надо его взять из компьютера. Чтобы получить системное время, есть функция Time (Label1.Caption=Time). Но она дает полное время одной строкой (16:23:42). Нам тогда придется выбирать из нее секунды, минуты и часы, чтобы распихать по свои лейблам. А чтобы этого не делать, можно взять готовые функции, которые предоставят нам это все по частям:

Label1.Caption = Second(Time) 'стало быть секунды Label2.Caption = Minute(Time) 'ну, минуты Label3.Caption = Hour(Time) ' и часы

Теперь, при запуске того, что мы наваяли, у нас будет показываться текущее время. Это, конечно, прогресс, но вот только часики-то стоят. Трясти монитор не стоит, они от этого не пойдут, а вот запустить таймер одной простой строчкой мы сможем:

Timer1.Enabled = True

Вот она, булева алгебра (ну еще не алгебра, но уже кое-что). То есть Timer1.Enabled может быть либо включен (True), либо выключен (False). На этом процедура Form1_Load() закончена:

End Sub

Чтобы получить хоть какие-нибудь блага от запущенного таймера и заставить наши часики ходить, создадим процедуру, которая будет исполняться при наступлении события срабатывания таймера. Событие это у таймера единственное и называется тоже .Timer. Возникает оно в тот момент, когда таймер досчитывает до предела, установленного в свойстве Interval и соответственно сбрасывается на ноль.

Private Sub Timer1_Timer()

Наши секунды должны увеличиваться на одну за каждое срабатывание таймера. Поэтому пишем счетчик, который будет увеличивать значение наших секунд на единицу при каждом срабатывании таймера:

Label1.Caption = Label1.Caption + 1

И вот мы вплотную подошли к проблеме условного оператора (а лучше инструкции) If, без которого - никуда. Суть этой инструкции в том, что он позволяет при неком создавшемся условии производить изменения в ходе программы в зависимости от этого условия.

Инструкция условия If.

Этоу инструкцию можно использовать в блоковой форме: полном (развернутом) виде и неполном (без строк ElseIf), а также в одну строку. В полном виде в блоковой форме синтаксис этой инструкции будет выглядеть следующим образом: If Условие1 Then группа операторов1 ElseIf Условие2 Then группа операторов2 .............. ElseIf УсловиеN Then группа операторовN Else  Последняя группа операторов End If Условие представляет из себя оператор, значение которого может принимать True (Истина) или False (Ложь). Например, если Условие1 представляет из себя выражение X>1, то оно истинно, если Xравно 2, то оно ложно при значении X равном 1. Если Условие1 истинно, то выполняется группа операторов1, остальные группы операторов не выполняются, если даже в каких-нибудь последующих ветках УсловиеN истинно. Если Условие1 ложно, то группа операторов1 не выполняется, а производится проверка Условие2 в следующей ветке ElseIf. И опять же, если Условие2 истинно, то выполняется группа операторов2, последующие группы операторов не выполняются и их условия не проверяются. В противном случае происходит переход к следующей ветке ElseIf. Если ни в одной ветке нет истинных операторов, выполняется последняя группа операторов вне зависимости от каких-либо условий. Логическая схема инструкции If представлена в таблице:

If Условие1 Then

ElseIf Условие2 Then

ElseIf УсловиеN Then

...

Else

 

 

 

 

 

группа операторов1

 

группа операторов2

 

группа операторовN

 

...

 

последняя  группа операторов2

 

 

 

 

 

End If

Наиболее часто инструкция If используется в блоковой форме в неполном (усеченном) виде. В этом случае строки ElseIf отсутствуют: If Условие Then группа операторов1 Else  группа операторов2 End If В этом случае, если Условие - истинно, то выполняется группа операторов1, а если нет, то группа операторов2. Также довольно часто возникает необходимость в зависимости от условия выполнить один оператор. Тогда Инструкция If может использоваться одной строчкой, без строки End If. If Условие Then Оператор1 Else Оператор2 или еще короче If Условие Then Оператор1

Все очень просто. Это вообще мой любимый оператор (куда удобнее и универсальней, чем Select... Case). А теперь применим знание этого оператора на практике. Чтобы у нас показания времени в нашей программе «Часики» до десятка были с ноликами 01, 02, 03, а не 1, 2, 3 мы проверяем условие, меньше ли двух длина числа, записанного в лейбле. Если да, то прибавляем впереди нолик. Для этого используем функцию Len("строка"), которая определит число символов в строке. Если в строке, например, 2 символа, то Len даст число 2. У нас получится:

If Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption ‘для первого лейбла Но ведь и при загрузке системного времени в процедуре Form1_Load нам тоже нужна такая проверка. Не будем же мы переписывать одно и тоже в двух разных процедурах. Мы сделаем свою общую процедуру и будем обращаться к ней по мере необходимости. Назовем ее, к примеру, Zero. В конце нашей программы на свободном месте набираем на клавиатуре новую процедуру:

Private Sub Zero() If Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption If Len(Label2.Caption) < 2 Then Label2.Caption = "0" & Label2.Caption If Len(Label3.Caption)< 2 Then Label3.Caption = "0" & Label3.Caption End Sub

Таким образом, у нас теперь есть своя собственная процедура, которая называется Zero. Никаких событий для ее выполнения нет и, чтобы она работала, ее нужно пробудить из нужного места программы, для чего просто пишем ее имя Zero. А нужные эти места находятся в последней строчке в процедурах Form1_Load() и Timer1_Timer(), прямо (перед End Sub).

Ну вот, с ноликами все в порядке, зато часы не работают. В подпрограмме Timer1_Timer() у нас всего один оператор. Чтобы часы работали, как настоящие, нам надо, чтобы, когда секунд становилось больше 59, они обнулялись, при этом минуты увеличивались бы на один. Используя оператор If это сделать очень легко:

If Label1.Caption > 59 Then Label1.Caption = "0" Label2.Caption = Label2.Caption + 1 End If  'То же самое для Лейбла2: If Label2.Caption > 59 Then Label2.Caption = "0" Label3.Caption = Label3.Caption + 1 End If

Аналогично для Label3 . Нам надо, чтоб, при значении часов больше 23 часов, Label3 показывал не 24, а ноль:

If Label3.Caption > 23 Then Label3.Caption = "0"

Теперь ставим ссылочку на нашу процедуру проверки ноликов Zero :

Zero

И готово, т.е.

End Sub Вот полный листинг того, что получилось. Кто хочет, может скачать исходник примера вверху страницы.

Option Explicit Private Sub Form_Load() Form1.Caption = "Часики" Label1.Caption = Second(Time) Label2.Caption = Minute(Time) Label3.Caption = Hour(Time) Timer1.Enabled = True Zero End Sub

Private Sub Timer1_Timer() Label1.Caption = Label1.Caption + 1 If Label1.Caption > 59 Then Label1.Caption = "0" Label2.Caption = Label2.Caption + 1 End If If Label2.Caption > 59 Then Label2.Caption = "0" Label3.Caption = Label3.Caption + 1 End If If Label3.Caption > 23 Then Label3.Caption = "0" Zero End Sub

Private Sub Zero() If Len(Label1.Caption) < 2 Then Label1.Caption = "0" & Label1.Caption If Len(Label2.Caption) < 2 Then Label2.Caption = "0" & Label2.Caption If Len(Label3.Caption) < 2 Then Label3.Caption = "0" & Label3.Caption End Sub

Теперь вот что. Тебе надо самостоятельно разобраться с другой программой – «Однорукий бандит». Если сможешь - будешь программировать, если нет, читай все сначала. Я даю исходник с подробнейшими-преподробнейшими комментариями. Скачай его здесь.  «Однорукий бандит» - имитация работы известного аппарата для азартных игр. В трех Лейблах отображаются меняющиеся цифры от 1 до 7. Для работы с ними используются три переменные Number. Их изменение управляется тремя таймерами. Первоначально интервалы у таймеров одинаковы – 10 мск. В трех переменных Zamedlenie генерируются случайные числа.

Zamedlenie1 = Int(Rnd * 20) + 10

Работает это так. Rnd генерирует псевдослучайное число от 0 до 1. На двадцать умножаем, чтобы получить целую часть числа (можно умножать на что угодно, но не меньше 10, а то не получится целая часть). Функция Int отбрасывает дробную часть. Прибавляем в конце 10, чтобы исключить значение 0, а то таймер не остановится. Т.е., если Rnd генерирует, например, число 0,156, то

Zamedlenie1= Округляем (0,156*20) + 10 = 3 + 10 = 13. Очень просто.

При каждом срабатывании таймераувеличивается его интервал на значение замедления, пока интервал не становится больше 300 (это задано программно: Timer1.Interval > 300

После этого таймер выключается. Чтобы узнать, все ли таймеры выключились, я использую переменную Flag, которая накапливает в себе количество выключившихся таймеров. Когда Flag=3, считаем, что все три таймера закончили работу (а так оно и есть) и начинаем обрабатывать результаты (подпрограмма Raschet()). Изначальный капитал игрока хранится в переменной Summa, которая при различных выигрышах изменяется на сумму трех переменных Bonus, а при проигрыше на переменную BonusMinus. Почему ее значение отрицательное? Просто мне так захотелось, хотя это, конечно,совершенно необязательно. В Лейблах 4 и 5 выводятся всякие прикольные надписи, в зависимости от результата игры. Ну и кроме того, чтобы во время работы таймеров кнопка не нажималась, она, по состоянию переменной FlagClick, либо позволяет запустить таймеры, либо меняет свою надпись.

После того, как капитал игрока исчерпан, мы переходим к процедуре прекращения игры EndOfGame(), и в ней кнопка блокируется. Дальнейшая игра при этом невозможна.

В этой программе мы впервые объявляем переменные. Ничего в этом сложного нет. Главное, чтоб тип переменной приблизительно соответствовал нашим надобностям. Просто посмотри, как это деляется.

Ну вот, практически и все. Остальное ты должен додумать сам. Удачи.

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

В принципе, все предельно просто. Исходник кода можно скачать вначале страницы. Следующую главу посвятим прибамбахам на форме - вставка иконки программы, изменение курсора и прочей ерунде.

В этой главе, други моя, разберем то, что делает программу удобней и привлекательней для пользователя.

Функция MsgBox для вывода диалогового окна.

Первым делом, нужно, чтобы программа вела диалог с тем идиотом, которому ты всучишь свой шедевр. Для этого существую диалоговые окна различного содержания. Выводятся они на экран функциейMsgBox. Входят в нее такие аргументы:

MsgBox ("сообщение", число и тип кнопок, "заголовок окна", "имя файла справки если есть", номер раздела справки если есть имя файла)

Два последних аргумента необязательны. Они используются, если у тебя создан файл помощи (Help).

"сообщение" - это сообственно сообщение пользователю, например, "Ну ты дурак, нет такого файла" (максимальная длина приблизительно 1024 символа)

"заголовок окна" - это то, что выводится в верхней полосочке (заголовке) окна, например, "Это твоя ошибка"

А вот число и тип кнопок разберем подробнее. Это число получается из складывания трех чисел или констант (кому как удобнее):

  • количество и тип кнопок

  • вид сообщения (какой значок будет в окне)

  • какая кнопка является основной (по умолчанию - первая)

Тип кнопок

Вид сообщения

Основная кнопка

константа

или число

выводимые кнопки

константа

или число

значок сообщения

константа

или число

номер основной кнопки

vbOKOnly

0

VbCritical

16

VbDefaultButton1

0

первая

VbOKCancel

1

VbQuestion

32

VbDefaultButton2

256

вторая

VbAbortRetryIgnore

2

VbExclamation

48

VbDefaultButton3

516

третья

VbYesNoCancel

3

VbInformation

64

VbDefaultButton4

768

четвертая

VbYesNo

4

 

 

VbApplicationModal (на уровне приложения)

0

модальное окно ( не свернется, пока на кнопку не нажмешь)

VbRetryCancel

5

 

 

VbSystemModal (на уровне системы)

4096

Теперь, например, если нам нужно вывести на экран предупреждающий запрос с тремя кнопками Да, Нет, Отмена и чтоб главной была кнопка Нет, мы пишем цифру 3+48+256 число 307:

PushButton = MsgBox ("Да ты баран! Нажми Нет!", 307, "Нельзя так делать!!!")

или если использовать константы

PushButton = MsgBox("Да ты баран! Нажми Нет!", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Нельзя так делать!!!")

Получится как на рис. 11.

Рисунок 11.

Видишь, Выделена кнопка "Нет". Значит она главная. Это если пользователь давнет клавишу "Enter", то сработает "Нет", а не "Да"

PushButton - это должна быть объявленная переменная. Это я придумал для нее такое имя.В нее записывается число, обозначающее, какую же кнопку нажал пользователь, чтобы мы могли заставить нашу программу среагировать как-нибудь. А числа (вместо них тоже можно писать константы) эти соответствуют следующим кнопкам:

Константа

Число

Какая кнопка нажата

vbOK

1

OK

vbCancel

2

Отмена (Cancel)

vbAbort

3

Прервать (Abort)

vbRetry

4

Повторить (Retry)

vbIgnore

5

Пропустить (Ignore)

vbYes

6

Да (Yes)

vbNo

7

Нет (No)

Сечас мы создадим шедевр программирования, где используем диалоговое окно и разберем кое-что еще. Программа наша называется "Я - не вирус", а замечательность ее в том, что она вообще ничего не умеет делать. Смысл ее в том, что, когда пользователь пытается выйти из программы, возникает событие для формы _Unload. Это событие может быть вызвано оператором Unload, выбором команды "Закрыть" из системного меню формы, закрытием приложения из Списка задач (Task List) Windows, закрытием MDI формы, для которой текущая форма является дочерней, или выходом из Microsoft Windows во время работы приложения. При этом значение аргумента этой процедуры Cansel принимает значение False. Присвоение аргументу Cansel любого ненулевого значения предохраняет форму от удаления, но не останавливает другие события, например, выход из Microsoft Windows. Но нам на это налевать. Мы вставляем в эту процедуру MsgBox c запросом на выход. Если нажимается кнопкаОтмена выхода, мы присваиваем локальной переменной Cansel значение True, и выход отменяется, а мы переходим к процедуре FikVam(), которая выводит соответствующий текст в форму.

Обратите внимание, что для того, чтобы в диалоговом окне писать сообщение в несколько строк, я использовал CHR(13). А как раз 13 - это ASCII-код перевода строки.

Вот код этого кошмара.

Option Explicit  Dim PushButton As Long ' объявляем переменную для нажатой кнопки

Private Sub Form_Load() ' процедура загрузки формы Form1.Caption = "Я - не вирус!" 'прописываем заголовок формы Form1.Print " ************************************" 'пишем на форме честно, что это за штука Form1.Print " Ты запустил классную программу! " Form1.Print " Только я ни черта делать не умею!" Form1.Print " Зато я и вреда не приношу! " End Sub

Private Sub Form_Unload(Cancel As Integer) 'процедура выгрузки формы PushButton = MsgBox("Что ж ты гад делаешь!!" & Chr(13) & "Я к те, как к родному, а ты..." & Chr(13) & "Нажми Отмену сечас же!", 273, "Ты же закрываешь меня!") ' вывод диалогового окна при попытке закрыть форму If PushButton = 1 Then ' условие, если нажата кнопка ОК Cancel = False ' подтверждаем выход, хотя это необязательно, она и так выйдет Else ' в противном случае Cancel = True ' отменяем выход FikVam 'ссылка на процедуру, которая срабатывает при нижатии Отмена End If 'конец условия End Sub

Private Sub FikVam() 'процедура, которая срабатывает при нижатии Отмена Form1.Cls ' очистка формы Form1.Print "Вот Молодец! Лучше я, чем вирус" ' вывод текста на форму  End Sub

Как вставить в программу иконку и курсор.

Сейчас сделаем нашу никчемушку красивой. Во-первых заменим идиотский значок Бейсика на наш. Для этого в окне свойств Form1 ткнем в свойство Icon и в открывшемся окне Загрузить Иконкувыберем подходящую. В исходнике программы я положил иконку scin.ico для примера. Если у тебя нет иконок, можно пойти двумя путями: найти их в Интернете (их там полно) или изготовить самому. Я считаю, что достойная программа должна иметь свою, уникальную иконку, а не стыренную у других. Мы что, такие безрукие, что иконку сделать не сможем? Ты можешь скачать простую самопальную программку ICA Converter (не мою) для иконкоделанья. Не самая крутая, зато бесплатно и худо-бедно работает. Теперь выберем для нашей формы другой курсор. Для этого в окне свойств Form1 найдем свойство MousePointer и выберем там 99 - Custom. Это значит, что значком будет тот файл, который мы выберем (расширение должно быть .ico или .cur). Потом ткнем в свойство MouseIcon и в открывшемся окне Загрузить Иконку выберем подходящую (в исходник я положил hns.cur). Надо сказать, что так сказать штатные курсоры Windows лежат в "C:\WINDOWS\Cursors". Ну конечно лучше сделать свой.

Для полного обалдения можно еще воткнуть фоновую картинку в форму Form1, чтобы наш шедевр выглядел привлекательней. Для этого в окне свойств Form1 ткнем в свойство Picture и в открывшемся окне Загрузить Рисунок выберем подходящий. Надо только брать картинку разумного размера. В исходнике я положил картинку 00027.jpg размером 118Kb c небольшой контрастностью, чтобы лучше была видна надпись и подогнал размер формы под нее, а также в окне свойств выставил размер и тип (свойство .Font) и цвет (свойство .ForeColor) шрифта.

Функция InputBox - получение данных от пользователя.

Теперь бы как хорошо было бы, если бы.... пользователь помимо нажатия кнопок мог отвечать нам какими-нибудь данными, ввести например, пороль, или имя, или еще чего-нибудь. Для этого используется функция InputBox.

Синтаксис этой функции таков: