- •1.2. Основные программные конструкции
- •1.3. Средства управления
- •1.4. Наименование объектов в Visual Basic
- •2. Порядок выполнения работы
- •2.1. Разработка цифровых часов
- •2.2. Модернизация часов
- •3. Контрольные вопросы
- •1.2. Изменение параметров проекта во время выполнения проекта
- •1.3. Создание меню
- •2. Порядок выполнения работы
- •2.1. Порядок разработки интерфейса
- •2.2. Разработка меню
- •2.3. Программирование команд меню
- •3. Контрольные вопросы
- •1.2. Аргумент типа MsgBox
- •1.3. Результат, возвращаемый функцией MsgBox
- •1.4. Отмена процедуры Form_Unload для корректного выхода из программы
- •2. Порядок выполнения работы
- •2.1. Добавление справки
- •2.2. Разработка диалогового окна условного выхода
- •2.3. Разработка диалогового окна поиска по шаблону
- •1.2. Утверждение Select Case
- •1.3. Циклы
- •Синтаксис циклов Dо
- •Синтаксис циклов For
- •1.4. Использование утверждения Exit для выхода из цикла или процедуры
- •1.5. Работа с несколькими формами
- •2. Порядок выполнения программы
- •2.1. Окно диалога «поиск по образцу»
- •3. Контрольные вопросы
- •1.2. Дескриптор файла
- •1.3. Типы доступа
- •Последовательный доступ
- •Чтение из файла
- •Запись в файл
- •Произвольный доступ
- •Ввод и вывод
- •Двоичный доступ
- •Ввод и вывод
- •2. Практическая часть
- •2.1. Создание диалогового окна «Работа с файлами»
- •3. Контрольные вопросы
- •1.1.1. Установка размеров изображений
- •Элемент ImageBox
- •Элемент PictureBox
- •1.1.2. Загрузка и сохранение изображений
- •1.1.3. Установка свойств Picture и Image
- •1.2. Системы координат
- •1.2.1. Свойства и методы масштабирования Свойства Width и Height
- •Свойства Left и Тор
- •Свойство ScaleMode
- •Свойства ScaleWidth и ScaleHeight
- •Свойства ScaleLeft и ScaleTop
- •Метод Scale
- •Методы ScaleX и ScaleY
- •1.2.2. Свойства TwipsPerPixelX и TwipsPerPixelY
- •1.2.3. Свойства CurrentX и CurrentY
- •1.3. Графические методы
- •1.3.1. Вывод текста
- •Методы TextWidth и TextHeight
- •1.4. Рисование линий и фигур
- •1.4.1. Установка цвета
- •1.4.2. Использование относительных координат
- •1.4.3. Рисование прямоугольников
- •1.4.4. Заливка фигур
- •1.4.5. Использование метода Circle
- •Рисование окружностей
- •Рисование эллипсов
- •Рисование дуг
- •1.5. Использование режимов рисования
- •1.5.1. Использование операции xor
- •1.5.2. Рисование "резиновых" линий
- •1.6. Рисование кривых
- •2. Практическая часть
- •2.1. Рисование круговых диаграмм (2 часа)
- •2.1.1 Порядок выполнения работы
- •2.1.2 Программа. Приложение Diagram
- •2.1.3 Контрольные вопросы
- •2.2. Рисование «резиновых» линий (3 часа)
- •2.2.1 Порядок выполнения работы
- •2.2.2 Программа. Приложение Rubber
- •2.2.3 Контрольные вопросы
- •2.3. Вывод текста на графические объекты (1 час)
- •2.3.1 Порядок выполнения работы
- •2.3.2 Контрольные вопросы
- •2.4. Вывод графиков функций
- •2.4.1 Порядок выполнения работы
- •2.4.2 Программный код кнопки «График 1»
- •2.4.3 Контрольные вопросы
Камский
Политехнический институт Лабораторный
практикум по дисциплине «ИНФОРМАТИКА»
для студентов специальности 2102. Часть
II
г. Наб. Челны
- 2000 Лабораторная работа
№1 РАЗРАБОТКА ЦИФРОВЫХ
ЧАСОВ Цель
работы: Освоить приемы разработки
простейшей программы в Visual Basic. 1. Теоретическая часть 1.1. Вводные замечания
Перед началом
проекта необходимо создать каталог
проекта, где будут располагаться
составляющие проект файлы. Процесс
создания прикладной программы для
Windows на Visual Basic включает три шага: планирование
пользовательского интерфейса; установка
параметров; написание
текста программы.
Три перечисленных
шага могут многократно повторяться,
пока создается, тестируется и исправляется
прикладная программа. В
любой проект входит несколько типов
файлов, имеющие свое расширение: файл
проекта (.VPR или .MAK), файл модуля формы
(.FRM),файл специальных средств управления
(.OCX или .BCX),файл стандартных модулей
(.BAS),файл модулей классов (.CLS),файл
ресурсов (.RES).
Язык Visual Basic
содержит несколько основных программных
конструкций - структур и символических
элементов, которые являются строительными
блоками для программ на Visual Basic. В число
таких конструкций входят: утверждения,
процедуры, функции, методы, параметры,
события и операторы. Приведем
краткие характеристики этих конструкций.
Утверждение
- это синтаксически законченная единица,
обычно одна строка программы, которая
выполняет действие или определяет
переменную. Некоторые утверждения
содержат аргументы, которые определяют,
как в точности должно выполняться
данное действие.
Процедура -
это последовательность утверждений
программы, выполняемых как единое
целое. Подпроцедуры выполняют действия,
но не возвращают значения.
Функция - это
процедура, которая выполняет действие
и возвращает значение. В VisualBasic много
встроенных функций. Если функция
принимает аргументы, то они заключаются
в скобки () справа от имени функции.
Метод - это
процедура, которая работает с объектами
определенного типа (формой, текстовым
окном и т.п.). Методы для данного объекта
определяют набор действий, которые
можно выполнить над объектом. Имя
объекта, на который действует метод,
указывается с точкой.
Параметр - это
атрибут, который определяет характеристики
или поведение объекта (размер, цвет,
наличие или отсутствие рамки управляющего
меню и т.п.).
Событие - это
действие, такое, как щелчок мыши или
нажатие клавиши, которое распознается
объектом и на которое объект реагирует.
Каждый тип объекта имеет определенный
набор действий, на которые он реагирует.
Точная реакция задается программированием
соответствующей процедуры обработки
события для данного объекта. Имя
процедуры обработки события включает
в себя имя объекта, за которым следует
символ подчеркивания, а за ним имя
события.
Оператор выполняет
арифметические, логические операции
или операции сравнения. В VisualBasic входит
полный набор операторов, приведенный
ниже в табл. 1.1. Как и в других языках
программирования, эти операторы
подчиняются строгим правилам порядка
выполнения действий, как указано в
колонке старшинства табл. 1.1. (Действия
со старшинством 1 выполняются первыми,
со старшинством 14 - последними.) Таблица 1.1 Операторы
VisualBasic в порядке старшинства
Тип оператора
Обозначение
Описание
Старшинство
Арифметический
^
Возведение в
степень
1
-
Знак минус
2
*
Умножение
3
/
Деление
3
\
Деление нацело
4
Mod
Модуль
5
+
Сложение
6
-
Вычитание
6
&
Конкатенация
строк
7
=
Равенство
8
Сравнения
<>
Неравенство
9
<
Меньше
9
>
Больше
9
<=
Меньше или равно
9
>=
Больше или равно
9
Like
Соответствие
строки шаблону
9
Is
Ссылка на один
объект
9
Not
Нет
9
Логический
And
Логическое "и"
10
Or
Логическое "или"
11
Xor
Исключающее
"или"
12
Eqv
Логическая
эквивалентность
13
Imp
Импликация
14
В Visual Basic размеры
и расположение свойств указывается в
точках. Точка - это единица длины, которая
соответствует размеру элемента экрана,
когда этот элемент выводится на печать.
В одном дюйме 1440 точек, а в одном
сантиметре - 567.Это означает, что текстовое
окно размером 1440 на 1440 точек при печати
будет иметь размер 1 квадратный дюйм.
При разработке
программ важным этапом является
установка параметров средств управления.
Средства управления - это "кирпичи"
прикладной программы Windows. Каждое из
них имеет уникальный набор характеристик
или параметров, которые определяют их
внешний вид и поведение.
Каждое средство
управления имеет параметр 1
имя, 0которое будет отличать его от
всех остальных средств управления
в программе. Каждое средство имеет
собственный набор параметров,
связанных с ним. Например, формы
обладают параметром MaxButton, который
определяет, будет ли форма иметь кнопку
“Развернуть”. Для командных
кнопок это не имеет смысла, поэтому
они не обладают параметром MaxButton.
Для включения
средств управления в проект можно
использовать Инструментарий Visual Basic,
содержащий пиктограммы - обозначающие
соответствующие средства управления.
При наименовании
объектов Visual Basic (средств управления,
форм, меню и т.д.) рекомендуется
использовать следующую простую схему:
- Начинать название
с трехбуквенного префикса в соответствии
с типом объекта.
- Использовать
только буквы,цифры и знак подчеркивания.
- Использовать не
более 40 символов.
Рекомендуемые
префиксы перечислены в таблице 1.2. Таблица 1.2 Рекомендуемые
префиксы имен объектов
Объект
Префикс
Форма
frm
Флажок
chk
Комбинированное
окно cbo
Командная
кнопка сmd
Окно
данных dat
Список
каталогов
dir
Список
дисков dsk
Рамка
fra
Сетка
grd
Горизонтальная
линейка прокрутки hsb
Образ
img
Надпись
lbl
Строка
lin
Список
lst
Меню
mnu
ОLЕ
ole
Кнопка
опций opt
Окно
рисунка
рiс
Фигура
shp
Текстовое
окно txt
Таймер
tmr
Вертикальная
линейка прокрутки
vsb В
корневом директории С: создать свою
папку с именем myclock. Запустить
Visual Basic. Открыть
новый проект
(File/New Project/Standart.exe). Активизировать
окно параметров (View/Properties Window). Установить
параметры окна формы Form1:
Width
– 4000 (ширина окна); Height
– 4000 (высота окна). Используя
Инструментарий вставить в форму
"надпись" Label (щелкнуть дважды
по инструменту Label или перетащить
мышью). В
окне параметров установить шрифт Ms
Serif и размер шрифта 24 (использовать
параметр Font). Установить
параметры Label1: Alignment
- 2 – Center (выравнивание по центру);
Caption
- Время должно быть здесь (текст на
надписи); Name
– lblTime (имя объекта типа Label);
Font
- Ms Serif 24 (тип и размер шрифта). Добавить
к Form1 "командную кнопку" (объект
CommandButtоn) Установить
параметры для кнопки: Caption
– Время (надпись на кнопке); Name
– cmdTime (имя объекта). Запустить
проект (Run/Start или кнопку запуска
на панели инструментов) и пощелкать
по кнопке «Время» (ничего
не происходит, так как кнопку не
запрограммировали). Вернуться
в режим разработки, для этого необходимо
завершить выполнение программы (выбрать
Close из управляющего меню Form1
или кнопку завершения End на
панели инструментов). Чтобы
вывести текст программы кнопки «Время»
щелкните дважды по кнопке. Введите
в процедуру утверждение (используйте
клавишу Tab для ввода отступа):
lblTime.Caption
= Now
По данному
утверждению по щелчку на кнопке «Время»
появятся текущая дата и время. Закрыть
окно программного текста. Сохранить
разработанную форму в папке myclock
под именем clock Активизировать
Form1,
выбрать
File/Save Form1 As,
выбрать
папку myclock,
ввести
имя clock
нажать
клавишу «Сохранить». Сохранить
проект под именем myclock
File/Save
Project As, ввести
myclock, нажать
клавишу «Сохранить». Запустить
проект (выполнив команду Run/Start)
и пощелкать по кнопке «Время».
Убедиться, что на каждое нажатие клавиши
высвечивается текущее время. Завершить
работу программы. Провести
модернизацию часов, чтобы автоматически
корректировать время каждую секунду.
Для этого необходимо выполнить следующую
последовательность действий: Выбрать
File/Open Project, открыть папку
myclock, выделить файл myclock.vbp и
нажать кнопку «Открыть». Выбрать
View/Project Explorer, открыть папку
Forms и выделить Form1 (clock.frm). Добавить
к Form1 таймер с размером по умолчанию,
дважды щелкнув на инструменте Timer.
Перетащить его на чистое место в левой
части Form1. Вызвав
команду View/Properties Window изменить
параметр Interval таймера на 1000.
Это число указывает на количество
миллисекунд, через которое возникает
событие Timer1_Timer. Вызвать
процедуру Timer1_Timer, щелкнув дважды
на таймере в Form1. Перетащить
разделительную полосу на середину
окна текста и скопировать программный
текст кнопки Time в процедуру таймера.
Для этого: Щелкнуть
на нижней панели окна текста, чтобы
сделать ее активной. Раскрыть
список всех объектов формы Form1 и
щелкнуть на объекте cmdТimе, чтобы
вывести текст его процедуры cmdТimе_Сlick
на нижнюю панель. Выбрать
строку текста с функцией Now, которая
выводит текущее время на надпись. Выбрать
команду Edit/Сору, чтобы скопировать
выбранный текст в буфер обмена Windows. Поместить
указатель вставки в начало пустой
строки в середине процедуры Тimer1_Тimег. Выбрать
команду Еdit/Раstе, чтобы вставить
текст из буфера обмена в то место, на
которое показывает указатель вставки. Закрыть
окно текста Form1. В
окне форм Form1 выбрать кнопку Тimе
и нажать Dеl, чтобы уничтожить
ее. Эта кнопка больше не нужна. Изменить
параметры формы Form1: Caption
- Часы-автомат (надпись заголовка
окна); BorderStyle
- 3 –FixedDialog (стиль окна); Height
– 2000 (высота окна). Сохранить
проект, выбрав File/Save Project. Запустить
проект, выбрав Run/Start. Завершить
работу часов (Alt+F4). Скомпилировать
проект, для чего: выбрать
File/Make myclock.exe. поменять,
если надо, диск, каталог, имя файла. щелкнуть
на кнопку ОК. Для
проверки скомпилированного файла
необходимо выйти из VisualBasic и используя
Проводник запустить exe-файл. Какие
шаги включает процесс создания
приложений на Visul Basic ? Какие
типы файлов включает в себя проект? Дайте
определение понятий: утверждение,
процедура, функция, метод, параметр,
событие, оператор. Что
такое точка в VisualBasic? Укажите
назначение средств управления и какими
параметрами они характеризуются? Укажите
рекомендуемый способ присвоения имен
объектам VisualBasic. Расcкажите
порядок разработки цифровых часов. Лабораторная работа
№2 РАЗРАБОТКА
ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА
Цель работы:
Освоить приемы разработки пользовательского
меню в Visual Basic. 1. Теоретическая часть 1.1.Вводные замечания
С помощью набора
инструментов к прикладной программе
можно добавлять общепринятые средства
управления: текстовые
окна командные
кнопки переключатели диалоговые
окна списки
Средства управления
появляются со своими "предопределенными"
стандартными возможностями. Например,
текстовое окно содержит мерцающий
указатель вставки и позволяет вводить,
выделять и редактировать текст. Панели
прокрутки дают возможность прокручивать
содержимое текстовых окон. Для этих
предопределенных свойств не требуется
писать программы. Однако если нужно
скопировать выделенный в окне текст в
буфер обмена, то придется написать
соответствующий фрагмент программы.
Если необходимо, чтобы средства
управления меняли размер или свое
расположение на экране в том случае,
когда пользователь меняет размер окна,
содержащего эти средства управления,
также может понадобиться написать
программный текст.
Некоторые параметры
можно менять только во время разработки
(когда идет работа над программой), но
большинство можно менять во время
выполнения (когда работает сама
программа) в ответ на определенные
действия пользователя. Чтобы изменить
параметры во время разработки, необходимо
выбрать объект и изменить значения в
окне параметров. Чтобы изменить параметры
объекта во время выполнения, нужно
добавить определенный программный
текст, в процедуру обработки событий
объекта. Такое действие уже выполнялось
в лабораторной работе при разработке
проекта цифровых часов. Код, который
был добавлен в процедуру таймера, менял
параметр Caption надписи часов, чтобы
они каждую секунду показывали текущее
время и дату.
Одно из важных
достоинств Visual Basic - простота разработки
и проверки прикладных программ. Программа
не должна быть "закончена" до того,
как можно будет проверить ее. Можно
добавить к программе новую возможность,
немедленно проверить ее, исправить,
вновь проверить и т.д. и все это, не
выходя из Visual Basic.
Система меню
- это основа пользовательского интерфейса
программы. Большинство команд и
возможностей программы (если не все)
доступны в виде меню. Visual Basic позволяет
легко и быстро разрабатывать и кодировать
меню для прикладных программ.
Меню - это
особое средство управления Visual Basic, и
поэтому в наборе инструментов нет
инструмента (Menu). Чтобы добавить
пункт (команду или возможность) к меню
прикладной программы, надо воспользоваться
Редактором меню следующим образом:
Выбрать
форму, к меню которой необходимо
добавить пункты.
Выбрать
команду Tools/Menu Editor или нажать клавиши
Ctrl+E, или щелкнуть на кнопке редактора
меню на панели инструментов, (на ней
изображено маленькое ниспадающее
меню), чтобы открыть окно редактора
меню.
В
текстовом окне Caption ввести заголовок
требуемого пункта меню. Это тот текст,
который появится на панели меню или в
ниспадающем меню. Чтобы задать быструю
клавишу для пункта меню, нужно ввести
амперсенд (&) перед требуемым
символом. Чтобы вставить разделитель
в ниспадающее меню, нужно ввести
черточку (-) в текстовое окно Caption.
В
текстовом окне Name ввести название
требуемого пункта меню.
Это название будет
использоваться для ссылок на пункт
меню в разрабатываемой программе.
Каждый пункт меню должен иметь свое
уникальное название.
Чтобы
задать быструю клавишу для пункта
меню, нужно выбрать требуемую комбинацию
из списка Shortcut.
Чтобы
изменить уровень пункта меню в иерархии,
нужно щелкнуть на кнопке со стрелкой
вправо (для увеличения отступа и
понижения уровня пункта) или на кнопке
со стрелкой влево (для уменьшения
отступа и повышения уровня пункта).
Уровень пункта меню определяет, где в
иерархии меню появится данный пункт.
Пункты главного меню (без отступа)
появляются на панели меню; пункты
подменю с единичным отступом, появятся
в меню, ниспадающих из панели меню;
пункты подподменю с двойным
отступом, появляются в меню, ниспадающих
из других подменю, и т. д. Можно
использовать до четырех уровней меню,
от пунктов главного меню до пунктов
подподподменю.
Чтобы
добавить еще один пункт меню, необходимо
щелкнуть на кнопке Next.
Чтобы
вставить новый пункт меню, нужно
выделить пункт меню, перед которым
необходимо сделать вставку, и щелкнуть
на кнопке Insert.
Для
удаления пункта меню, нужно его выделить
и щелкнуть на кнопке Delete.
Закончить
создание меню нужно кнопкой ОК.
Как и для других
средств управления, для пунктов меню
рекомендуется использовать содержательные
названия. Далее будем начинать название
каждого пункта меню с mnu и
применять иерархическую схему для
остальной части названия. Например,
пункт меню Файл будет называться
mnuFile, пункт подменю Файл, Открыть
- mnuFileOpen и т. д.
Создать
новый проект: В
корневом директории С: создать
свою папку с именем mymenu. Запустить
Visual Basic.
Запустить
новый проект (File/New Project).
Активизировать
окно параметров (View/Properties).
Установить для Form1 следующие
параметры: Caption
- Мой текстовый редактор;
Height
- 4000;
Left
- 1095;
Name
- frmMain;
Top
- 1170;
Width
- 5000.
Параметры Left и Top
задают расстояние (в точках) между левым
верхним краем формы и левым верхним
краем содержащего данную форму окна -
в нашем случае всего экрана. Добавить
к форме "текстовое окно"
(инструмент "TextBox"). Обратите
внимание на то, что текстовое окно
получило название Text1. Установить
следующие параметры Text1:
Name
- txtEditBox;
Top
- 0;
Left
- 0;
Height
- 3600;
Width
- 4870;
Font
- 18;
MultiLine
- True.
Scrollbars
- 2-Vertiсal;
Параметр Scrollbars
задает панель вертикальной прокрутки,
MultiLine задает возможность ввода
нескольких строк, для остальных
параметров - значения по умолчанию. Сохранить
все созданные файлы нового проекта:
выбрать
File/Save Project As,
сделать
C:\MYMENU текущим каталогом,
ввести
basictxt и для названия формы и для
названия проекта. Запустить
проект. Ввести текст из нескольких
строк, изменить размеры окна (размеры
текстового окна не изменяются).
Закончить
работу проекта. Внести
изменения в проект, позволяющие
автоматически менять размеры текстового
окна при изменении размеров окна
программы. Для этого нужно выполнить
следующую последовательность действий: Сделать
активной форму Мой текстовый
редактор.
Вывести
окно программного текста формы: выбрать
команду View/Code, в окне объектов
выбрать Form, в окне процедур выбрать
Resize, чтобы вывести процедуру
Form_Resize (событие Resize происходит,
когда размеры формы меняются во время
выполнения) Нажать
Tab, чтобы сделать отступ и ввести
следующие строки программы:
txtEditBox.Height
= ScaleHeight
txtEditBox.Width
= ScaleWidth
Введенные строки
устанавливают параметры текстового
окна Height и Width равными параметрам
формы ScaleHeight и ScaleWidth. Сохранить
проект (File/Save Project) - Запустить
проект. Развернуть
и свернуть окно Мой текстовый
редактор. Убедиться, что размеры
текстового окна автоматически
изменяются. Прекратить
работу прикладной программы.
Чтобы добавить
пункт (команду или возможность) к меню
прикладной программы, надо воспользоваться
редактором меню Menu Editor. Создадим
главное меню, состоящее из пунктов
Файл, Правка, Справка. Начнем с
создания пункта главного меню Файл.
Для этого необходимо выполнить следующую
последовательность действий:
Открыть
окно формы Мой текстовый редактор.
Открыть
окно редактора меню (Tools/Menu Editor или
кнопка редактора меню панели
инструментов).
В
текстовое окно Caption ввести &Файл
в качестве заголовка пункта меню (&
вводится для задания быстрой клавиши).
Нажать
Tab, чтобы сделать активным текстовое
окно Name и ввести название пункта
меню mnuFile (каждый пункт меню должен
иметь свое уникальное название).
Создать
пункты подменю, появляющиеся в
ниспадающем меню, для чего:
добавить
новый пункт подменю (щелкнуть на кнопке
Next); ввести
отступ (щелкнуть на кнопке со стрелкой
вправо, пункты главного меню вводятся
без отступа, пункты подменю с единичным
отступом);
щелкнуть
на текстовом окне Caption, чтобы сделать
его активным и ввести &Новый; нажать
Tab, чтобы сделать активными текстовое
окно Name и ввести в качестве названия
пункта mnuFileNew. Повторить
п.п.3-4,введя подпункты меню и их названия:
&Открыть
-mnuFileOpen;
&Сохранить
- mnuFileSave;
Сохранить
&Как - mnuFileSaveAs.
Ввести
разделитель в ниспадающем меню: щелкнуть
Next, ввести ‘-‘ (черточку), нажать
Tab, ввести название разделителя -
mnuFileSep.
Повторить
п.п. 3-4 для создания подпункта Вы&ход
меню File, введя в качестве
названия подпункта - mnuFileExit. Из
списка Shortcut выбрать Ctrl+Q для
задания быстрой клавиши. Сохранить
проект. Действуя
аналогично изложенному создать пункты
главного меню: Правка, Справка
присвоить им соответствующие имена -
mnuEdit, mnuHelp и назначить
быстрые клавиши.
Добавить
к пункту меню Правка cледующие
подпункты с соответствующими именами:
Вырезать-
mnuEditCut;
Копировать-
mnuEditCopy;
Вставить-
mnuEditPaste.
Используйте кнопку
Insert при добавлении нового пункта,
кнопку со стрелкой вправо для указания
отступа для пунктов подменю. К
пункту меню Справка добавить
подпункты: Справка о текстовом
редакторе - mnuHelpAbout; Общая
справка - mnuHelpSystem. При
формировании пунктов и подпунктов
меню необходимо обязательно вставлять
быстрые клавиши, таким образом, чтобы
они в пределах одного уровня меню не
повторялись.
Закройте
окно разработки меню (щелкнуть на ОК).
Сохранить проект в созданной папке
mymenu. Запустить проект. Проверить
пункты меню, щелкая на пункты главного
меню и наблюдая за появлением ниспадающих
меню. Повторить проверку, используя
быстрые клавиши. Выберите Файл/Выход.
Команда Выход не работает. Запрограммируем
команду Выход для этого нужно
добавить в проект утверждение End: сделать
активной форму Мой текстовый
редактор; вывести
программный текст пункта меню Файл/Выход
(щелчок по пункту Файл/Выход,
должен появиться текст процедуры
mnuFileExit_Click) нажать
Tab, чтобы сделать отступ, ввести
End для добавления оператора
End к процедуре; закрыть
окно текста программы; сохранить
проект и запустить его; из
панели меню Мой текстовый редактор
выбрать Файл/Выход, чтобы проверить
работу команды «Выход»; запустить
проект снова и нажать клавиши Ctrl+q,
чтобы проверить работу быстрой клавиши
для команды «Выход». Программирование
команды «Вырезать». Включите
в процедуру mnuEditCut_Click следующие
утверждения:
Clipboard.Clear
‘ очистить системный буфер
Clipboard.SetText
txtEditBox.SelText ‘поместить выделенный
‘текст
в системный буфер
txtEditBox.SelText
= ““ ‘уничтожить выделенный текст Программирование
команды «Копировать». Cкопируйте
первые два утверждения в процедуру
mnuEditCopy_Click:
Clipboard.Clear
‘ очистить системный буфер
Clipboard.SetText
txtEditBox.SelText ‘поместить выделенный
‘текст
в системный буфер Программирование
команды «Вставить». Включите
в процедуру mnuEditPaste_Click следующие
утверждения:
‘ возвратить
содержимое буфера обмена
txtEditBox.SelText
= Clipboard.GetText ( ) Сохранить
проект, проверить работу команд
Вырезать, Копировать, Вставить. Каким
образом добавляются в проект средства
управления? Как
добавить к форме текстовое окно? Как
изменить параметры средств управления
во время выполнения проекта?
Как
добавить в форму меню? Какой
порядок для формирования уровней меню
используется в Visual Basic? Каким
образом определяются быстрые клавиши
для пунктов меню и подменю? Как
добавляются пункты и подпункты меню? Лабораторная работа
N 3 РАЗРАБОТКА СТАНДАРТНЫХ
ДИАЛОГОВЫХ ОКОН.
Цель работы:
Освоить приемы программирования пунктов
меню и приемы разработки стандартных
диалоговых окон.
1. Теоретическая часть 1.1. Иcпользование
MsgBox для создания простых диалоговых
окон
Некоторые диалоговые
окна состоят из простого сообщения и
одной-двух командных кнопок. Такие
диалоговые окна можно создавать,
вставляя в проект новые формы и добавляя
к ним кнопки, надписи и текстовые окна,
задавая их параметры и затем, программируя
различные средства управления, чтобы
они вели себя, как от них требуется.
Однако
существует объект - MsgBox
позволяющий это делать быстрее и проще.
MsgBox может
работать как утверждение или как
функция. Если MsgBox используется
как утверждение, то оно выводит диалоговое
окно в соответствии с указаниями, но
не сообщает, какую кнопку на нем нажал
пользователь. Этого достаточно для
диалоговых окон, которые просто
информируют пользователя о чем-либо и
имеют единственную командную кнопку
(ОК). При использовании MsgBox
как функцию, она выводит диалоговое
окно и сообщает, какую кнопку на нем
нажал пользователь (возвращая
соответствующее этой кнопке значение).
Это важно, когда на диалоговом окне
есть несколько кнопок.
Утверждение MsgBox
всегда сопровождается, по крайней мере,
одним аргументом - сообщением, которое
необходимо отобразить в диалоговом
окне. За аргументом сообщения может
идти необязательный аргумент типа -
число, которое задает тип выводимого
диалогового окна (как описано в следующем
разделе). Последний аргумент -
необязательный заголовок, т.е. тот
текст, который нужно выводить на панель
заголовка диалогового окна.
Утверждение MsgBox
имеет следующий синтаксис:
MsgBox
message [, type] [, title]
Здесь слова,
набранные прямым шрифтом, - это ключевые
слова Visual Basic, а слова, набранные курсивом,
- это элементы, значения которых зависят
от сущности программируемого утверждения.
Необязательные элементы заключаются
в квадратные скобки [...]. Запятые в [,
type] и [, title] указывают, что если используется
какой-либо из этих аргументов, то
необходимо при помощи запятой отделить
его от предыдущего аргумента. Вот пример
утверждения MsgBox со всеми тремя
аргументами:
MsgBox
"Here's the message", 1, "Here's the title"
Аргумент типа
MsgBox - это сумма значений, определяющих
число и тип кнопок на диалоговом окне,
стиль пиктограмм, используемых в окне,
и другие его спецификации. Чтобы понять,
как работает этот аргумент, следует
обратить внимание на табл. 3.2, где
перечислены некоторые значения типов,
описывающих диалоговое окно.
Таблица 3.2 Значения
аргумента типа MsgBox
Значение типа
Описание
0
Выводить только
кнопку ОК
1
Выводить кнопки
ОК и Cancel
2
Выводить кнопки
Abort, Retry и Ignore
3
Выводить кнопки
Yes, No и Cancel
3
Выводить кнопки
Yes и No
5
Выводить кнопки
Retry и Cancel
16
Выводить
пиктограмму "Стоп"
32
Выводить
пиктограмму "?"
48
Выводить
пиктограмму "!"
64
Выводить
пиктограмму информации "i"
0
Кнопка по умолчанию
– первая
256
Кнопка по умолчанию
- вторая
512
Кнопка по умолчанию
- третья
0
Программное
ведущее диалоговое окно
4096
Системное ведущее
диалоговое окно
Например,
утверждение
MsgBox
"Erase the selection?", 52
выводит
диалоговое окно, включающее: восклицательный
знак, надпись и кнопки Yes и
No. Тип 52 в этом утверждении
- это сумма значений 48 и 4. Как видно из
табл. 3.2, 48 означает вывод пиктограммы
с восклицательным знаком, а 4 - вывод
кнопок Yes и No. Тип 52
порождает окно с пиктограммой
восклицательного знака и кнопками Yes
и No.
Функция MsgBox
возвращает значение, соответствующее
кнопке, на которой щелкнул пользователь.
Эти значения перечислены в табл. 3.3.
Табл.
3.3 Значения, возвращаемые функцией
MsgBox
Возвращаемое
значение
Кнопка, на которой
щелкнул пользователь
1
Кнопка ОК
2
Кнопка Cancel
3
Кнопка Abort
4
Кнопка Retry
5
Кнопка
Ignore
6
Кнопка
Yes
7
Кнопка No
Например, утверждение
whichButton=MsgBox("Erase
the selection?", 4 + 32)
присваивает
значение, возвращенное функцией MsgBox,
переменной whichButton. В данном случае
выводимое диалоговое окно будет иметь
две кнопки, Yes и No, из-за четверки
в аргументе функции, задающем тип. Будет
также показана пиктограмма со знаком
вопроса (код 32). Необходимо обратить
внимание на то, что можно указывать
слагаемые типа по отдельности (4+32)
или вместе (36). Щелчок на кнопке Yes
возвращает значение 6 (как показано
в табл. 3.3). Щелчок на кнопке No
возвращает значение 7.
Один из способов
выхода из прикладной программы Visual
Basic - это вставка утверждения End в
текст программы (например, в процедуру
Файл/Выход). Другой способ - это
закрытие главного окна прикладной
программы (тот способ использовался в
предыдущем упражнении). Управляющее
меню окна содержит команду Закрыть,
которая выгружает (закрывает) окно.
Как уже упоминалось
ранее, End производит корректный,
чистый выход из прикладной программы
(закрывая файлы и освобождая память).
Однако закрытие главного окна этого
не делает. По этой причине можно решить
запретить пользователям выходить из
программы, закрывая ее главное окно.
Один из способов это сделать - удалить
управляющее меню из главного окна.
Однако это сомнительное решение,
поскольку пользователи ожидают найти
управляющее меню в окне. Предпочтительный
способ - удалить процедуру Form_Unload,
которая выполняется, когда пользователь
пытается закрыть окно. Если эта процедура
не будет выполняться, окно не закроется.
Запустить
Visual Basic. Запустить
созданный в предыдущей лабораторной
работе проект basictxt (C:/mymenu).
Вывести
процедуру mnuHelpAbout_Click (View/Code,
в окне объектов выбрать mnuHelpAbout, в
окне процедур Click). Сделайте
отступ и введите:
MsgBox
"Текстовый редактор ???",64,"О
текстовом редакторе"
Утверждение
MsgBox принимает три аргумента: "Текстовый
редактор ???" - сообщение,
которое появится в диалоговом окне,
здесь ??? - фамилия разработчика тип
64 - означает появление в
диалоговом окне пиктограммы
информационного сообщения "i" "О
текстовом редакторе" – текст,
который появится на панели заголовка
Закрыть
окно программного текста. Сохранить
проект, запустить его. Проверить
выполнение команды Справка/Справка
о текстовом редакторе.
Выйти
из текстового редактора.
Выведите
процедуру mnuFileExit_Click. Удалите
утверждение End в процедуре.
Введите
утверждение:
If
MsgBox("Выход?",4 + 32,"Подтверждение")
= 6 Then End
По данному
утверждению выводится диалоговое окно,
содержащее пиктограмму с "?"
(код 32) и две кнопки "Да" и
"Нет"(код 4). Щелчок на кнопке
"Да" возвращает значение 6,на
кнопке "Нет" - значение 7. Сохранить
проект, запустить его. Проверить работу
нового диалогового окна.
Запустить
проект. Выбрать Файл/Выход еще
раз. Попробуйте закрыть диалоговое
окно с помощью клавиши Esc
(использование клавиши Esc для
закрытия диалогового окна традиционно
для прикладных программ Windows). Клавиша
Esc не работает. Заменим
в разработанном диалоговом окне кнопки
"Да" и "Нет" на кнопки
ОК и Отмена, чтобы можно было
использовать Esc:
вывести
процедуру mnuFileExit_Click
заменить
в утверждении 4 на 1. Теперь в
диалоговом окне будут
выводиться
кнопки ОК и Отмена
заменить
6 (после знака =) на 1. Вместо
проверки, нажата ли
кнопка
Да, утверждение будет проверять,
нажата ли кнопка ОК.
Теперь утверждение
должно выглядеть так:
If
MsgBox("Выход?", 1 + 32, "Подтверждение")
= 1 Then End
Сохранить
проект, запустить его. Используйте
клавишу Esc для отмены команды
Выход и закрытия диалогового
окна. Завершить
работу текстового редактора при помощи
управляющего меню. Программа не просит
подтвердить команду выхода, поскольку
управляющее меню работает независимо
от меню Выход.
Запретим
выход из программы с помощью управляющего
меню из главного окна (для этого в
процедуре Form_ Unload нужно
установить cancel равным 1
(истина)):
вывести
в окне программного текста формы
процедуру события Form _Unload (в
окне объекта нужно выбрать Form,
в окне процедуры выбрать Unload)
ввести
в процедуру утверждение
Cancel
=1
(установка значения
Cancel равным 1 (истина) запрещает выгружать
форму).
перейдите
к следующей строке программы и введите
mnuFileExit_Click
(теперь, когда
пользователь попытается закрыть главное
окно текстового редактора, вместо
выгрузки будет вызвана процедура
mnuFile Exit_Click)
сохранить
проект, затем запустить его, проверить
действуют ли внесенные изменения. Добавить
к главному меню текстового редактора
пункт Поиск, пункт подменю
Найти (используйте Menu Editor,
в качестве имен введите mnuSearch,
mnuSearchFind):
Откройте
окно программного текста, выведите
процедуру mnuSearchFind_Click() и введите
следующий текст:
Sub
mnuSearchFind_Click()
Find
= InputBox("Введите текст для поиска:","Find")
'1
If
Find = " " Then Exit Sub '2
LenFind
= Len(Find) '3
LenSourse
= Len(txtEditBox.Text) '4
Do
While txtEditBox.SelStart <= LenSourse '5
txtEditBox.SelLength
= LenFind '6
If
txtEditBox.SelText = Find Then Exit Sub '7
txtEditBox.SelStart
= txtEditBox.SelStart + 1 '8
Loop
'9
End
Sub
Процедура поиска
работает следующим образом: Функция
InputBox выводит диалоговое окно с
приглашением и текстовым окном.
Введенный текст копируется в переменную
Find
Если
значение переменной Find пусто, то
выход из процедуры Функция
Len(Find) определяет количество символов
в искомом тексте. Это количество
записывается в переменную LenFind
В
переменную LenSourse записывается
количество символов во всем документе.
Цикл
Do While ... Loop
выполняется до тех пор пока
txtEditBox.SelStart меньше чем LenSourse.
SelStart определяет, где
начинается выделенный текст, LenSourse
определяет число символов во всем
документе
Выделяется
текст, для проверки. Начиная с текущего
положения указателя вставки, выделяется
столько же символов, сколько содержит
искомый текст (LenFind)
Выполнение
процедуры заканчивается, если выделенный
текст совпадает с искомым
Указатель
вставки перемещается на один символ
вправо Loop
возвращает управление на первую строку
цикла Do
Сохраните
проект, запустите проект, проверьте
работу поиск
Внесите
изменения в процедуру, заменив цикл
DO While...Loop на Do
Until...Loop, For...Next. Сохраните
проект.
3. Контрольные вопросы
1.Каково назначение
объекта MsgBox ?
2.В чем разница
между MsgBox-утверждением и MsgBox- функцией
?
3.Перечислите
значения,возвращаемые функцией MsgBox.
4.Каким образом
можно отменить процедуру Form_Unload ?
5.Для каких целей
могут использоваться утверждения
If...Then... Else и
Select Case ?
Лабораторная работа
N 4 РАБОТА С НЕСКОЛЬКИМИ
ФОРМАМИ. ИСПОЛЬЗОВАНИЕ УСЛОВНЫХ
УТВЕРЖДЕНИЙ И ЦИКЛОВ.
Цель работы:
Освоить приемы программирования
условных утверждений и циклов.
1. Теоретическая часть 1.1. Ветвления в
программах
Как и в других
разновидностях языка Бейсик, в Visual
Basic можно использовать утверждения
If...Then, которые позволяют писать
разветвляющиеся программы - программы,
где выбираются различные ветви в
зависимости от выполнения или невыполнения
определенного условия. Утверждение
If...Then имеет две основные формы. Синтаксис
первой из них следующий:
If
condition
Then doThis
[Else doThat]
condition - это
выражение, которое может иметь значения
True (истина) или False (ложь); doThis и doThat
- это утверждения, которые можно выполнять
(или не выполнять) в зависимости от
значения condition. Часть утверждения
Else doThat (в квадратных скобках)
необязательна.
Обычно оцениваемое
условие - это выражение, сравнивающее
два значения, например Х = 5 в следующем
примере:
If
Х = 5 Then MsgBox "X is 5" Else
MsgBox "X is not 5"
Если условие
истинно (если Х равно 5), утверждение
MsgBox после Then выводит диалоговое окно
с надписью X is 5. Если условие ложно (если
Х не равно 5), утверждение MsgBox после Else
выводит диалоговое окно с надписью X
is not 5. В этом примере используется
оператор сравнения =. Visual Basic поддерживает
несколько других операторов сравнения,
которые перечислены в табл. 4.1.
Таблица 4.1 Операторы
сравнения
Обозначение
Оператор
<
Меньше
<=
Меньше
или равно
>
Больше
>=
Больше
или равно
=
Равно
<>
Не
равно
Второй вариант
интаксиса утверждения If...Then...Else
следующий:
If
condition Then
[statement
block 1]
Else
[statement
block 2]]
End If
Или для утверждения
If...Then...Elself...Else:
If
condition Then
[statement
block 1]
Elself
condition2 Then
[statement
block 2]]
Elself
...
[.................]]
Else
[statement
block n]]
End If
В приведенных
утверждениях condition - это выражение,
которое может быть истинным или ложным,
a statement block ... означает одну или
несколько строк программы, которые
выполняются, если выполняется условие.
В записанных
утверждениях могут выполняться блоки
утверждений. Точки показывают места,
куда можно вставлять дополнительные
блоки Elself.
Утверждение Select
Case работает точно так же, как утверждение
If... Then. ..Elself.. .Else. Однако
Select Case, вообще говоря, эффективнее и
лучше читается, чем If...Then...Elself...Else. Вот
его синтаксис:
Select
Case expression
[Case
value1
[statement
block 1]]
[Case
value2
[statement
block 2]]
[...........
[.................
]]
[Case
Else
[other
statement block]]
End
Select
Visual
Basic выполняет утверждение
Select Case
следующим образом:
Оценивается
выражение expression, затем каждое
значение value проверяется (сверху
вниз) на соответствие выражению.
Если значение
соответствует выражению, его блок
утверждений выполняется, после чего
происходит выход из Select Case. (Во всем
утверждении Select Case выполняется не
более чем один блок утверждений.)
Если никакое
значение не соответствует выражению,
выполняется блок утверждений Case Else
(если, конечно, этот блок включен в
утверждение), после чего происходит
выход из Select Case.
Поскольку значения
утверждения Select Case оцениваются
сверху вниз, необходимо сначала ставить
"исключения" (50 в приводимом ниже
примере), затем "правила" (от 0 до
100 в приводимом ниже примере) и затем
собирающее остатки "прочее" (Case
Else). Приведем простое утверждение Select
Case:
Select
case theNumber
Case
50
MsgBox
"That's a very bad number!"
Case
0 To 100
MsgBox
"That's a good number."
Case
Else
MsgBox
"That's a pretty good number...."
End
Select
В этом утверждении
числа от 0 до 100 - это "правило", а
50 - "исключение". Все числа от 0 до
100 оцениваются как "хорошие", кроме
50, про которое сообщается, что оно "очень
плохое!". Блок Case Else обо всех
остальных числах говорит, что они "очень
хорошие....". Используя эту конструкцию
можно проверить как отдельное значение
(50), так и целый диапазон (от 0 до 100).
Циклы позволяют
повторять одну или несколько строк в
программах. Существует два часто
используемых в Visual Basic типа циклов: логические
циклы Do
арифметические
циклы For.
В обоих вариантах
циклов Visual Basic выполняет блок программы
снова и снова, пока утверждение, которое
указано, не станет истинным. Как и в
утверждениях If...Then...Else, условие чаще
всего заключается в сравнении двух
выражений. В следующем цикле Do, например,
строки с отступом выполняются, пока не
станет справедливым выражение Х = 5:
Do Until
X = 5
Y = Y+1
Z
= Y+Z
X = X+1
Loop
Типичные программы
с циклами - программы сортировки данных
и поиска.
Do While
condition
code
block ..........
Loop
Do Until
condition
code
block ..........
Loop
Do
code
block ..........
Loop
While condition
Do
code
block ..........
Loop
Until condition
В каждом из этих
циклов Do condition - это выражение,
которое может быть истинным или ложным,
a code block и ........ означает одну или
несколько строк программы, которые
повторяются, пока условие справедливо.
For
counter =
start To
End [Step
increment]
code
block ..........
Next
[counter]
counter-это числовая
переменная, используемая в цикле как
счетчик; start - это начальное значение
счетчика. Необязательный аргумент
increment задает приращение, на которое
увеличивается счетчик при каждом
выполнении цикла; если
в
цикл не включить условие Step, счетчик
будет увеличиваться на 1. code block и.......
представляет одну или несколько строк
программы, которые повторяются, пока
не будет выполнено условие counter = end.
Иногда бывает
необходимо выбраться из "водоворота"
цикла или процедуры, т. е. покинуть их
до завершения нормального выполнения.
Для этого в программу надо включить
соответствующее утверждение Exit.
Чтобы покинуть цикл или процедуру,
надо:
Использовать Exit
Do для выхода из цикла Do и передачи
управления утверждению, идущему за
Loop в конце цикла.
Использовать Exit
For для выхода из цикла For и передачи
управления утверждению, идущему за
Next в конце цикла.
Использовать
Exit Sub для выхода из процедуры Sub
и передачи управления утверждению,
идущему за утверждением, вызвавшим
процедуру.
Использовать
Exit Function для выхода из процедуры
Function и передачи управления
утверждению, идущему за утверждением,
вызвавшим функцию.
Такие функции
Visual Basic, как МsgВох и InputВох, позволяют
вам добавлять к вашим программам
простые, стандартные диалоговые окна.
Однако иногда бывают нужны и более
сложные диалоговые окна. Visual Basic позволяет
вам создавать пользовательские
диалоговые окна, которые могут
содержать такой набор кнопок, текстовых
окон и других средств управления, какой
вам требуется.
Для добавление в
существующий проект дополнительной
формы необходимо выполнить команду
Project/Add Form/New.
Для активизации
нового диалогового окна во время
выполнения программы следует
воспользоваться методом Show,
а для закрытия окна методом Hide.
В остальном поведение дополнительного
аналогично основному. Добавить
к проекту новую форму ( Project/Add
Form/New). Включить
в форму следующие инструменты: две
командные кнопки CommandButton, текстовое
окно Text, переключатель CheckBox.
Установить параметры. Измените
тексты процедур формы Find следующим
образом:
Private
Sub cmdFind_Click()
‘проверка,
включен ли переключатель
‘если
включен, то строка поиска переводится
‘в
верхний регистр
Find =
txtFind.Text
If
chkIgnoreCase.Value Then Find=Ucase(Find)
If
Find = "" Then Exit Sub
LenFind
= Len(Find)
‘используется
ссылка на объект txtEditBox в форме frmain,
LenSourse
= Len(frmmain!txtEditBox.Text)
For
Location = frmmain!txtEditBox.SelStart To LenSourse
frmmain!txtEditBox.SelStart
= Location
frmmain!txtEditBox.SelLength
= LenFind
thisSelection=
frmmain!txtEditBox.SelText
‘при
включенном переключателе IgnoreCase изменяет
регистр
‘выделенного
текста (thisSelection), прописные и строчные
‘буквы
не
различаются
If
chkIgnoreCase.Value Then _
thisSelection=Ucase(thisSelection)
If
thisSelection = Find Then frmFind.Hide: Exit Sub
Next
Location
End Sub
Private
Sub cmdCancel_Click()
frmFind.Hide ‘
закрыть форму
End Sub
Измените
тексты процедур формы Мой текстовый
редактор :
Sub
mnuSearchFind_Click()
frmFind.Show ‘
показать форму
End Sub
Private
Sub Text1_Change()
End Sub
Private
Sub txtFind_Change()
End
Sub Укажите
в каких случаях предпочтительнее
использовать тот или иной синтаксис
оперетора If … Else. Когда
предпочтительнее использовать оператор
Select…Case? Укажите
в каком порядке в операторе Select…Case
указывают исключения и диапазоны. В
чем различие синтаксисов цикла Do
… Loop? Когда
предпочтительнее использовать
арифметический цикл For
… Next? Как
добавить в проект новую форму? Как
активизировать и закрыть дополнительную
форму? Лабораторная работа
№ 5 СОХРАНЕНИЕ И ОТКРЫТИЕ
ФАЙЛОВ.
Цель работы: Освоить приемы
программирования работы с файлами. 1. Теоретическая часть 1.1. Файлы
Информацию зачастую
требуется не только анализировать, но
и сохранять. Для сохранения информации
предназначены операторы обработки
файлов, позволяющие считывать и
сохранять данные на различных носителях
(гибкий либо жесткий диск и т.п
).
Процесс открытия
и сохранения файлов состоит из нескольких
этапов-
• получение
дескриптора файла (handle);
• открытие файла;
• чтение или запись
данных;
• закрытие файла.
При открытии, файлу
ставится в соответствие канал с
определенным номером. Таким образом,
каждый открытый файл имеет собственный
канал, с помощью которого записываются
или считываются данные. Следовательно,
для ввода и вывода данных в файл имеет
значение не имя файла, а номер канала.
Кроме того, операционная система должна
иметь сведения о наличии свободных
каналов, которые можно использовать
для открытия файла. Функция Visual
Basic FreeFile
возвращает номер свободного канала,
который можно использовать для работы
с файлом.
intFH
= FreeFile(RangeNumber)
В этом примере
переменной intFH присваивается
целое значение, которое можно использовать
для открытия файла. Необязательный
параметр RangeNumber
позволяет определить диапазон
значений, из которого выбирается
очередной свободный номер канала. Если
его значение равно 0 (по
умолчанию), то возвращается номер канала
из диапазона 1— 255, если
1, то из диапазона 256 —
511.
Если свободных
каналов нет (открыто максимально
допустимое количество файлов), возникает
ошибка выполнения.
Для уменьшения
вероятности появления такого рода
ошибки и корректного завершения работы
приложения все открытые файлы следует
закрыть. Закрытие файлов выполняет
оператор Close:
Close
#intFH
'закрывает файл, описываемый дескриптором
intFH
Close
intFH
'использование # необязательно
Close
'Закрывает
все файлы, открытые приложением
Если дескриптор
указан, то закрывается соответствующий
файл, если нет, то закрываются все
открытые файлы. Все открытые файлы
закрываются и при завершении работы
приложения, запущенного из среды
разработки.
В Visual
Basic реализованы три типа
доступа к файлам: последовательный
(Sequential) — для чтения и
записи текстовых файлов; произвольный
(Random) — для чтения и
записи текста или структурированных
двоичных файлов с записями фиксированной
длины; двоичный
(Binary) — для чтения и
записи произвольно структурированных
файлов.
При создании
коммуникационных каналов система
должна знать, какой тип доступа к каждому
конкретному файлу нужно использовать
и какова структура данных этого файла.
Последовательный
доступ используется главным образом
при работе с текстовыми файлами.
Любая информация считывается или
сохраняется в текстовом виде построчно.
В тексте могут находиться символ
перевода строки (vbCrLf или
Chr (13) &
Chr (10)) или
табулятор (vbTab или Chr
(9)). Эти символы используются для
форматирования текста.
Способ открытия
файла с последовательным доступом (для
чтения, записи или добавления) задается
при вызове оператора Open:
Open
Имя_файла
For [Input/Output/Append] As filehandle Таблица
1. Разшчныс операционные
возможности, для последовательного
доступа
Ключевое слово
Описание
Input
Открытие только
для чтения из файла
Output
Открытие для
записи в файл
Append
Открытие для
добавления к файлу
Если файл не
существует и открывается для чтения
(For Input), то
Visual Basic
выдает сообщение об ошибке, а если для
записи или добавления (Output
или Append), то создается
новый файл. Если файл с указанным именем
существует, то в режиме Output
его содержимое удаляется, а в режиме
Append файл открывается для
добавления:
Open
"С\README.ТХТ"
For Input As intFHl
Open
"С\TEXT.ТХТ"
For Output As intFH2
Open
"C\USERS.TXT" For Append As intFH3
В конце строки
указывается номер канала, возвращаемый
функцией FreeFile.
Для считывания
данных из файла, открытого для
последовательного доступа, существует
несколько возможностей. В общем случае
это осуществляется с помощью оператора
Input, имеющего несколько
разновидностей Line
Input# считывает одну строку, Input#
считывает последовательность символов,
обычно записанных с помощью оператора
write#, Input$
считывает определенное количество
символов
Существует несколько
вариантов чтения всей информации из
файла. Перед чтением нужно открыть файл
с помощью оператора Open
… For
intFH
= FreeFile
Open
"С:\Text.Txt"
For Input As intFH
'1-ый
вариант
Do
Until EOF(intFH)
Line
Input #intFH, strString
strText
= strText &
strString &
vbLf
Loop
'2-ой
вариант
strText
= Input$(LOF(intFH),
intFH)
Close
#intFH
Оба варианта
приводят к одинаковому результату
В первом варианте
оператор Input выполняется
в цикле, пока не будет достигнут конец
файла Функция eof
(End Of
File) возвращает значение
True при достижении конца
файла. При этом на каждом шаге цикла
считывается отдельная строка и к ней
добавляется символ конца строки, который
отбрасывается оператором Line
Input.
Во втором варианте
весь файл считывается функцией Input$.
Функция lof
(Length Of
File) позволяет определить
длину файла в байтах.
Заметим также, что
независимо от вида оператора Input
указывается не имя файла, а только номер
канала, т.е. дескриптор файла (intFH).
В Visual
Basic для записи информации
в файл используются операторы Printf#
и
Write#. Print#
Оператор Print#
функционирует аналогично оператору
Print для экрана, но
данные не выводятся на экран, а сохраняются
в файле, открытом для записи или
добавления (Open...
For Output или
Open... For
Append).
Print
#номер_канала, [(Spc(n)
I Tab[(n)]}]
[выражение] [позиция]
Для форматирования
записываемой в файл информации следует
по-разному разделять данные в операторе
print. Если в операторе
данные разделять запятыми
(,), то в файле они будут разделены
символами табуляции.
Print
#intFH, "Фрагмент
I", "
Фрагмент
2"
'соответствует
Print
#intFH,
"Фрагмент I";
Tab;
"Фрагмент
2"
Если же в операторе
для разделения данных использовать
точку с запятой (;), то
данные в файл записываются без
разделителей.
Print
tintFH,
"Это составляет
"; "единое
целое"
'соответствует
Print
#intFH,
"Это составляет единое целое" Write#
Оператор Write#
имеет такой же синтаксис, что и Print#.
Отличие состоит только в форматировании
вывода: Write#
заключает текстовые строки в кавычки,
а цифры выводятся без кавычек:
Print
#intFH, "Анна", "Киев",
17
'
в файле будет: Анна Киев
17
Write
#intFH, "Анна", "Киев",
17
'
в файле будет: "Анна","Киев",17
Данные, сохраненные
с помощью оператора Write#,
можно считать оператором
Input#
В отличие от
последовательного доступа, при
котором данные в файлах хранятся в
неструктурированном виде, произвольный
доступ предполагает, что файл имеет
постоянную структуру. Это позволяет
считывать данные в произвольном порядке.
Произвольный
доступ реализуется посредством оператора
Open.
Open
Имя_файла For
Random
[Access
Доступ] [Блокировка]
As
[#] _
Номер_канала
[Len
= Длина_эаписи]
Параметр
Len определяет
длину записи. Если это значение меньше,
чем реальная длина записи, то возникает
ошибка, если больше — то
при записи файла используется больше
дискового пространства, чем необходимо.
Параметр Access
позволяет задать права доступа к
открываемому файлу.
Таблица
4 7 Виды
доступа при произвольном доступе
Доступ
Пример
Без указания
Open
"DATE DAT"
For Random As
intFH
Чтение
(Read)
Open
"DATE DAT"
For Random Access Read As
intFH
Запись
(Write)
Open
"DATE DAT"
For Random Access Write As
intFH
Чтение и запись
(Read
Write)
Open
"DATE.DAT" For
Random Access Read Write As
intFH
Если права доступа
не указаны, то по умолчанию используется
Read Write Так
как этот тип доступа обычно предназначен
для работы с файлами, которые могут
использоваться многими пользователями
или приложениями, то следует обеспечить
целостность данных при коллективном
использовании. Для этого следует
установить параметр Lock,
определяющий права доступа к открытому
файлу Этот параметр может принимать
следующие значения:
• Shared
Файл может
использоваться всеми процессами для
считывания и записи.
• Lock
Read
Никакой другой
процесс не может считывать данные из
файла. Данный параметр можно установить,
если в данный момент никакой другой
процесс не выполняет операцию чтения.
• Lock
Write
Никакой другой
процесс не может записывать данные в
файл. Данный параметр можно установить,
если в данный момент никакой другой
процесс не выполняет операцию записи.
• Lock
Read Write
Никакой другой
процесс не может считывать или записывать.
Данный параметр можно установить, если
в данный момент не выполняются операции
чтения или записи.
Параметр Len
задает длину одной записи Для задания
длины можно использовать функцию
Len
Open
"ADDRESS DAT" For Random Access Write As
1 Len = 27
Open
"ADDRESS DAT" For Random Access Write As
1 Len =
Len(Varname)
При этом важно,
чтобы при открытии файла была известна
длина набора данных, что может быть
проблематичным, если происхождение
файла неизвестно
Для записи и чтения
данных используются соответственно
операторы put и Get
Put
#номер_канала,
Номер_записи, Переменная
Get
#номер_канала,
Ноыер_записи, Переменная
В данном примере
в файл записываются данные из переменной
Address, причем номер записи
равен 7, а затем в переменную
Address считывается вторая
запись файла
Put
#intFH, 7,
Address 'сохраняет 7-ую запись
Get
#intFH, 2,
Address 'считывает 2-ую запись
Для того чтобы в
одной записи иметь несколько значений
различных типов, следует использовать
пользовательские типы данных:
(General)(Declaration)
Type
Person
FirstName
As String * 20
Name
As String * 20
CustomerN
As Integer
End
Type
Private
Customer As Person
'Процедура
Private
Sub Commandl_Click()
intFH
= FreeFile
Open
"C \LORE DAT" For Random As intFH Len
= Len(Customer)
Get
#intFH, 2,
Customer
Close
tintFH End Sub
Двоичный доступ
незначительно отличается от произвольного
доступа. Разница состоит в том, что
двоичный доступ возможен не к определенному
набору данных, а к отдельному байту
внутри любого файла.
Для открытия
двоичного файла также используется
оператор Open Open
Имя_файла For
Binary
[Access
Доступ][Блокировка]
As
[#]Номер_ канала
Формат оператора
Open при двоичном
доступе похож на формат этого оператора
при произвольном доступе. Главное
отличие состоит в том, что вместо
ключевого слова Random
указывается Binary, а
параметр Len отсутствует,
так как записи имеют фиксированную
длину — 1 байт.
Open
"SPOCK.VUL" For Binary As intFH
Для считывания и
записи в файл используются также
операторы Get и Put.
Синтаксис их такой же, как при произвольном
доступе, только вместо номера записи
указывается номер байта:
Get
tintFH, 5, Var
'считывает 5-й байт
Put
#intFH, 78, Var
'записывает 78-й байт
Если данные
считываются в строку, количество
считываемых байтов равно длине строки.
str0utput$
= String(14, " ")
Get
#intFH, 26,
str0utput$
В данном примере
в строку считывается 14
байтов, начиная с 26-го байта файла. Добавить
к проекту новую форму ( Project/Add
Form/New). Включить
в форму следующие инструменты: две
командные кнопки CommandButton, четыре
надписи, поле со списком ComboBox,
список устройств DriveListBox,
список каталогов DirectoryListBox,
список файлов FileListBox. Установить
параметры. Написать
код процедур окна диалога
Private
Sub Form_Load()
'
открытие формы
'
копирует путь списка каталогов в
надпись, показывающую
' текущий
каталог (label4)
Label4.Caption
= Dir1.Path
InitialPattern
= "*.txt"
Combo1.Text
= InitialPattern
File1.Pattern
= InitialPattern
Combo1.AddItem
InitialPattern
Combo1.AddItem
"*.ini"
Combo1.AddItem
"*.bat"
Combo1.AddItem
"*.frm"
End Sub
Private
Sub cmdCancel_Click()
frmOpen.Hide
End Sub
5.
Написать код процедур событий элемента
«поле со списком»:
Private
Sub Combo1_Change()
'
вводится шаблон в комбинированное окно
' при
вводе шаблона в комбинированное окно
' список
файлов показывает файлы, соответствюущие
'
новому
шаблону
File1.Pattern
= Combo1.Text
End Sub
Private
Sub Combo1_Click()
'
выбирается строка из ниспадающего
списка комб.окна Combo1
File1.Pattern
= Combo1.Text
End Sub
6.
Написать код процедуры смены директория:
Private
Sub Dir1_Change()
'
изменение каталога в списке каталогов
Dir1
'
устанавливает путь списка файлов File1
равным установленному
'
пользователем в списке каталогов Dir1
File1.Path
= Dir1.Path
'
копирует путь списка каталогов в
надпись, показывающую
' текущий
каталог (label4)
Label4.Caption
= Dir1.Path
End Sub
7.
Написать код процедуры смены устройства:
Private
Sub Drive1_Change()
'
изменение диска в окне списка дисков
Drive1
' переход
на блок обработки ошибки On
Error GoTo diskProblem
' при
выборе нового диска из списка дисков
Drive1 каталоги этого диска
'
отображаются в списке каталогов Dir1
Dir1.Path
= Drive1.Drive
Exit
Sub
diskProblem:
Drive1.Drive
= Dir1.Path
MsgBox
"Дискета не установлена", 48, "Ошибка
диска"
Exit
Sub
End Sub
7. Написать код
процедур определения имени файла
Private
Sub File1_Click()
' выбор
файла из списка файлов File1
' в
текстовое окно FileName копируется имя
файла,
'которое
пользователь выбирает в списке файлов
File1
txtFileName.Text
= File1
End Sub
Private
Sub txtFileName_Change()
If
txtFileName.Text = "" Then
'
параметр Enabled определяет, включено ли
средство управления
cmdOpen.Enabled
= False
Else
cmdOpen.Enabled
= True
End
If
End Sub
Проверить
работу программы открытия файла. Сохранить
проект. Что
такое дескриптор файла? Какие
возможности обеспечивают файлы с
последовательным доступом при различных
способах открытия? В
чем состоит отличие операторов вывода
Write# и Print#? Чем
отличаются файлы с последовательным
доступом от файлов с произвольным
доступом? Ограничение
доступа и блокировки в файлах с
произвольным доступом. Что
такое длина записи? Особенности
файлов с двоичным доступом. Лабораторная работа
№ 6 РЗРАБОТКА ГРАФИЧЕСКИХ
ПРИЛОЖЕНИЙ
Цель работы:
Освоить приемы работы с графическими
объектами и методами. 1. Теоретическая часть 1.1. Графические
элементы управления
Графические
изображения можно поместить в один из
следующих элементов управления
• форму,
• элемент PictureBox,
• элемент ImageBox
Основное различие
между этими элементами состоит в том,
что элемент ImageBox
спроектирован для отображения рисунков,
а не для их создания или управления
ими. В остальных двух элементах
предусмотрены методы рисования,
позволяющие во время работы приложения
создавать графические изображения
Чтобы загрузить
в элемент изображение (растровый рисунок
или значок) в режиме проектирования
необходимо назначить в окне свойств
элемента имя файла в качестве значения
свойства Picture элемента.
Во время выполнения приложения следует
воспользоваться функцией LoadPictur(),
приведенной ниже.
Если графическое
изображение вставляется в элемент во
время конструирования, то оно
сохраняется вместе с приложением в
файле с расширением FRX.
В качестве альтернативы можно загрузить
графическое изображение на этапе
выполнения приложения, используя
функцию LoadPicture() В
этом случае размер файла FRX
уменьшается, однако следует гарантировать
доступ приложения к файлу с изображением.
Векторные рисунки
не загружают — они
генерируются кодом программы.
Как правило,
графические изображения помещают в
элементы ImageBox или
PictureBox Элементы
ImageBox удобны для
отображения рисунков и требуют меньше
ресурсов, чем элементы PictireBox
Элементы PictureBox могут
формировать изображение во время
выполнения приложения. В каждом элементе
предусмотрены свойства, позволяющие
контролировать отображение рисунка.
Если значение
свойства Stretch
установлено равным True,
то размер изображения изменяется так,
чтобы оно заполнило всю поверхность
элемента ImageBox.
При различном соотношении размеров
элемента и изображения последнее
искажается. Если же значение свойства
Stretch установить равным
False, то элемент
ImageBox ведет себя
подобно элементу PictureBox,
у которого значение свойства AutoSize
установлено в True.
Если значение
свойства AutoSize
элемента установлено равным True,
размеры элемента изменяются в соответствии
с размерами вставленного в него
изображения. Если же значение свойства
AutoSize - False,
отображается только та часть изображения,
которая помещается в элемент.
Для загрузки
изображения в элемент во время выполнения
приложения используют метод LoadPicture.
Form1.Picture
= LoadPicture(fileName)
Здесь fileName
— имя графического файла. Возможные
расширения этого имени: BMP
- растровый рисунок (Bitmap); GIF
- формат обмена графическими данными
(Graphics Interchange
Format); JPG
- объединенная экспертная группа
по фотографии (Joint
Photographic Experts
Group); DIB
- аппаратно-независимый растровый
рисунок (Device Independent
Bitmap); WMF
- метафайл
Windows {Windows MetaFile); EMF
- усовершенствованный метафайл
(Enhanced MetaFile); ICO
— значок
(Icon).
Если использовать
метод LoadPicture без
аргументов, то текущее изображение
будет выгружено из элемента вместе с
остальными рисунками и текстом,
введенными в элемент или форму
командами Circle, Line,
PSet или Print.
Таким образом, чтобы удалить графическое
изображение из элемента PictureBox
(или любого другого, который может
отображать рисунок), используйте команду
Picturel.Picture
= LoadPicture()
Этот метод подобен
методу CIs, удаляющему
содержимое формы или элемента. При
обработке изображения во время работы
приложения его сохраняют с помощью
оператора SavePicture.
Синтаксис этого оператора следующий:
SavePicture
picture, filename
Аргумент picture
- это свойство Picture
элементов PictureBox или
ImageBox, содержимое
которых сохраняется, a
filename - имя
файла, сохраняющего изображение
Следующий оператор
сохраняет в файле содержимое элемента
Picture1:
SavePicture Picturel.Picture,
"с:\tmpimage.bmp"
Файл будет пустым,
если для сохранения содержимого
элементов PictureBox
использовать оператор
SavePicture,
а значение свойства AutoRedraw
элемента установить в False.
Для сохранения в файле содержимого
элемента PictureBox
перед загрузкой или созданием
любого изображения установите значение
свойства AutoRedraw равным
True. Свойство
AutoRedraw подробно рассмотрено
в конце главы.
Оператор SavePicture
может сохранять только файлы с расширением
bmp. Таким образом,
в диалоговом окне FileOpen
можно отображать файлы с расширением
bmp, gif или jpg.
Однако в диалоговом окне FileSave
можно задавать только расширение
bmp
(или dib).
Свойство Image,
родственное свойству Picture,
указывает область памяти, в которой
хранятся биты изображения. В отличие
от свойства Picture
свойство Image доступно
только для чтения. Оно используется
для передачи рисунков
API-функциям.
Используя свойство
Picture, можно копировать
только изображение, загруженное с
помощью метода LoadPicture.
Свойство Image позволяет
копировать все изображение, в том
числе фигуры, нарисованные в то время,
когда значение свойства AutoRedraw
было установлено равным True,
если AutoRedraw во время
прорисовки установлено False,
то копирование невозможно.
Прежде чем приступить
к рисованию необходимо ознакомиться
с понятиями координат и системы
координат, а также с их использованием
в процессе рисования.
Координаты
описывают положение отдельных пикселей
на экране или точек на листе бумаги,
распечатанной с помощью принтера. Номер
столбца - это координата
по вертикали, Y. Номер
строки - координата по
горизонтали, X. Любую
точку формы можно идентифицировать
заданием координат Х и Y.
Мы ссылаемся на нее как на точку с
координатами (X, Y) или
просто на точку (X, Y) (рис.
1) Значения координат по оси Х
находятся в диапазоне от 0
до 100, а по оси Y
— от -50 до +50.
Любая пара чисел в диапазоне от
0 до 100 и от
-50 до +50 задает точку
на форме.
Рис. 1. Любая точка
на форме идентифицируется координатами
Х и Y
Точку с наименьшими
значениями координат называют началом
системы координат. В Visual
Basic она расположена в
левом верхнем углу элемента или формы.
Значения координаты Х возрастают
вправо, а Y — вниз.
Программа Visual
Basic поддерживает несколько
систем координат, в том числе
пользовательские, допускающие любые
единицы измерения. Если вы знакомы с
компьютерной графикой ранних языков
программирования или операционных
систем, то, вероятно, привыкли использовать
системы координат, основанные на
пикселях. Фактически, пиксели
- не самые удобные единицы измерения
для всех приложений. Применение пикселей
для указания содержимого элемента
привязывает вас к конкретной разрешающей
способности. Тогда при изменении
разрешающей способности монитора
содержимое элемента будет выглядеть
иначе. Может измениться даже
соотношение размеров, и окружности
превратятся в эллипсы.
В стандартной
системе координат Visual
Basic используют единицы,
называемые твипами. Твип равен
1/20 доле пункта. Пунктом называют
единицу измерения, принятую в полиграфии.
В одном дюйме содержится 72
пункта или 1440 твипов.
Твип — точная единица
измерения, возможно, более точная, чем
нужно. Тем не менее, она позволяет
рисовать изображения, которые неплохо
смотрятся даже при печати на лазерном
принтере с разрешением 1200
dpi. Поскольку твипы
невозможно использовать всегда и
везде, в программах Visual
Basic предусмотрены еще 8
систем координат (табл. 1). Таблица 1. Системы
координат Visual Basic
Имя константы
Значение
Единицы измерения
Примечание
VbUser
0
Система координат,
определяемая пользователем
vbTwips
1
Твипы
1440 твипов на дюйм
vbPoints
2
Пункты
72 пункта на дюйм
vbPixels
3
Пиксели
vbCharacters
4
Единицы,
определяемые размером символов
120 твипов по
горизонтали и 240 твипов по вертикали
vbInches
5
Дюймы
vbMillimeters
6
Миллиметры
vbCentimeters
7
Сантиметры
Для перехода от
стандартной системы координат к другой
установите соответствующее значение
свойства ScaleMode.
Изменение значения свойства ScaleMode
не влияет на размер и другие характеристики
элемента. Изменяется только плотность
сетки, используемой для указания точек
элемента.
Эти свойства
определяют фактические размеры элемента
управления, поэтому их значения всегда
выражаются в единицах контейнера,
содержащего элемент Предположим, вы
поместили элемент PictureBox
на форму, в системе координат которой
использовались твипы. Тогда значения
свойств Width и Height
элемента также выразятся в твипах. При
изменении системы координат элемента,
значения этих свойств остаются прежними!
Если изменить размеры элемента на
форме, перемещая его маркеры указателем
мыши, то значения свойств Width
и Height изменятся и
будут отображать новое значение размера
элемента. Также значения этих свойств
изменяются при изменении системы
координат контейнера, отображая размеры
элемента в новой системе координат.
Свойства Left
и Top - это координаты
верхнего левого угла элемента Значения
этих свойств устанавливаются в системе
координат контейнера. При изменении
их значений элемент перемещается. При
изменении системы координат контейнера,
значения этих свойств также изменяются,
отражая положение элемента в новой
системе координат.
Свойство ScaleMode
устанавливает (или возвращает) текущую
систему координат элемента. Чтобы
перейти в новую систему координат,
установите значение этого свойства
равным одному из указанных в табл.
1. Если установить значение свойства
равным 0
(User),
то следует установить значения свойств
ScaleWidth и ScaleHeight.
И наоборот, если вы сами установите
значения свойств ScaleWidth
и/или ScaleHeight, то
значение свойства ScaleMode
автоматически устанавливается равным
0.
Свойства ScaleWidth
и ScaleHeight
представляют собой внутренние размеры
элемента в единицах измерения текущей
системы координат. Изменение системы
координат не изменяет размер элемента,
а только число единиц, которые могут
разместиться по двум осям координат.
Допустим, элемент PictureBox
размещен на форме шириной
2880 твипов и высотой 2880
твипов, т.е. примерно 2х2
дюйма. Значения свойств Width
и Height формы равны
2880. Если изменить единицы системы
координат формы на дюймы, то размеры
элемента останутся прежними, а значения
его свойств ScaleWidth и
ScaleHeight станут равными
2.
Значение координаты Х средней
точки, прежде равное 1440,
станет равным 1.
Кроме того, можно самому задать значения
этих свойств. В этом случае вы автоматически
переключитесь в пользовательскую
систему координат (значение свойства
ScaleMode установится равным
нулю).
Свойства ScaleLeft
и ScaleTop —
это координаты верхнего левого угла
элемента в пользовательской системе
координат. Система координат не
обязательно начинается с нулевых
значений. Значение свойства ScaleLeft
представляет собой минимальное
значение, которое может иметь координата
X.
Максимальное значение координаты Х
равно ScaleLeft+ScaleWidth.
Предположим, вам необходимо нарисовать
объект размером 12x10,
при этом значения координаты Х
объекта должны начинаться со
100,
a Y
- с 300.
Тогда систему координат следует задать
следующим образом.
Form1.ScaleWidth
= 12
Form1.ScaleHeight
= 10
Form1.ScaleLeft
= 100
Form1.ScaleTop
= 300
В этом случае
область значений координаты Х будет
находиться в диапазоне от 100
до 112,
а Y
- от 300
до 310.
Метод Scale
- удобный способ установки пользовательской
системы координат. В методе используется
следующий синтаксис.
Form1.Scale
(XI, Y1) -
(Х2, Y2)
Здесь
(X1, Y1) - координаты
верхнего левого угла элемента, а (Х2,
Y2) — нижнего правого. Метод Scale
указывает на то, что размер элемента
по горизонтали равен Х2—Х1+1, а по
вертикали — Y2—Y1+1
единиц. Они относятся к адресному
пространству элемента и не влияют на
его внешние размеры.
Метод Scale
вызывается следующим образом.
Form1.Scale
(0, 0) - (11, 7)
Данный оператор
эквивалентен следующим определениям:
Form1.ScaleTop
= О
Form1.ScaleLeft
= О
Form1.ScaleWidth
= 11
Form1.ScaleHeight
= 7
Все свойства, имена
которых начинаются с префикса Scale,
используют пользовательскую систему
координат. Установка значения любого
из них переключает вас в эту систему
координат и устанавливает значение
свойства ScaleMode равным
0, однако не перемещает и не изменяет
размеры элемента управления или формы.
В некоторых случаях
необходимо выразить новый размер
элемента в заданной системе координат
без изменения системы координат
контейнера. Пусть, например, система
координат формы соответствует значению
1 (твипы), а вам необходимо поместить
на форму элемент PictureBox
с точными размерами 1,20х2,00
дюймов. Прежде всего, необходимо
пересчитать размеры элемента в твипах,
а затем присвоить полученные значения
свойствам Width и Height
Как вы помните, дюйм равен
1440 твипам, поэтому расчет не
составляет труда Тем не менее, в программе
Visual Basic
предусмотрены методы ScaleX
и ScaleY
для преобразования единиц двух систем
координат Синтаксис обоих методов
идентичен
Form1.ScaleX
(width, fromscale, toscale)
Здесь аргумент
width представляет
собой величину в соответствующих
единицах измерения, которую необходимо
преобразовать, fromscale
— система координат, из которой
единицы измерения должны конвертироваться,
a toscale
- система координат, в которую
следует конвертировать единицы
измерения. Аргументы fromscale
и toscale могут
иметь одно из значений, приведенных в
табл. 1.
Допустим, вам
необходимо установить элемент Picture1
шириной 200 и высотой 140
пикселей. Форма, на которой расположен
этот элемент PictureBox,
использует стандартную систему
координат, т.е. твипы. Следовательно,
значения свойств Width
и Height элемента Picture1
тоже необходимо выразить в твипах.
Чтобы преобразовать 200
пикселей в твипы, используйте оператор
WidthTwips
= Form1.ScaleX(200,
vbPixels, vbTwips)
Точно так же можно
преобразовать в твипы высоту элемента,
равную 140 пикселям
HeightTwips
= Forml.ScaleY(140,
vbPixels, vbTwips)
Затем используйте
результаты для установки размеров
элемента в твипах
Picturel.Width
= WidthTwips
Picturel.Height
= HeightTwips
Свойства
TwipsPerPixelX и
TwipsPerPixelY применяют
к объекту Screen (Экран) и
возвращают число твипов на пиксель
объекта, измеренное по горизонтали
(TwipsPerPixelX)
или вертикали (TwipsPerPixelY)
Основным понятием
при рисовании является текущая точка
(current point)
Программа Visual Basic
позволяет рисовать фигуры без указания
начальной точки. Если начальная точка
линии не указана, то ею становится
текущая точка. После того, как линия
проведена, текущей становится ее
конечная точка. Свойства CurrentX
и CurrentY устанавливают
или считывают координаты текущей точки
в единицах текущей системы координат.
Чтобы отобразить на форме строку с
конкретными координатами, установите
их в свойства CurrentX и
CurrentY, а затем используйте
метод Print для отображения
строки
В программах Visual
Basic используются следующие
методы рисования: Print
— отображение строковых данных; Line
— рисование линий и прямоугольников; Circle
- рисование окружностей и дуг; Point
- возврат значения Color
(Цвет) точки; PSet
— установка значения цвета точки.
Метод Print
не имеет отношения к принтеру. Он
предназначен для вывода текста в форму
или элемент управления. В методах Line
и Circle используют
аргументы, расширяющие возможности
рисования сложных геометрических
фигур, наподобие эллипсов, залитых
фигур и кольцевых диаграмм. Методы
Point и PSet
применяются для манипулирования
пикселями в приложениях, обрабатывающих
изображения, и для рисования кривых,
которые строятся по точкам.
К простейшим
методам рисования относится метод
Print, позволяющий выводить
текст в форму или элементы PictureBox,
начиная с текущей точки. При выводе
используют текущие установки шрифта
и его размера. По окончании вывода
текущая точка переходит в конец текста.
Следующий оператор
выводит строку в верхней части элемента
PictureBox.
Picturel.Print
" Рисование средствами Visual
Basic"
Кроме того, этот
оператор переводит текущую точку в
следующую строку, подобно печати в
элементе TextBox,
допускающем наличие нескольких строк.
Следующая строка, которую вы будете
печатать в этом элементе, отобразится
под первой строкой.
Длинные текстовые
строки не переносятся автоматически
по достижении правого края элемента.
В программном коде следует предусмотреть
разбивку длинных текстовых строк на
строки меньшей длины до начала вывода.
Для выравнивания
текста на форме или элементе используют
методы TextWidth и
TextHeight.
Данные методы принимают строку в
качестве аргумента, а возвращают,
соответственно, ширину и высоту текста.
Объекты Form, Printer,
а также элемент PictureBox,
воспринимающие графические методы,
имеют свойства TextWidth
и TextHeight. В
значениях этих свойств указываются
требуемые длина и ширина поля печати
строки на принтере с текущими установками
шрифта.
Метод рисования
линий, называемый Line,
имеет следующий синтаксис.
Line[Step]
(X1, Y1) -
[Step] (X2, Y2), [color], [В] [F]
Аргументы в
квадратных скобках являются
необязательными. Начальная точка линии
имеет координаты XI
и Yl,
конечная — X2,
Y2. Следующий оператор демонстрирует
простейший способ использования этого
метода.
Line
(X1, Y1) - (X2, Y2)
Координаты конечной
точки линии выражаются в единицах
системы координат элемента. Толщина
линии задается свойством DrawWidth,
а стиль - DrawStyle.
Установки стиля приведены в табл.2.
Если толщина линии превышает
1 пиксель, то установки
1 — 4 идентичны установке
0. Иными словами, невозможно нанести
пунктирную или штрих-пунктирную линию
толще одного пикселя. Таблица 2. Значения
свойства DrawStyle
Имя константы
Значение
Тип линий
vbSolid
0
Сплошная (по
умолчанию)
vbDash
1
Штриховая
vbDot
2
Пунктирная
vbDashDot
3
Штрих-пунктирная
vbDashDotDot
4
Штрих-пунктир-пунктирная
vblnvisible
5
Прозрачная
vbInsideSolid
6
Сплошная внутренняя
Смысл каждого
свойства, кроме последнего
— vbInsideSolid,
очевиден. Когда ширина линии превышает
один пиксель. Visual Basic
на обоих концах линии, заданных
координатами, разбивает ее по ширине
пополам. Если установить значение
свойства DrawStyle равным
6 (vbInsideSolid),
то фигура (линия, прямоугольник или
круг) целиком впишется внутри заданных
координат.
Ниже приведена
программа для рисования линий различных
стилей в элементе Picture1.
Private
Sub Picturel_Click()
Dim
I As Integer
Hstep
= Picturel.ScaleHeight
/ 6
For
i = 1 to
6
Picturel.DrawStyle
= i - 1
Picturel.Line
(.1 * Picturel.ScaleWidth,
Hstep * i) - _
(.9
* Picturel.ScaleWidth, Hstep
* i)
Next
End
Sub
Цвет рисунка
задается установкой свойства ForeColor
формы или элемента PictureBox.
Вместе с тем можно рисовать цветными
линиями, задавая значения (необязательного)
аргумента color,
используемого методами Line
и Circle (последний
рассматривается далее). Операторы,
демонстрирующие использование этого
аргумента, показаны ниже.
Line
(10, 10) - (100, 100), RGB(255, О,
О)
Line
(10, 10) - (100, 100), &HOOOOFF
Line
(10, 10) - (100, 100), QBColor(3)
RedColor# = RGB(255,
О, О)
Line
(10, 10) - (100, 100), RedColor#
Во всех трех
примерах прочерчивается красная линия
из точки с координатами (10,
10) в точку (100,
100), независимо от установок
свойства ForeColor. В
качестве аргумента color
метода можно использовать любое
выражение, устанавливающее корректное
значение цвета (color
expression). Обычно цвет линии
определяется установкой свойства
ForeColor элемента, однако
для текущей линии аргумент соlоr
метода Line преобладает
над свойством ForeColor.
Если вы нарисуете другую линию, не задав
аргумент color, то ее
цвет будет соответствовать установке
свойства ForeColor
элемента.
Параметр Step
метода Line позволяет
задать вторую крайнюю точку линии
относительно первой крайней точки. Он
задает не координаты точки, а ее
расстояние от первой точки линии. Для
абсолютных координат точка начала
отсчета определяется свойствами
ScaleLeft и ScaleTop,
a для относительных
— отмеряется от текущей позиции,
где бы она ни находилась. Ниже приведен
оператор, который проводит линию от
точки (100,
100) на 100
единиц вниз и 200 единиц
вправо от начальной точки.
Line
(100, 100) - Step
(300, 200)
Два числа после
параметра Step определяют
не координаты конечной точки, а расстояние
от текущей точки Можно использовать
ключевое слово Step и
перед первым аргументом метода Line.
Тогда начальная точка линии задается
относительно текущей точки (CurrentX,
CurrentY)
Относительные
координаты часто используют для
рисования замкнутых фигур, поскольку
конечную точку проще задать по ее
расстоянию от предыдущей точки.
Предположим, необходимо нарисовать
прямоугольник размером
100х300, верхний левый угол которого
находится в точке (100, 400)
Line
(100, 400) - Step
(100, 0)
Line
- Step(0,300)
Line
– Step(-100,0)
Line
- Step(0,-300)
Достаточно задать
абсолютные координаты только начальной
точки, а для остальных точек
— относительные координаты. Обратите
внимание необязательно задавать первую
точку каждой стороны прямоугольника,
поскольку она совпадает с конечной
точкой предыдущей стороны.
Visual
Basic предоставляет удобный
способ рисования прямоугольников, для
которого в методе Line
используется параметр В
(Box — прямоугольник).
Используя этот параметр, можно нарисовать
прямоугольник, верхний левый угол
которого задан первой парой координат,
а нижний правый угол —
второй. Тогда четыре оператора в
последнем примере (с параметром Step)
можно заменить одной строкой
Line
(100,400) - (200,700), , В
Если аргумент
color опускается,
то необходимо ввести две последовательные
запятые. В противном случае Visual
Basic интерпретирует
параметр В как имя переменной,
задающей цвет прямоугольника.
Относительные
координаты упрощают рисование
прямоугольника. Если необходимо
нарисовать прямоугольник заданного
размера, у которого верхний левый угол
находится в точке (100, 400),
то достаточно одной команды
Line
(100, 400) - Step
(100, 300) , , В
Необходимо лишь
задать координаты верхнего левого угла
и размеры прямоугольника. Преимущество
последнего оператора -
нет необходимости в расчетах Достаточно
только ввести известные размеры
прямоугольника.
Если необходимо
залить прямоугольник, сразу после
параметра В введите параметр F
(Fill — заливка) без запятой.
Проще эти параметры считать двумя
отдельными параметрами: В (прямоугольник)
и BF (залитый
прямоугольник) (поскольку параметр
F
отдельно использовать невозможно).
Цвет заливки определяется свойством
FillColor. Параметр
BF преобладает
над текущей установкой этого свойства
для отдельного прямоугольника точно
так же, как аргумент color
текущего оператора преобладает над
установкой свойства ForeColor
элемента или формы.
Помимо цвета,
замкнутые фигуры можно заливать
различными узорами, зависящими от
установки свойства FillStyle.
По умолчанию замкнутые фигуры прозрачны.
Чтобы нарисовать залитые сплошным
цветом или заштрихованные фигуры,
следует задать одно из значений свойства
FillColor (табл.
3). Таблица 3. Значения
свойства FillStyle
Константа
Значение
Описание
Вид
VbFSSolid
0
Сплошной цвет
vbFSTransparent
1
Прозрачная (по
умолчанию)
vbHonzontalLine
2
Горизонтальная
линия (штриховки)
vb
VerticalLme
3
Вертикальная
линия
vb
Upward'Diagonal
4
Вверх по диагонали
vbDownwardDiagonal
5
Вниз по диагонали
vbCross
6
Накрест
vbDiagonalCross
7
Накрест по
диагонали
Если значение
свойства FillStyle
установить равным любой величине, кроме
1 (прозрачный), то замкнутая фигура
автоматически заливается заданным
узором. Цвет узора определяется значением
свойства FillColor.
Для рисования
кругов, дуг и эллипсов используется
метод Circle Полный синтаксист
метода следующий
Circle
[Step]
(X,
Y),
radius, [color],
[start],
[end],
[aspect]
Здесь Х и Y
— координаты центра круга, a
R — его
радиус Эти аргументы являются
обязательными Они выражаются в единицах
измерения текущей системы координат
В простейшем виде
метод Circle выглядит
как Circle
(X, Y), R
Следующий оператор использует этот
метод для рисования окружности в центре
формы Form1 Circle(Form1.ScaleWidth/2,
Form1.ScaleHeight/2),
Formi.ScaleHeight/3
Радиус окружности
— треть высоты формы. Если высота
формы превышает ее ширину, то часть
окружности может быть невидима
Как и в команде
Line, положение центра
окружности относительно текущей точки
определяет параметр Step.
В отличие от метода Line
метод Circle не позволяет
использовать текущую точку в качестве
центра окружности и опустить ее
координаты. Чтобы нарисовать
окружность с центром в текущей точке,
используйте следующую команду
Circle
Step (0, 0), R
В этом случае
указываются относительные координаты,
даже если они равны нулю
Радиус окружности
необходимо задавать в единицах
горизонтальной оси.
При использовании
аргумента aspect
метод Circle дает
возможность рисовать эллипсы. Aspect
— это отношение вертикального и
горизонтального радиусов эллипса. Если
значение аргумента aspect
больше 1, то эллипс вытянут
по вертикали. На рис.2. показано,
как определяется коэффициент сжатия
(aspect ratio).
Оба эллипса и прямоугольники, в которые
они вписаны, нарисованы следующими
операторами.
SideX
= 1
SideY
=0.75
Side =
2000
Forml.DrawWidth
= 2
Forml.Line
(100, 100)-Step (Side * SideX, Side * SideY), , В
XC =
100 + Side * SideX / 2
YC =
100 + Side * SideY / 2
Forml.DrawWidth
= 1
Forml.Circle
(XC, YC), Side / 2, , , , SideY / SideX
SideX
=0.75
SideY
= 1
Forml.DrawWidth
= 2
Forml.Line
(3000, 100)-Step(Side * SideX, Side * SideY), , В
XC =
3000 + Side * SideX / 2
YC =
100 + Side * SideY / 2
Forml.DrawWidth
= 1
Forml.Circle
(XC, YC), Side / 2, , , , SideY /SideX
Aspect = 0.75
Aspect =1/0.75 Рис.
2. Значение аргумента aspect определяет
степень искажения круга при рисовании
эллипса
Метод Circle
можно использовать для рисования дуг.
Аргументы start и
end указывают
начальный и конечный углы, выраженные
в радианах.
Начальный и конечный
углы измеряются в направлении против
часовой стрелки. Отрицательные углы
не изменяют направление дуги. Они просто
предписывают нарисовать дугу так,
как если бы эти углы были положительными,
а затем соединяют конечную точку,
соответствующую отрицательному углу,
с центром окружности. Такой метод
используют для рисования секторных
диаграмм.
Поскольку окружности
(и соединенные упомянутым способом
дуги) являются замкнутыми фигурами,
они автоматически заливаются узором,
определяемым свойством FillStyle,
и цветом, определяемым свойством
FillColor.
По умолчанию при
рисовании фигур с помощью графических
методов пиксели, составляющие фигуру,
замещают все существующие на элементе
пиксели Однако Visual Basic
может комбинировать новые пиксели
различными способами в зависимости
от установок свойства DrawMode
(Режим рисования) элемента (табл 4)
Большинство из них соответствует
логическим операциям типа AND,
OR или NOT
Стандартной установкой свойства
DrawMode является
13 (vbCopyPen), при задании
которой новые пиксели замещают
существующие Установка 4
(vbNotCopyPen) работает
аналогично, но при ее использовании
цвета рисуемых пикселей инвертируются
Установка значения 9
комбинирует новые пиксели с существующими
с помощью логической операции AND.
Как видите, есть множество способов
комбинировать цвет новых пикселей с
цветом существующих. Таблица 4. Значения
свойства DrawMode
Константа
Значение
Описание
VbBlackness
1
Рисует черным
цветом
VbNotMergePen
2
Обратная установка
15 (vbMergePen)
vbMaskNotPen
3
Объединение
цвета фона и инвертированного цвета
рисования
vbNotCopyPen
4
Обратная установке
13 (vbCopyPen)
vbMaskPenNot
5
Объединение
цвета рисования и инвертированного
цвета фона
vblnvert
6
Инверсия .цвета
рисования
vbXorPen
7
Исключающее ИЛИ
цвета фона и цвета рисования
vbNotMaskPen
8
Обратная установке
9 (vbMaskPen)
vbMaskPen
9
Объединение
общих цветов для рисования и фона
vbNotXorPen
10
Обратная установке
7 (vbXorPen)
vbNop
11
Вывод остается
неизмененным
vbMergeNotPen
12
Объединение
цвета фона и инвертированного цвета
рисования
vb Copy Pen
13
Цвет задается
свойством ForeColor
vbMergePenNot
14
Объединение
цвета рисования и инвертированного
цвета фона
vbMergePen
15
Объединение
цвета рисования и цвета фона
vbWhiteness
16
Рисует белым
цветом
Стандартной
установкой свойства DrawMode
является vbCopyPen,
заменяющая существующие пиксели новыми.
Чаще всего на
практике применяется установка
7 (vbXorPen)
и 10 (vbNotXorPen)
свойства DrawMode. При
использовании DrawMode=7
значения цветов новых пикселей
комбинируются с цветами существующих
пикселей с помощью операции
XOR. Результат
операции будет равен 1
только в том случае, если биты различны.
Если они одинаковы (оба равны
0 или 1), то результат
будет 0. Давайте посмотрим,
как работает операция XOR.
В окне проверки (если оно в данный момент
невидимо, используйте команду Immediate
меню View) введите
приведенные ниже операторы (для просмотра
результата нажимайте клавишу Enter
после каждого введенного оператора
Print).
print
184 XOR 45
149
print
149 XOR 45
184
print
149 XOR 184
45
Результатом
применения операции XOR
к числам 184 и
45 будет новое число 149.
Если его с помощью операции
XOR скомбинировать с одним из двух
исходных чисел, результат будет равен
другому исходному числу. Это уникальное
свойство операции XOR,
которое делает ее полезной во многих
ситуациях, например, для решения задач
шифрования данных. И в самом деле, в
основе каждого алгоритма шифрования
можно найти операцию XOR.
Да, но как все это
связано с графикой Visual
Basic? Если нарисовать линию
в режиме XOR, то она
"наложится" поверх существующих
пикселей. Если нарисовать другую линию
поверх первой, то последняя исчезнет,
восстановив лежащие ниже пиксели. Режим
рисования XOR имеет
интересное свойство: при первой
прорисовки фигуры вы увидите ее на
экране, отображенной поверх его
содержимого. При этом изменяется только
цвет первоначального изображения.
Если снова нарисовать эту же фигуру,
конечным результатом будет ее
удаление без всякого воздействия на
первоначальное изображение.
Наиболее используемый
режим рисования XOR - это
рисование резиновых линий. Резиновой
линией называется линия, один конец
которой зафиксирован, а другой движется,
следуя перемещениям указателя мыши.
Вы можете видеть такой инструмент в
действии почти в любом графическом
приложении. Посмотрим, как можно
использовать такие методы в собственных
приложениях.
Для реализации
резиновой линии используют три события
MouseDown, MouseMove
и MouseUp.
Событие MouseDown
сигнализирует о положении стартовой
точки резиновой линии. Ее координаты
должны быть сохранены в двух переменных,
областью видимости которых является
форма. Назовем их XStart
и Ystart.
Установим свойство DrawMode
равным 7 (XOR),
чтобы можно было непрерывно удалять
предыдущую линию пока перемещается
указатель мыши, Visual Basic
генерирует события MouseMove.
При каждом событии MouseMove
требуется стереть предыдущую линию и
нарисовать новую от стартовой до
текущей точки. Чтобы стереть предыдущую
линию, сохраните координаты предыдущей
конечной точки в двух дополнительных
переменных XOld
и YOld, областью
видимости которых также является форма
Обработчик события MouseMove
должен рисовать одну линию между точками
(XStart, YStart)
и (XOld, YOld),
а другую — из той же
стартовой точки в текущую. Первая линия
сотрет предыдущую резиновую линию, а
вторая станет текущей резиновой линией,
которая будет стерта при следующем
событии MouseMove.
При отпускании
кнопки мыши, последнюю линию следует
нарисовать в стандартном режиме
(COPY_PEN).
Но вначале сотрите предыдущую от
(XStart, YStart)
до (XOld,
YOld),
прорисовывая поверх нее другую линию
в режиме XOR. Обработчик
события стирает последнюю резиновую
линию, мгновенно изменяет режим
рисования на COPY_PEN
и рисует линию между исходной точкой
(XStart, YStart)
и точкой (X,
Y), в которой
кнопка была отпущена.
Методы Line
и Circle позволяют
рисовать гистограммы и секторные
диаграммы. А как нарисовать график
сложной математической функции? Для
рисования кривой (рис.3)
необходим программный код, который
рисует каждую ее точку. Разумеется,
рисовать кривые не так просто, как
рисовать линии, но средства Visual
Basic позволяют решить эту
задачу.
Рис.
3. График функции exp(2/t)*sin(2*t)
Предположим,
необходимо нарисовать график функции
exp(2/t)*sin(2*t)
для значений от 1 до
10. Переменная t
используется для обозначения времени,
отсчитываемого по оси абсцисс.
Следовательно, по оси Х необходимо
установить пользовательский масштаб
в диапазоне от 1 до
10. Перейдем к вертикальной оси.
Прежде всего, необходимо угадать или
рассчитать минимальное и максимальное
значения функции в диапазоне значений
аргумента 1—10, а затем
установить соответствующий масштаб.
Чтобы построить
график функции, необходимо рассчитать
ее значения при последовательных
значениях Х и отложить по оси ординат
точки, соответствующие этим значениям.
Сколько же точек по оси Х следует
включить в расчет? Чтобы избежать
разрывов в графике, значение функции
должно быть задано для каждого пиксела
по оси X.
Поскольку необходимо
рассчитать значения функции для каждого
пикселя по оси X, сопоставим
пиксели с соответствующими значениями
переменной t.
Предположим, ее значения находятся
в интервале от ХМт до ХМах,
а число пикселей по оси абсцисс равно
XPixels Ниже приведен
цикл сканирования пикселей по оси Х
и расчет значений переменной
t,
соответствующих каждому пикселю
For
1 = 0 То XPixels
t
= XMin + (ХМах -ХМт)
* 1 / XPixels
Next
Значения отображаемой
функции вычисляются следующим образом
Function
FunctionEvall (ByVal X
As Double) As Double
FunctlonEvall
= Exp(2 / X) *
Cos(2 * X)
End
Function
Модифицируем
основной цикл, чтобы он строил график
функции
For
i=0 Then XPixels
t
= XMin
+ (ХМах -
XMin) * i
/ XPixels
Picturel.PSet
(t, FunctionEvall(t))
Next
Этот цикл разбивает
график на точки, причем их количество
соответствует числу пикселей по оси Х
Он также рассчитывает значение функции
в каждой точке и устанавливает
соответствующий пиксель Теперь, когда
вы освоили технику отображения значений
переменной t
значениями пикселей, построение графика
не составит труда
Остается определить
значение переменной Xpixels.
Можете временно установить значение
свойства ScaleMode элемента
PictureBox равным
3 (Pixels), далее с
помощью свойства ScaleWidth
определите разрешающую способность
элемента по горизонтали и установите
пользовательскую систему координат,
соответствующую графику
Picturel
ScaleMode = 3
XPixels
= Picturel.ScaleWidth
- 1
Последний этап
— вычисление размеров пользовательской
системы координат для графика отображаемой
функции. Используйте цикл, подобный
циклу создания графика, вместо построения
функции, определяющей максимальное и
минимальное значения отображаемой
функции
For
1 = 1 То
XPixels
t
= XMin
+ (XMax -
XMin) * i
/ XPixels
functionVal
=
FunctionEvall(t)
If
functionVal >
YMax Then YMax =
functionVal
If
functionVal <
YMin Then YMin =
functionVal
Next
По завершении
цикла минимальное и максимальное
значения функции в диапазоне
XMin и
XMax сохраняются
в переменных YMin
и Ymax.
Чтобы установить систему координат
конкретной функции, можно вызвать метод
Scale с аргументами
Picturel.Scale (XMin, YMin)
- (XMax, YMax)
Приложение «Круговые
диаграммы» использует метод Circle
для рисования секторных диаграмм с
помощью соединенных дуг (рис.4).
Поскольку соединенные дуги являются
замкнутыми фигурами, они могут быть
залиты узором или сплошным цветом,
указанным свойствами FillStyle
и FillColor. Приложение
предоставляет выбор: залить сектор
диаграммы узором, сплошным цветом или
оставить его пустым.
Рис.
4. Приложение «Круговые
диаграммы» использует соединенные
дуги для вычерчивания сегментов
секторной диаграммы
Программа генерирует
10 случайных чисел в диапазоне от
20 до 100, сохраняет их
в массиве PieData()
и вычисляет дугу, связанную с каждым
числом. Поскольку результат должен
составить полную окружность (2*pi),
каждый элемент массива PieChart()
соответствует дуге 2*pi*PieData(i)/Total
радиан. Каждый начальный угол сегмента
диаграммы является конечным углом
предыдущего сегмента, а их конечные
углы равны начальным углам плюс угол,
соответствующий их элементу в массиве
PieData() Ниже приведен
код, реализующий этот метод, для
вычерчивания секторной диаграммы Private
Sub Command1_Click() Dim
PieData(10) As Integer Form1.Cls
For
i = 0 To 9
'формирование массива
PieData(i)
= 20 + Rnd() * 100 Total
= Total + PieData(i) Next Form1.DrawWidth
= 2 For
i = 0 To 9
arcl
= arc2 'вычисление
начала и конца сектора
arc2
= arcl + 6.28 * PieData(i) / Total
'определение
заливки узором If
Check1.Value Then Form1.FillStyle = 2 + (i Mod 5) _ Else
Form1.FillStyle = 0
'определение
цветовой заливки If
Check2.Value Then
Form1.FillColor
= QBColor(8 + (i Mod 6)) Else
Form1.FillColor
= QBColor(9)
End
If
'прорисовка
секторов
Form1.Circle
(Form1.ScaleWidth / 2, Form1.ScaleHeight / 2), _
Form1.ScaleHeight
/ 2.5, , -arcl, -arc2 Next End
Sub Создайте
новую форму и разместите на ней 2
элемента CheckBox и кнопку
управления. Для
события Command1_click
введите программный код. Запустите
приложение и попробуйте отобразить
различные варианты. Аналогичным
образом создайте приложение, которое
разбивает линейный индикатор на
сегменты Объясните
назначение аргументов методов Line
и Circle. Чем
отличаются замкнутые и незамкнутые
фигуры? Как
нарисовать замкнутый сектор? Что
такое заливка цветом и заливка узором? Какими
способами можно определить цвет линий? Какими
способами можно определить цвет
заливки?
Приложение Rubber
позволяет рисовать на форме резиновые
линии.
Создайте
новый проект, и для пустой формы запишите
коды, приведенные ниже, для событий
нажатия, опускания левой кнопки мыши
и ее перемещения. Запустите
его и нажмите левую кнопку мыши в
стартовой точке резиновой линии. При
перемещениях мыши в различных
направлениях вторая конечная точка
линии следует за указателем мыши. При
каждом перемещении мыши между стартовой
точкой и текущей позицией указателя
мыши рисуется линия. Эта линия называется
резиновой, поскольку при необходимости
может поворачиваться, сжиматься и
растягиваться, следуя движениям мыши.
Такое поведение линии подобно поведению
резиновой нити, прикрепленной одним
концом к стартовой точке, а вторым
— к указателю мыши. После
выбора точного положения линии отпустите
кнопку мыши, и последняя резиновая
линия зафиксируется на форме. Определите
цвет линии пересекающей уже существующую
во время движения. Реализуйте
такой же алгоритм для элемента
PictureBox. Дополните
форму пунктами «сохранить» и
«восстановить», для которых напишите
программный код записи изображения в
файл «c:\tmp.bmp»
и загрузки изображения из этого же
файла. Нарисуйте
две линии и выполните команду «сохранить» Нарисуйте
еще несколько линий и выполните команду
«загрузить». Оцените результат. Это
приложение легко модернизировать для
рисования резиновых прямоугольников
и окружностей. Создайте в приложении
меню для выбора объекта «линия»,
«прямоугольник», «окружность» и
реализуйте соответствующий программный
код.
Dim
XStart, YStart As Single
Dim
XOld, YOld As Single
Private
Sub Form_MouseDown(Button As Integer, Shift As Integer,_
X As
Single, Y As Single)
If
Button <> 1 Then Exit Sub
XStart
= X ‘фиксация начала
линии
YStart
= Y
XOld
= XStart
YOld
= YStart
Form1.DrawMode
= vbNotXorPen
End
Sub
Private
Sub Form_MouseMove(Button As Integer, Shift As Integer,_
X As
Single, Y As Single)
If
Button <> 1 Then Exit Sub
Form1.Line
(XStart, YStart)-(XOld, YOld) ‘перерисовка
линий
Form1.Line
(XStart, YStart)-(X, Y)
XOld
= X
YOld
= Y
End
Sub
Private
Sub Form_MouseUp(Button As Integer, Shift As Integer, _
X As
Single, Y As Single)
If
Button <> 1 Then Exit Sub
Form1.DrawMode
= vbCopyPen ‘фиксация
изображения
Form1.Line
(XStart, YStart)-(XOld, YOld)
Form1.Line
(XStart, YStart)-(X, Y)
End
Sub Что
такое «резиновые линии» и как их
получить? Какие
режимы рисования чаще всего используются? Какие
типы файлов можно загрузить в графические
объекты? Какие
типы файлов можно использовать для
сохранения изображений? Для
чего требуется установить параметр
AutoRedraw равным True?
Проект TxtPrint
иллюстрирует использование метода
Print (наряду со свойствами
TextWidth и TextHeight)
для вывода в форму выровненного текста.
Создайте
форму и определите ее свойства, как
изменяемое окно. Создайте пункт меню
«Центрировать». Для этого пункта меню
определите очистку экрана и центрированный
вывод текста. Чтобы
очистить форму, наберите Form1.Cls Чтобы
поместить текст в середину формы,
рассчитайте ее среднюю точку.
Form1.ScaleWidth/2
Form1.ScaleHeight/2
4. Вычтите половину
ширины текста из координаты Х и
половину высоты из координаты Y.
Установите текущей точке полученные
значения координат
Form1.CurrentX
= (Form1.ScaleWidth
– TextWidth _
(“Центрирование”))
/ 2
Form1.CurrentY
= (Form1.ScaleHeight
- TextHeight _
(“Центрирование”))
/ 2
5. Выполните команду
Print, центрирующую текст
Form1.Print
" Центрирование "
6. Убедитесь, что
приложение работает.
7. Измените размеры
окна и выполните команду центрировать.
Убедитесь, что программа работает
корректно.
8. Аналогично
дополните меню пунктами «выровнять
кверху» и «выровнять книзу»
9. Аналогично
дополните меню пунктами «выровнять
влево» и «выровнять вправо»
Обратите внимание:
в программном коде используются свойства
ScaleWidth и ScaleHeight.
Они возвращают ширину и высоту "полезной"
области формы, в которую не входят рамка
и строка заголовка формы. Внешние
размеры формы, включая рамку и строку
заголовка, возвращают свойства Width
и Height. Для центрирования
строки на форме фактическое значение
свойства ScaleMode не
имеет значения: положение средней точки
формы не зависит от масштаба, изменяются
только абсолютные значения ее координат. С
какой позиции начинает выводить метод
Print текст в графический
объект? Какими
устанавливаются текущие позиции
координат X и Y
после применения метода Print? Как
осуществить перенос длинных строк?
В теоретическом
разделе вы ознакомились со всеми важными
частями программного кода, необходимого
для построения графиков функций.
Соберите их вместе, чтобы создать
приложение Graph (График).
Щелчок на кнопке
«НАРИСОВАТЬ ГРАФИК» дает возможность
построить график функции (см. рис.5)
в элементе PictureBox.
Выбор метода прорисовки можно
определить при помощи элемента CheckBox.
Рис.
5. Приложение Graph
строит графики математических функций Создайте
форму и поместите в ней элементы:
PictureBox, CheckBox и
CommandButton Для
кнопки «НАРИСОВАТЬ ГРАФИК» напишите
приведенный ниже программный код
Напишите
ко функции, график которой следует
вывести, например:
Function
Function2(ByVal X As Double) As Double
Function2
= Cos(3 * X) * Sin(5 * X)
End
Function Убедитесь,
что приложение работает и выводит
график функции. График
функции показан на рис 6
справа. Недостатки кода проявляются
в разрывах между соседними точками
функции. Чтобы "закрыть" разрывы,
можно заменить метод PSet
(который устанавливает один пиксель)
методом Line,
рисующим сегмент линии между двумя
соседними точками. Иными словами,
разрывы графика устраняются построением
сегментированной линии. Для этого
установите флажок «РИСОВАТЬ ЛИНИЯМИ»,
и постройте график заново. График
функции будет таким, как показано на
рис.6 слева. Разумеется,
графики функций должны отображаться
непрерывными линиями. Обратите внимание,
в методе Line используются
относительные координаты текущей
точки, которая одновременно служит
конечной точкой предыдущего сегмента
линии.
Самостоятельно
напишите код для кнопки «НАРИСОВАТЬ
2 ГРАФИКА», в качестве второй функции
возьмите:
Function
Function2(t As Double)
Function2
= Exp(2 / t) * Sin(2 * t)
End
Function Приложение
Graph используется как
основа программы построения графиков.
Можно к собственным функциям добавить
различные средства, например, оцифровку
осей, главные и дополнительные деления
на осях, легенды и т.д. Кроме того, вы
можете с помощью цвета строить графики
множества функций, т.е. использовать
приложение Graph как
исходный материал для пользовательских
приложений построения графиков.
Private
Sub Command1_Click() Dim
t As Double
Dim
XMin As Double, XMax As Double
Dim
YMin As Double, YMax As Double Dim
XPixels As Integer Picture1.Cls
Picture1.ScaleMode
= 3 XPixels
= Picture1.ScaleWidth - 1
XMin
= 2
XMax
= 10 '
Определение минимального и максимального
значений по оси Y
YMin
= Function1(XMin) YMax
= Function1(XMin) For
i = 1 To XPixels t
= XMin + (XMax - XMin) * i / XPixels functionVal
= Function1(t) If
functionVal > YMax Then YMax = functionVal
If
functionVal < YMin Then YMin = functionVal Next 'Установка
пользовательской системы координат
Picture1.Scale
(XMin, YMin)-(XMax, YMax)
Picture1.ForeColor
= RGB(0, 0, 255) 'Переход
в первую точку
Picture1.PSet
(XMin, Function1(XMin)) 'Построение
графика
For
i = 0 To XPixels
t
= XMin + (XMax - XMin) * i / XPixels If
Check1.Value Then
Picture1.Line
-(t, Function1(t)) Else
Picture1.PSet
(t, Function1(t)) End
If Next End
Sub Как
определить масштаб по оси X? Каким
образом определяется шаг изменения
параметра X? Каким
образом определяются максимальные и
минимальные значения функции на
заданном интервале? Как
определить масштаб по оси Y? В
чем отличие прорисовки графика методами
Pset и Line?
1
48
1.2. Основные программные конструкции
1.3. Средства управления
1.4. Наименование объектов в Visual Basic
2. Порядок выполнения работы
2.1. Разработка цифровых часов
2.2. Модернизация часов
3. Контрольные вопросы
1.2. Изменение параметров проекта во время выполнения проекта
1.3. Создание меню
2. Порядок выполнения работы
2.1. Порядок разработки интерфейса
2.2. Разработка меню
2.3. Программирование команд меню
3. Контрольные вопросы
1.2. Аргумент типа MsgBox
1.3. Результат, возвращаемый функцией MsgBox
1.4. Отмена процедуры Form_Unload для корректного выхода из программы
2. Порядок выполнения работы
2.1. Добавление справки
2.2. Разработка диалогового окна условного выхода
2.3. Разработка диалогового окна поиска по шаблону
1.2. Утверждение Select Case
1.3. Циклы
Синтаксис циклов Dо
Синтаксис циклов For
1.4. Использование утверждения Exit для выхода из цикла или процедуры
1.5. Работа с несколькими формами
2. Порядок выполнения программы
2.1. Окно диалога «поиск по образцу»
3. Контрольные вопросы
1.2. Дескриптор файла
1.3. Типы доступа
Последовательный доступ
Чтение из файла
Запись в файл
Произвольный доступ
Ввод и вывод
Двоичный доступ
Ввод и вывод
2. Практическая часть
2.1. Создание диалогового окна «Работа с файлами»
3. Контрольные вопросы
1.1.1. Установка размеров изображений
Элемент ImageBox
Элемент PictureBox
1.1.2. Загрузка и сохранение изображений
1.1.3. Установка свойств Picture и Image
1.2. Системы координат
1.2.1. Свойства и методы масштабирования Свойства Width и Height
Свойства Left и Тор
Свойство ScaleMode
Свойства ScaleWidth и ScaleHeight
Свойства ScaleLeft и ScaleTop
Метод Scale
Методы ScaleX и ScaleY
1.2.2. Свойства TwipsPerPixelX и TwipsPerPixelY
1.2.3. Свойства CurrentX и CurrentY
1.3. Графические методы
1.3.1. Вывод текста
Методы TextWidth и TextHeight
1.4. Рисование линий и фигур
1.4.1. Установка цвета
1.4.2. Использование относительных координат
1.4.3. Рисование прямоугольников
1.4.4. Заливка фигур
1.4.5. Использование метода Circle
Рисование окружностей
Рисование эллипсов
Рисование дуг
1.5. Использование режимов рисования
1.5.1. Использование операции xor
1.5.2. Рисование "резиновых" линий
1.6. Рисование кривых
2. Практическая часть
2.1. Рисование круговых диаграмм (2 часа)
2.1.1 Порядок выполнения работы
2.1.2 Программа. Приложение Diagram
2.1.3 Контрольные вопросы
2.2. Рисование «резиновых» линий (3 часа)
2.2.1 Порядок выполнения работы
2.2.2 Программа. Приложение Rubber
2.2.3 Контрольные вопросы
2.3. Вывод текста на графические объекты (1 час)
2.3.1 Порядок выполнения работы
2.3.2 Контрольные вопросы
2.4. Вывод графиков функций
2.4.1 Порядок выполнения работы
2.4.2 Программный код кнопки «График 1»
2.4.3 Контрольные вопросы
2
47
3
46
4
45
5
44
6
43
7
42
8
41
9
40
10
39
11
38
12
37
13
36
14
35
15
34
16
33
17
32
18
31
19
30
20
29
21
28
22
27
23
26
24
25