
- •6.1. Объекты – экземпляры класса 11
- •6.2. Графические объекты. Рисуем и пишем. 22
- •Глава 7. Разветвляющиеся программы 45
- •Глава 8. Циклические программы 94
- •Глава 9. Отладка программы 133
- •Глава 10. Типичные приемы программирования 144
- •10.3.1. Пример 154
- •Глава 11. Процедуры и функции 167
- •11.3. Области видимости переменных 208
- •11.4. Функции 222
- •11.5. Переменные и параметры объектного типа 239
- •Глава 12. Графика – 2 259
- •Глава 13. Работа с таймером, временем, датами 320
- •Глава 14. Работа с мышью и клавиатурой 392
- •Глава 15. Массивы, рекурсия, сортировка 440
- •Глава 16. Разные звери в одном ковчеге 479
- •Объекты – экземпляры класса
- •Понятие объекта, как экземпляра класса
- •Создаем объекты из класса
- •Невидимый код в окне кода – Windows Form Designer generated code
- •Удобство визуального программирования
- •Класс – это программа
- •Невидимые объекты
- •Графические объекты. Рисуем и пишем.
- •Класс Graphics
- •Первая нарисованная линия
- •Рисуем отрезки, прямоугольники, круги, эллипсы
- •Рисуем дуги, сектора и закрашенные фигуры
- •Рисуем на нескольких элементах управления
- •Переменные и выражения вместо чисел
- •Методы, «придирчивые» к типу параметров
- •Разветвляющиеся программы
- •Что такое выбор (ветвление)
- •Условный оператор If или как компьютер делает выбор
- •Разбираем оператор If на примерах
- •Правила записи однострочного оператора If
- •Еще примеры и задания
- •Случайные величины
- •Функции Rnd и Randomize
- •Проект «Звездное небо».
- •Многострочный If
- •Разбираем многострочный If на примерах
- •Правила записи многострочного If
- •If условие Then операторы ElseIf операторы
- •Ступенчатая запись программы
- •Вложенные операторы If. Логические операции и выражения
- •Вложенные операторы If
- •Логические операции And, Or, Not
- •Логические выражения
- •Логический тип данных Boolean
- •Оператор варианта Select Case
- •Улучшаем калькулятор
- •Проверка ввода чисел в текстовое поле
- •Запрет деления на ноль
- •Ставим пароль на калькулятор
- •Функция MsgBox
- •Циклические программы
- •Оператор перехода GoTo. Цикл. Метки
- •Цикл с GoTo. Метки
- •Зацикливание
- •Примеры
- •Движение объектов по экрану
- •Выход из цикла с помощью If
- •Операторы цикла Do
- •Оператор Do …. Loop
- •Оператор Do …. Loop While
- •Оператор Do …. Loop Until
- •Оператор Do While …. Loop
- •Оператор Do Until …. Loop
- •Разница между вариантами операторов Do
- •Примеры и задания
- •Оператор Exit Do
- •Оператор цикла While …End While
- •Оператор цикла For
- •Объясняю For на примерах
- •Шаг цикла
- •Синтаксис и работа оператора For
- •Оператор Exit For
- •«Мыльные пузыри» и другие шалости
- •Используем в рисовании переменные величины
- •Отладка программы
- •Типичные приемы программирования
- •Вычисления в цикле
- •Роль ошибок в программе
- •Счетчики и сумматоры
- •Счетчики
- •Сумматоры
- •Вложенные операторы
- •Вложенные циклы – «Таблица умножения»
- •Вложенные циклы – «Небоскреб»
- •Поиск максимума и минимума
- •Процедуры и функции
- •Процедуры
- •Понятие о процедурах пользователя
- •Пример процедуры пользователя
- •Понятие о процедурах с параметрами
- •Пример процедуры с параметрами
- •Вызов процедур из процедуры пользователя
- •Операторы Stop, End и Exit Sub
- •Проект «Парк под луной»
- •Задание на проект
- •От чисел – к переменным
- •От переменных – к параметрам
- •Делим задачу на части
- •Программируем части по-отдельности
- •Серп молодого месяца или «в час по чайной ложке»
- •Земля, пруд, три дерева и два фонаря
- •Ряд деревьев
- •Ряд фонарей и аллея
- •Два способа программирования
- •Области видимости переменных
- •Создание, инициализация и уничтожение переменных
- •Области видимости переменных
- •Зачем нужны разные области видимости
- •Область видимости – блок
- •Статические переменные
- •Функции
- •Передача параметров по ссылке и по значению
- •Из чего состоит тело процедуры. Выражения
- •Функции
- •Константы
- •Переменные и параметры объектного типа
- •Переменные объектного типа
- •Параметры объектного типа
- •Соответствие типов
- •Соответствие объектных типов
- •Неопределенные параметры, произвольное число параметров
- •Что такое методы
- •Пользуемся подсказкой, чтобы узнать объектные типы
- •Параметры методов
- •Графика – 2
- •Точки и прямоугольники
- •Прямоугольник
- •Использование Точки и Прямоугольника в графических методах
- •Собственные перья, кисти и шрифты
- •Создаем собственные перья. Конструктор
- •Создаем собственные кисти
- •Работа с картинками
- •Картинка, как свойство Image элемента управления
- •Растровая и векторная графика
- •Рисуем картинки
- •Размер и разрешение картинок
- •Метод DrawImage и его варианты
- •Метод RotateFlip объекта Bitmap
- •Метод Save объекта Bitmap
- •Рисуем в памяти
- •Перерисовка картинок, фигур и текста
- •Текстурная кисть
- •Работа с цветом
- •Системные цвета
- •Функция FromArgb
- •Прозрачность
- •Как узнать цвет точки на фотографии
- •Преобразования системы координат
- •Встроенный графический редактор vb
- •Работа с таймером, временем, датами
- •Тип данных DateTime (Date)
- •Переменные и литералы типа DateTime
- •Свойства и методы структуры DateTime
- •Свойства и методы модуля DateAndTime
- •Значения строкового параметра для функций работы с датами:
- •Форматирование даты и времени
- •Перечисления
- •Рамка (GroupBox), панель (Panel) и вкладка (TabControl)
- •Рамка (GroupBox)
- •Панель (Panel)
- •Вкладка (TabControl)
- •Проект «Будильник-секундомер»
- •Постановка задачи
- •Делим проект на части
- •Делаем часы
- •Занимаемся датой
- •Занимаемся днем недели
- •Делаем будильник
- •Делаем секундомер
- •Рисуем бордюры вокруг рамок
- •Полный текст программы «Будильник-секундомер»
- •Недоработки проекта
- •Таймер и моделирование
- •Анимация
- •Суть анимации
- •Движем объекты
- •«Движем» свойства объектов
- •Мультфильм «Летающая тарелка»
- •Мультфильм «Человечек»
- •Работа с мышью и клавиатурой
- •Фокус у элементов управления
- •Работа с мышью
- •Основные события, связанные с мышью
- •Подробности событий мыши. Класс MouseEventArgs
- •Две задачи: Глаз-ватерпас и Мышка-карандаш
- •Работа с клавиатурой
- •Событие KeyPress. Класс KeyPressEventArgs. Структура Char
- •События KeyDown и KeyUp. Класс KeyEventArgs
- •Проект – Гонки (игра)
- •Постановка задачи
- •Делим проект на части
- •Первая часть – рисуем поле для гонки
- •Вторая часть – управляем машиной
- •Третья часть – Поведение машины, организация счетчиков и пр.
- •Недоработки проекта
- •Гонки двух автомобилей
- •Задания на проекты
- •Часть III. Программирование на vb – второй уровень
- •Массивы, рекурсия, сортировка
- •Переменные с индексами
- •Одномерные массивы
- •Основы работы с одномерными массивами
- •Мощь одномерных массивов
- •Двумерные массивы
- •Какие бывают массивы
- •Использование массивов при программировании игр
- •Массивы как объекты
- •Массивы как параметры
- •Массивы элементов управления
- •Индукция. Рекурсия
- •Сортировка
- •Простая сортировка
- •Метод пузырька
- •Разные звери в одном ковчеге
- •Коллекции
- •Создание коллекции, методы коллекции
- •Оператор цикла For Each
- •Коллекции, принадлежащие контейнерам
- •Структуры
- •Оператор With
- •Алфавитный указатель
- •Специально для http://all-ebooks.Com
Делаем секундомер
Размести в проекте второй таймер, дав ему имя Таймер_секундомера. Поместим в рамку с именем Секундомер элементы управления для секундомера и дадим им имена:
Циферблат_секундомера (это метка)
Кнопка_пуска_паузы_секундомера
Кнопка_обнуления_секундомера
а также не забудем метку с текстом «Секундомер».
Таймер нужен секундомеру для того же, для чего и часам, а именно – чтобы вовремя менялись цифры на циферблате, а собственный таймер предпочтительно (но в нашем случае не обязательно) иметь для того, чтобы не зависеть от часов. Поскольку нам нужно отслеживать сотые доли секунды, установим ему интервал меньше 10. Когда секундомер считает, таймер секундомера должен работать:
Таймер_секундомера.Enabled = True
а когда он в паузе или в нуле, таймер может и отдохнуть:
Таймер_секундомера.Enabled = False
Режимы работы секундомера. Если будильник в каждый момент времени может находиться в одном из двух состояний (режимов) – установлен или не установлен, то секундомер – в трех: считает, стоит в паузе, стоит в нуле. Придумаем переменную и дадим ей имя Режим _секундомера. Объявить ее типом Boolean явно недостаточно, ведь в типе Boolean всего два возможных значения, а нам нужно три. Здесь напрашивается перечисление:
Enum Режим
считает
пауза
в_нуле
End Enum
Dim Режим_секундомера As Режим
Для каждого режима нам придется организовать свою переменную для отсчета секунд на секундомере:
Dim Секунды_на_секундомере As Double
Dim Секунды_при_запуске_секундомера As Double
Dim Секунды_на_паузе_секундомера As Double
Обратите внимание, что эти переменные, хоть и имеют смысл времени, объявлены, как дробные числовые, а не как Date. Почему так получилось и почему переменных три, а не одна, сейчас попытаюсь пояснить.
Для отсчета времени на секундомере мы будем использовать известную вам функцию Timer класса DateAndTime (не путайте с элементом управления Timer), потому что она выдает секунды с дробной частью (нас устроят сотые доли секунды – какой же секундомер без сотых долей). Поскольку она выдает число секунд, прошедших с полуночи, а нам нужно число секунд, прошедших с момента запуска секундомера, да еще с учетом того, что во время паузы на секундомере уже стояли какие-то показания, нам придется поразмыслить, как это сделать.
Засечем в момент пуска секундомера значение функции Timer оператором
Секунды_при_запуске_секундомера = DateAndTime.Timer
Тогда в каждый момент времени после запуска секундомера выражение
DateAndTime.Timer - Секунды_при_запуске_секундомера
как раз и будет равняться числу секунд, прошедших с момента запуска секундомера. А если нам удастся правильно засечь Секунды_на_паузе_секундомера (имеющие смысл секунд, прошедших с момента пуска до паузы), то дело решит оператор
Секунды_на_секундомере = DateAndTime.Timer - Секунды_при_запуске_секундомера _
+ Секунды_на_паузе_секундомера
Если поместить его в процедуру таймера, то он будет оперативно выдавать нужные для циферблата секунды.
Внешний вид показаний секундомера. Переменная Секунды_на_секундомере – это дробное число типа Double. Например, такое – 65.28194. Но на секундомере эти самые цифры, сами понимаете, должны выглядеть по-другому – 00:01:05.28. Для этого нам нужно как-то преобразовать число секунд в стандартный формат времени. Организуем переменную и константу:
Dim Время_на_секундомере As Date
Const Полночь As Date = #12:00:00 AM#
Здесь время #12:00:00 AM# обозначает, как ни странно, полночь по-американски.
Дело решает пара операторов:
Время_на_секундомере = Полночь.AddSeconds(Секунды_на_секундомере)
Циферблат_секундомера.Text = Format(Время_на_секундомере, "mm:ss.ff")
Кнопки секундомера. Теперь нам нужно подумать о том, что должно происходить во время нажатия на кнопки секундомера. Наши размышления должны течь примерно в том же русле, что и размышления о кнопках и метке будильника. Никакой новой идеологии по сравнению с будильником вы не обнаружите. По аналогии с будильником вы, наверное, должны придти к выводу о необходимости создания трех процедур:
Sub Секундомер_обнулить()
Sub Секундомер_остановить()
Sub Секундомер_запустить()
Я думаю, эти размышления вам полезно будет довести до конца самостоятельно. А проверить себя вы сможете, заглянув в окончательный текст программы ниже. Все процедуры, касающиеся будильника собраны вместе и вы их легко найдете.
Еще о режиме. Самые дотошные из вас, разобравшись в программе, скажут мне, что нечего было огород городить – создавать перечисление, когда можно было обойтись логической переменной Секундомер_считает. Верно. Но неправильно. Потому что нужно оставлять простор для дальнейшего развития проекта. Например, вы можете в будущем захотеть, чтобы во время паузы цифры на секундомере мигали, а в нуле – нет.