Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум.doc
Скачиваний:
3
Добавлен:
15.08.2019
Размер:
1.9 Mб
Скачать

Камский Политехнический институт

Лабораторный практикум по дисциплине «ИНФОРМАТИКА»

для студентов специальности 2102. Часть II

г. Наб. Челны - 2000

Лабораторная работа №1

РАЗРАБОТКА ЦИФРОВЫХ ЧАСОВ

Цель работы: Освоить приемы разработки простейшей программы в Visual Basic.

1. Теоретическая часть

1.1. Вводные замечания

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

  • планирование пользовательского интерфейса;

  • установка параметров;

  • написание текста программы.

Три перечисленных шага могут многократно повторяться, пока создается, тестируется и исправляется прикладная программа.

В любой проект входит несколько типов файлов, имеющие свое расширение: файл проекта (.VPR или .MAK), файл модуля формы (.FRM),файл специальных средств управления (.OCX или .BCX),файл стандартных модулей (.BAS),файл модулей классов (.CLS),файл ресурсов (.RES).

1.2. Основные программные конструкции

Язык 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 квадратный дюйм.

1.3. Средства управления

При разработке программ важным этапом является установка параметров средств управления. Средства управления - это "кирпичи" прикладной программы Windows. Каждое из них имеет уникальный набор характеристик или параметров, которые определяют их внешний вид и поведение.

Каждое средство управления имеет параметр 1 имя, 0которое будет отличать его от всех остальных средств управления в программе. Каждое средство имеет собственный  набор параметров, связанных с ним. Например, формы обладают параметром MaxButton, который определяет, будет ли форма иметь кнопку “Развернуть”. Для командных кнопок это не имеет смысла, поэтому они не обладают параметром MaxButton.

Для включения средств управления в проект можно использовать Инструментарий Visual Basic, содержащий пиктограммы - обозначающие соответствующие средства управления.

1.4. Наименование объектов в 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

2. Порядок выполнения работы

2.1. Разработка цифровых часов

  1. В корневом директории С: создать свою папку с именем myclock.

  2. Запустить Visual Basic.

  3. Открыть новый проект (File/New Project/Standart.exe).

  4. Активизировать окно параметров (View/Properties Window).

  5. Установить параметры окна формы Form1:

  • Width4000 (ширина окна);

  • Height4000 (высота окна).

  1. Используя Инструментарий вставить в форму "надпись" Label (щелкнуть дважды по инструменту Label или перетащить мышью).

  2. В окне параметров установить шрифт Ms Serif и размер шрифта 24 (использовать параметр Font).

  3. Установить параметры Label1:

  • Alignment - 2 – Center (выравнивание по центру);

  • Caption - Время должно быть здесь (текст на надписи);

  • NamelblTime (имя объекта типа Label);

  • Font - Ms Serif 24 (тип и размер шрифта).

  1. Добавить к Form1 "командную кнопку" (объект CommandButtоn)

  2. Установить параметры для кнопки:

  • CaptionВремя (надпись на кнопке);

  • NamecmdTime (имя объекта).

  1. Запустить проект (Run/Start или кнопку запуска на панели инструментов) и пощелкать по кнопке «Время» (ничего не происходит, так как кнопку не запрограммировали).

  2. Вернуться в режим разработки, для этого необходимо завершить выполнение программы (выбрать Close из управляющего меню Form1 или кнопку завершения End на панели инструментов).

  3. Чтобы вывести текст программы кнопки «Время» щелкните дважды по кнопке.

  4. Введите в процедуру утверждение (используйте клавишу Tab для ввода отступа):

lblTime.Caption = Now

По данному утверждению по щелчку на кнопке «Время» появятся текущая дата и время.

  1. Закрыть окно программного текста.

  2. Сохранить разработанную форму в папке myclock под именем clock

  • Активизировать Form1,

  • выбрать File/Save Form1 As,

  • выбрать папку myclock,

  • ввести имя clock

  • нажать клавишу «Сохранить».

  1. Сохранить проект под именем myclock

  • File/Save Project As,

  • ввести myclock,

  • нажать клавишу «Сохранить».

  1. Запустить проект (выполнив команду Run/Start) и пощелкать по кнопке «Время». Убедиться, что на каждое нажатие клавиши высвечивается текущее время.

  2. Завершить работу программы.

2.2. Модернизация часов

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

  2. Выбрать File/Open Project, открыть папку myclock, выделить файл myclock.vbp и нажать кнопку «Открыть».

  3. Выбрать View/Project Explorer, открыть папку Forms и выделить Form1 (clock.frm).

  4. Добавить к Form1 таймер с размером по умолчанию, дважды щелкнув на инструменте Timer. Перетащить его на чистое место в левой части Form1.

  5. Вызвав команду View/Properties Window изменить параметр Interval таймера на 1000. Это число указывает на количество миллисекунд, через которое возникает событие Timer1_Timer.

  6. Вызвать процедуру Timer1_Timer, щелкнув дважды на таймере в Form1.

  7. Перетащить разделительную полосу на середину окна текста и скопировать программный текст кнопки Time в процедуру таймера. Для этого:

  • Щелкнуть на нижней панели окна текста, чтобы сделать ее активной.

  • Раскрыть список всех объектов формы Form1 и щелкнуть на объекте cmdТimе, чтобы вывести текст его процедуры cmdТimе_Сlick на нижнюю панель.

  • Выбрать строку текста с функцией Now, которая выводит текущее время на надпись.

  • Выбрать команду Edit/Сору, чтобы скопировать выбранный текст в буфер обмена Windows.

  • Поместить указатель вставки в начало пустой строки в середине процедуры Тimer1_Тimег.

  • Выбрать команду Еdit/Раstе, чтобы вставить текст из буфера обмена в то место, на которое показывает указатель вставки.

  • Закрыть окно текста Form1.

  • В окне форм Form1 выбрать кнопку Тimе и нажать Dеl, чтобы уничтожить ее. Эта кнопка больше не нужна.

  1. Изменить параметры формы Form1:

  • Caption - Часы-автомат (надпись заголовка окна);

  • BorderStyle - 3 –FixedDialog (стиль окна);

  • Height – 2000 (высота окна).

  1. Сохранить проект, выбрав File/Save Project.

  2. Запустить проект, выбрав Run/Start.

  3. Завершить работу часов (Alt+F4).

  4. Скомпилировать проект, для чего:

  • выбрать File/Make myclock.exe.

  • поменять, если надо, диск, каталог, имя файла.

  • щелкнуть на кнопку ОК.

  1. Для проверки скомпилированного файла необходимо выйти из VisualBasic и используя Проводник запустить exe-файл.

3. Контрольные вопросы

  1. Какие шаги включает процесс создания приложений на Visul Basic ?

  2. Какие типы файлов включает в себя проект?

  3. Дайте определение понятий: утверждение, процедура, функция, метод, параметр, событие, оператор.

  4. Что такое точка в VisualBasic?

  5. Укажите назначение средств управления и какими параметрами они характеризуются?

  6. Укажите рекомендуемый способ присвоения имен объектам VisualBasic.

  7. Расcкажите порядок разработки цифровых часов.

Лабораторная работа №2

РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА

Цель работы: Освоить приемы разработки пользовательского меню в Visual Basic.

1. Теоретическая часть

1.1.Вводные замечания

С помощью набора инструментов к прикладной программе можно добавлять общепринятые средства управления:

  • текстовые окна

  • командные кнопки

  • переключатели

  • диалоговые окна

  • списки

Средства управления появляются со своими "предопределенными" стандартными возможностями. Например, текстовое окно содержит мерцающий указатель вставки и позволяет вводить, выделять и редактировать текст. Панели прокрутки дают возможность прокручивать содержимое текстовых окон. Для этих предопределенных свойств не требуется писать программы. Однако если нужно скопировать выделенный в окне текст в буфер обмена, то придется написать соответствующий фрагмент программы. Если необходимо, чтобы средства управления меняли размер или свое расположение на экране в том случае, когда пользователь меняет размер окна, содержащего эти средства управления, также может понадобиться написать программный текст.

1.2. Изменение параметров проекта во время выполнения проекта

Некоторые параметры можно менять только во время разработки (когда идет работа над программой), но большинство можно менять во время выполнения (когда работает сама программа) в ответ на определенные действия пользователя. Чтобы изменить параметры во время разработки, необходимо выбрать объект и изменить значения в окне параметров. Чтобы изменить параметры объекта во время выполнения, нужно добавить определенный программный текст, в процедуру обработки событий объекта. Такое действие уже выполнялось в лабораторной работе при разработке проекта цифровых часов. Код, который был добавлен в процедуру таймера, менял параметр Caption надписи часов, чтобы они каждую секунду показывали текущее время и дату.

Одно из важных достоинств Visual Basic - простота разработки и проверки прикладных программ. Программа не должна быть "закончена" до того, как можно будет проверить ее. Можно добавить к программе новую возможность, немедленно проверить ее, исправить, вновь проверить и т.д. и все это, не выходя из Visual Basic.

1.3. Создание меню

Система меню - это основа пользовательского интерфейса программы. Большинство команд и возможностей программы (если не все) доступны в виде меню. Visual Basic позволяет легко и быстро разрабатывать и кодировать меню для прикладных программ.

Меню - это особое средство управления Visual Basic, и поэтому в наборе инструментов нет инструмента (Menu). Чтобы добавить пункт (команду или возможность) к меню прикладной программы, надо воспользоваться Редактором меню следующим образом:

  1. Выбрать форму, к меню которой необходимо добавить пункты.

  2. Выбрать команду Tools/Menu Editor или нажать клавиши Ctrl+E, или щелкнуть на кнопке редактора меню на панели инструментов, (на ней изображено маленькое ниспадающее меню), чтобы открыть окно редактора меню.

  3. В текстовом окне Caption ввести заголовок требуемого пункта меню. Это тот текст, который появится на панели меню или в ниспадающем меню. Чтобы задать быструю клавишу для пункта меню, нужно ввести амперсенд (&) перед требуемым символом. Чтобы вставить разделитель в ниспадающее меню, нужно ввести черточку (-) в текстовое окно Caption.

  4. В текстовом окне Name ввести название требуемого пункта меню.

Это название будет использоваться для ссылок на пункт меню в разрабатываемой программе. Каждый пункт меню должен иметь свое уникальное название.

  • Чтобы задать быструю клавишу для пункта меню, нужно выбрать требуемую комбинацию из списка Shortcut.

  • Чтобы изменить уровень пункта меню в иерархии, нужно щелкнуть на кнопке со стрелкой вправо (для увеличения отступа и понижения уровня пункта) или на кнопке со стрелкой влево (для уменьшения отступа и повышения уровня пункта). Уровень пункта меню определяет, где в иерархии меню появится данный пункт. Пункты главного меню (без отступа) появляются на панели меню; пункты подменю с единичным отступом, появятся в меню, ниспадающих из панели меню; пункты подподменю с двойным отступом, появляются в меню, ниспадающих из других подменю, и т. д. Можно использовать до четырех уровней меню, от пунктов главного меню до пунктов подподподменю.

  • Чтобы добавить еще один пункт меню, необходимо щелкнуть на кнопке Next.

  • Чтобы вставить новый пункт меню, нужно выделить пункт меню, перед которым необходимо сделать вставку, и щелкнуть на кнопке Insert.

  • Для удаления пункта меню, нужно его выделить и щелкнуть на кнопке Delete.

  • Закончить создание меню нужно кнопкой ОК.

Как и для других средств управления, для пунктов меню рекомендуется использовать содержательные названия. Далее будем начинать название каждого пункта меню с mnu и применять иерархическую схему для остальной части названия. Например, пункт меню Файл будет называться mnuFile, пункт подменю Файл, Открыть - mnuFileOpen и т. д.

2. Порядок выполнения работы

2.1. Порядок разработки интерфейса

  1. Создать новый проект:

  • В корневом директории С: создать свою папку с именем mymenu.

  • Запустить Visual Basic.

  • Запустить новый проект (File/New Project).

  1. Активизировать окно параметров (View/Properties). Установить для Form1 следующие параметры:

  • Caption - Мой текстовый редактор;

  • Height - 4000;

  • Left - 1095;

  • Name - frmMain;

  • Top - 1170;

  • Width - 5000.

Параметры Left и Top задают расстояние (в точках) между левым верхним краем формы и левым верхним краем содержащего данную форму окна - в нашем случае всего экрана.

  1. Добавить к форме "текстовое окно" (инструмент "TextBox"). Обратите внимание на то, что текстовое окно получило название Text1. Установить следующие параметры Text1:

  • Name - txtEditBox;

  • Top - 0;

  • Left - 0;

  • Height - 3600;

  • Width - 4870;

  • Font - 18;

  • MultiLine - True.

  • Scrollbars - 2-Vertiсal;

Параметр Scrollbars задает панель вертикальной прокрутки, MultiLine задает возможность ввода нескольких строк, для остальных параметров - значения по умолчанию.

  1. Сохранить все созданные файлы нового проекта:

  • выбрать File/Save Project As,

  • сделать C:\MYMENU текущим каталогом,

  • ввести basictxt и для названия формы и для названия проекта.

  1. Запустить проект. Ввести текст из нескольких строк, изменить размеры окна (размеры текстового окна не изменяются).

  2. Закончить работу проекта.

  3. Внести изменения в проект, позволяющие автоматически менять размеры текстового окна при изменении размеров окна программы. Для этого нужно выполнить следующую последовательность действий:

  • Сделать активной форму Мой текстовый редактор.

  • Вывести окно программного текста формы: выбрать команду View/Code, в окне объектов выбрать Form, в окне процедур выбрать Resize, чтобы вывести процедуру Form_Resize (событие Resize происходит, когда размеры формы меняются во время выполнения)

  • Нажать Tab, чтобы сделать отступ и ввести следующие строки программы:

txtEditBox.Height = ScaleHeight

txtEditBox.Width = ScaleWidth

Введенные строки устанавливают параметры текстового окна Height и Width равными параметрам формы ScaleHeight и ScaleWidth.

  1. Сохранить проект (File/Save Project) - Запустить проект.

  2. Развернуть и свернуть окно Мой текстовый редактор. Убедиться, что размеры текстового окна автоматически изменяются.

  3. Прекратить работу прикладной программы.

2.2. Разработка меню

Чтобы добавить пункт (команду или возможность) к меню прикладной программы, надо воспользоваться редактором меню Menu Editor. Создадим главное меню, состоящее из пунктов Файл, Правка, Справка. Начнем с создания пункта главного меню Файл. Для этого необходимо выполнить следующую последовательность действий:

  1. Открыть окно формы Мой текстовый редактор.

  2. Открыть окно редактора меню (Tools/Menu Editor или кнопка редактора меню панели инструментов).

  3. В текстовое окно Caption ввести &Файл в качестве заголовка пункта меню (& вводится для задания быстрой клавиши).

  4. Нажать Tab, чтобы сделать активным текстовое окно Name и ввести название пункта меню mnuFile (каждый пункт меню должен иметь свое уникальное название).

  5. Создать пункты подменю, появляющиеся в ниспадающем меню, для чего:

  • добавить новый пункт подменю (щелкнуть на кнопке Next);

  • ввести отступ (щелкнуть на кнопке со стрелкой вправо, пункты главного меню вводятся без отступа, пункты подменю с единичным отступом);

  • щелкнуть на текстовом окне Caption, чтобы сделать его активным и ввести &Новый;

  • нажать Tab, чтобы сделать активными текстовое окно Name и ввести в качестве названия пункта mnuFileNew.

  1. Повторить п.п.3-4,введя подпункты меню и их названия:

  • &Открыть -mnuFileOpen;

  • &Сохранить - mnuFileSave;

  • Сохранить &Как - mnuFileSaveAs.

  1. Ввести разделитель в ниспадающем меню: щелкнуть Next, ввести ‘-‘ (черточку), нажать Tab, ввести название разделителя - mnuFileSep.

  2. Повторить п.п. 3-4 для создания подпункта Вы&ход меню File, введя в качестве названия подпункта - mnuFileExit. Из списка Shortcut выбрать Ctrl+Q для задания быстрой клавиши. Сохранить проект.

  3. Действуя аналогично изложенному создать пункты главного меню: Правка, Справка присвоить им соответствующие имена - mnuEdit, mnuHelp и назначить быстрые клавиши.

  4. Добавить к пункту меню Правка cледующие подпункты с соответствующими именами:

  • Вырезать- mnuEditCut;

  • Копировать- mnuEditCopy;

  • Вставить- mnuEditPaste.

Используйте кнопку Insert при добавлении нового пункта, кнопку со стрелкой вправо для указания отступа для пунктов подменю.

  1. К пункту меню Справка добавить подпункты: Справка о текстовом редакторе - mnuHelpAbout; Общая справка - mnuHelpSystem. При формировании пунктов и подпунктов меню необходимо обязательно вставлять быстрые клавиши, таким образом, чтобы они в пределах одного уровня меню не повторялись.

  2. Закройте окно разработки меню (щелкнуть на ОК). Сохранить проект в созданной папке mymenu. Запустить проект. Проверить пункты меню, щелкая на пункты главного меню и наблюдая за появлением ниспадающих меню. Повторить проверку, используя быстрые клавиши. Выберите Файл/Выход. Команда Выход не работает.

2.3. Программирование команд меню

  1. Запрограммируем команду Выход для этого нужно добавить в проект утверждение End:

  • сделать активной форму Мой текстовый редактор;

  • вывести программный текст пункта меню Файл/Выход (щелчок по пункту Файл/Выход, должен появиться текст процедуры mnuFileExit_Click)

  • нажать Tab, чтобы сделать отступ, ввести End для добавления оператора End к процедуре;

  • закрыть окно текста программы;

  • сохранить проект и запустить его;

  • из панели меню Мой текстовый редактор выбрать Файл/Выход, чтобы проверить работу команды «Выход»;

  • запустить проект снова и нажать клавиши Ctrl+q, чтобы проверить работу быстрой клавиши для команды «Выход».

  1. Программирование команды «Вырезать». Включите в процедуру mnuEditCut_Click следующие утверждения:

Clipboard.Clear ‘ очистить системный буфер

Clipboard.SetText txtEditBox.SelText ‘поместить выделенный

текст в системный буфер

txtEditBox.SelText = ““ ‘уничтожить выделенный текст

  1. Программирование команды «Копировать». Cкопируйте первые два утверждения в процедуру mnuEditCopy_Click:

Clipboard.Clear ‘ очистить системный буфер

Clipboard.SetText txtEditBox.SelText ‘поместить выделенный

текст в системный буфер

  1. Программирование команды «Вставить». Включите в процедуру mnuEditPaste_Click следующие утверждения:

возвратить содержимое буфера обмена

txtEditBox.SelText = Clipboard.GetText ( )

  1. Сохранить проект, проверить работу команд Вырезать, Копировать, Вставить.

3. Контрольные вопросы

  1. Каким образом добавляются в проект средства управления?

  2. Как добавить к форме текстовое окно?

  3. Как изменить параметры средств управления во время выполнения проекта?

  4. Как добавить в форму меню?

  5. Какой порядок для формирования уровней меню используется в Visual Basic?

  6. Каким образом определяются быстрые клавиши для пунктов меню и подменю?

  7. Как добавляются пункты и подпункты меню?

Лабораторная работа 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"

1.2. Аргумент типа MsgBox

Аргумент типа 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.

1.3. Результат, возвращаемый функцией MsgBox

Функция 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.

1.4. Отмена процедуры Form_Unload для корректного выхода из программы

Один из способов выхода из прикладной программы Visual Basic - это вставка утверждения End в текст программы (например, в процедуру Файл/Выход). Другой способ - это закрытие главного окна прикладной программы (тот способ использовался в предыдущем упражнении). Управляющее меню окна содержит команду Закрыть, которая выгружает (закрывает) окно.

Как уже упоминалось ранее, End производит корректный, чистый выход из прикладной программы (закрывая файлы и освобождая память). Однако закрытие главного окна этого не делает. По этой причине можно решить запретить пользователям выходить из программы, закрывая ее главное окно. Один из способов это сделать - удалить управляющее меню из главного окна. Однако это сомнительное решение, поскольку пользователи ожидают найти управляющее меню в окне. Предпочтительный способ - удалить процедуру Form_Unload, которая выполняется, когда пользователь пытается закрыть окно. Если эта процедура не будет выполняться, окно не закроется.

2. Порядок выполнения работы

2.1. Добавление справки

  1. Запустить Visual Basic.

  2. Запустить созданный в предыдущей лабораторной работе проект basictxt (C:/mymenu).

  3. Вывести процедуру mnuHelpAbout_Click (View/Code, в окне объектов выбрать mnuHelpAbout, в окне процедур Click).

  4. Сделайте отступ и введите:

MsgBox "Текстовый редактор ???",64,"О текстовом редакторе"

Утверждение MsgBox принимает три аргумента:

  • "Текстовый редактор ???" - сообщение, которое появится в диалоговом окне, здесь ??? - фамилия разработчика

  • тип 64 - означает появление в диалоговом окне пиктограммы информационного сообщения "i"

  • "О текстовом редакторе" – текст, который появится на панели заголовка

  1. Закрыть окно программного текста. Сохранить проект, запустить его.

  2. Проверить выполнение команды Справка/Справка о текстовом редакторе.

  3. Выйти из текстового редактора.

2.2. Разработка диалогового окна условного выхода

  1. Выведите процедуру mnuFileExit_Click.

  2. Удалите утверждение End в процедуре.

  3. Введите утверждение:

If MsgBox("Выход?",4 + 32,"Подтверждение") = 6 Then End

По данному утверждению выводится диалоговое окно, содержащее пиктограмму с "?" (код 32) и две кнопки "Да" и "Нет"(код 4). Щелчок на кнопке "Да" возвращает значение 6,на кнопке "Нет" - значение 7.

  1. Сохранить проект, запустить его. Проверить работу нового диалогового окна.

  2. Запустить проект. Выбрать Файл/Выход еще раз. Попробуйте закрыть диалоговое окно с помощью клавиши Esc (использование клавиши Esc для закрытия диалогового окна традиционно для прикладных программ Windows). Клавиша Esc не работает.

  3. Заменим в разработанном диалоговом окне кнопки "Да" и "Нет" на кнопки ОК и Отмена, чтобы можно было использовать Esc:

  • вывести процедуру mnuFileExit_Click

  • заменить в утверждении 4 на 1. Теперь в диалоговом окне будут

  • выводиться кнопки ОК и Отмена

  • заменить 6 (после знака =) на 1. Вместо проверки, нажата ли

  • кнопка Да, утверждение будет проверять, нажата ли кнопка ОК.

Теперь утверждение должно выглядеть так:

If MsgBox("Выход?", 1 + 32, "Подтверждение") = 1 Then End

  1. Сохранить проект, запустить его. Используйте клавишу Esc для отмены команды Выход и закрытия диалогового окна.

  2. Завершить работу текстового редактора при помощи управляющего меню. Программа не просит подтвердить команду выхода, поскольку управляющее меню работает независимо от меню Выход.

  3. Запретим выход из программы с помощью управляющего меню из главного окна (для этого в процедуре Form_ Unload нужно установить cancel равным 1 (истина)):

  • вывести в окне программного текста формы процедуру события Form _Unload (в окне объекта нужно выбрать Form, в окне процедуры выбрать Unload)

  • ввести в процедуру утверждение

Cancel =1

(установка значения Cancel равным 1 (истина) запрещает выгружать форму).

  • перейдите к следующей строке программы и введите

mnuFileExit_Click

(теперь, когда пользователь попытается закрыть главное окно текстового редактора, вместо выгрузки будет вызвана процедура mnuFile Exit_Click)

  1. сохранить проект, затем запустить его, проверить действуют ли внесенные изменения.

2.3. Разработка диалогового окна поиска по шаблону

  1. Добавить к главному меню текстового редактора пункт Поиск, пункт подменю Найти (используйте Menu Editor, в качестве имен введите mnuSearch, mnuSearchFind):

  2. Откройте окно программного текста, выведите процедуру 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

Процедура поиска работает следующим образом:

  1. Функция InputBox выводит диалоговое окно с приглашением и текстовым окном. Введенный текст копируется в переменную Find

  2. Если значение переменной Find пусто, то выход из процедуры

  3. Функция Len(Find) определяет количество символов в искомом тексте. Это количество записывается в переменную LenFind

  4. В переменную LenSourse записывается количество символов во всем документе.

  5. Цикл Do While ... Loop выполняется до тех пор пока txtEditBox.SelStart меньше чем LenSourse. SelStart определяет, где начинается выделенный текст, LenSourse определяет число символов во всем документе

  6. Выделяется текст, для проверки. Начиная с текущего положения указателя вставки, выделяется столько же символов, сколько содержит искомый текст (LenFind)

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

  8. Указатель вставки перемещается на один символ вправо

  9. Loop возвращает управление на первую строку цикла Do

  1. Сохраните проект, запустите проект, проверьте работу поиск

  2. Внесите изменения в процедуру, заменив цикл DO While...Loop на Do Until...Loop, For...Next.

  3. Сохраните проект.

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.

1.2. Утверждение Select Case

Утверждение 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).

1.3. Циклы

Циклы позволяют повторять одну или несколько строк в программах. Существует два часто используемых в 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

Типичные программы с циклами - программы сортировки данных и поиска.

Синтаксис циклов Dо

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

For counter = start To End [Step increment]

code block ..........

Next [counter]

counter-это числовая переменная, используемая в цикле как счетчик; start - это начальное значение счетчика. Необязательный аргумент increment задает приращение, на которое увеличивается счетчик при каждом выполнении цикла; если

в цикл не включить условие Step, счетчик будет увеличиваться на 1. code block и....... представляет одну или несколько строк программы, которые повторяются, пока не будет выполнено условие counter = end.

1.4. Использование утверждения Exit для выхода из цикла или процедуры

Иногда бывает необходимо выбраться из "водоворота" цикла или процедуры, т. е. покинуть их до завершения нормального выполнения. Для этого в программу надо включить соответствующее утверждение Exit. Чтобы покинуть цикл или процедуру, надо:

Использовать Exit Do для выхода из цикла Do и передачи управления утверждению, идущему за Loop в конце цикла.

Использовать Exit For для выхода из цикла For и передачи управления утверждению, идущему за Next в конце цикла.

Использовать Exit Sub для выхода из процедуры Sub и передачи управления утверждению, идущему за утверждением, вызвавшим процедуру.

Использовать Exit Function для выхода из процедуры Function и передачи управления утверждению, идущему за утверждением, вызвавшим функцию.

1.5. Работа с несколькими формами

Такие функции Visual Basic, как МsgВох и InputВох, позволяют вам добавлять к вашим программам простые, стандартные диалоговые окна. Однако иногда бывают нужны и более сложные диалоговые окна. Visual Basic позволяет вам создавать пользо­вательские диалоговые окна, которые могут содержать такой набор кнопок, текстовых окон и других средств управления, какой вам требуется.

Для добавление в существующий проект дополнительной формы необходимо выполнить команду Project/Add Form/New.

Для активизации нового диалогового окна во время выполнения программы следует воспользоваться методом Show, а для закрытия окна методом Hide. В остальном поведение дополнительного аналогично основному.

2. Порядок выполнения программы

2.1. Окно диалога «поиск по образцу»

  1. Добавить к проекту новую форму ( Project/Add Form/New).

  2. Включить в форму следующие инструменты: две командные кнопки CommandButton, текстовое окно Text, переключатель CheckBox. Установить параметры.

  3. Измените тексты процедур формы 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

  1. Измените тексты процедур формы Мой текстовый редактор :

Sub mnuSearchFind_Click()

frmFind.Show ‘ показать форму

End Sub

Private Sub Text1_Change()

End Sub

Private Sub txtFind_Change()

End Sub

3. Контрольные вопросы

  1. Укажите в каких случаях предпочтительнее использовать тот или иной синтаксис оперетора If … Else.

  2. Когда предпочтительнее использовать оператор Select…Case?

  3. Укажите в каком порядке в операторе Select…Case указывают исключения и диапазоны.

  4. В чем различие синтаксисов цикла Do … Loop?

  5. Когда предпочтительнее использовать арифметический цикл For … Next?

  6. Как добавить в проект новую форму?

  7. Как активизировать и закрыть дополнительную форму?

Лабораторная работа № 5

СОХРАНЕНИЕ И ОТКРЫТИЕ ФАЙЛОВ.

Цель работы: Освоить приемы программирования работы с файлами.

1. Теоретическая часть

1.1. Файлы

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

Процесс открытия и сохранения файлов состоит из нескольких этапов-

• получение дескриптора файла (handle);

• открытие файла;

• чтение или запись данных;

• закрытие файла.

1.2. Дескриптор файла

При открытии, файлу ставится в соответствие канал с определенным номером. Таким образом, каждый открытый файл имеет собственный канал, с помощью которого записываются или считываются данные. Следовательно, для ввода и вывода данных в файл имеет значение не имя файла, а номер канала. Кроме того, операционная система должна иметь сведения о наличии свободных каналов, которые можно использовать для открытия файла. Функция Visual Basic FreeFile возвращает номер свободного канала, который можно использовать для работы с файлом.

intFH = FreeFile(RangeNumber)

В этом примере переменной intFH присваивается целое значение, которое можно использовать для открытия файла. Необязательный параметр RangeNumber позволяет определить диапазон значений, из которого выбирается очередной свободный номер канала. Если его значение равно 0 (по умолчанию), то возвращается номер канала из диапазона 1— 255, если 1, то из диапазона 256 — 511.

Если свободных каналов нет (открыто максимально допустимое количество файлов), возникает ошибка выполнения.

Для уменьшения вероятности появления такого рода ошибки и корректного завершения работы приложения все открытые файлы следует закрыть. Закрытие файлов выполняет оператор Close:

Close #intFH 'закрывает файл, описываемый дескриптором intFH

Close intFH 'использование # необязательно

Close 'Закрывает все файлы, открытые приложением

Если дескриптор указан, то закрывается соответствующий файл, если нет, то закрываются все открытые файлы. Все открытые файлы закрываются и при завер­шении работы приложения, запущенного из среды разработки.

1.3. Типы доступа

В 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-го байта файла.

2. Практическая часть

2.1. Создание диалогового окна «Работа с файлами»

  1. Добавить к проекту новую форму ( Project/Add Form/New).

  2. Включить в форму следующие инструменты: две командные кнопки CommandButton, четыре надписи, поле со списком ComboBox, список устройств DriveListBox, список каталогов DirectoryListBox, список файлов FileListBox.

  3. Установить параметры.

  4. Написать код процедур окна диалога

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

  1. Проверить работу программы открытия файла.

  2. Сохранить проект.

3. Контрольные вопросы

  1. Что такое дескриптор файла?

  2. Какие возможности обеспечивают файлы с последовательным доступом при различных способах открытия?

  3. В чем состоит отличие операторов вывода Write# и Print#?

  4. Чем отличаются файлы с последовательным доступом от файлов с произвольным доступом?

  5. Ограничение доступа и блокировки в файлах с произвольным доступом.

  6. Что такое длина записи?

  7. Особенности файлов с двоичным доступом.

Лабораторная работа № 6

РЗРАБОТКА ГРАФИЧЕСКИХ ПРИЛОЖЕНИЙ

Цель работы: Освоить приемы работы с графическими объектами и методами.

1. Теоретическая часть

1.1. Графические элементы управления

Графические изображения можно поместить в один из следующих элементов управления

• форму,

• элемент PictureBox,

• элемент ImageBox

Основное различие между этими элементами состоит в том, что элемент ImageBox спроектирован для отображения рисунков, а не для их создания или управления ими. В остальных двух элементах предусмотрены методы рисования, позволяющие во время работы приложения создавать графические изображения

Чтобы загрузить в элемент изображение (растровый рисунок или значок) в режиме проектирования необходимо назначить в окне свойств элемента имя файла в качестве значения свойства Picture элемента. Во время выполнения приложения следует воспользоваться функцией LoadPictur(), приведенной ниже.

Если графическое изображение вставляется в элемент во время конструиро­вания, то оно сохраняется вместе с приложением в файле с расширением FRX. В качестве альтернативы можно загрузить графическое изображение на этапе выполнения приложения, используя функцию LoadPicture() В этом случае размер файла FRX уменьшается, однако следует гарантировать доступ приложения к файлу с изображением.

Векторные рисунки не загружают — они генерируются кодом программы.

1.1.1. Установка размеров изображений

Как правило, графические изображения помещают в элементы ImageBox или PictureBox Элементы ImageBox удобны для отображения рисунков и требуют меньше ресурсов, чем элементы PictireBox Элементы PictureBox могут формировать изображение во время выполнения приложения. В каждом элементе предусмотрены свойства, позволяющие контролировать отображение рисунка.

Элемент ImageBox

Если значение свойства Stretch установлено равным True, то размер изображения изменяется так, чтобы оно заполнило всю поверхность элемента ImageBox. При различном соотношении размеров элемента и изображения последнее искажается. Если же значение свойства Stretch установить равным False, то элемент ImageBox ведет себя подобно элементу PictureBox, у которого значение свойства AutoSize установлено в True.

Элемент PictureBox

Если значение свойства AutoSize элемента установлено равным True, размеры элемента изменяются в соответствии с размерами вставленного в него изображения. Если же значение свойства AutoSize - False, отображается только та часть изобра­жения, которая помещается в элемент.

1.1.2. Загрузка и сохранение изображений

Для загрузки изображения в элемент во время выполнения приложения используют метод 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).

1.1.3. Установка свойств Picture и Image

Свойство Image, родственное свойству Picture, указывает область памяти, в которой хранятся биты изображения. В отличие от свойства Picture свойство Image доступно только для чтения. Оно используется для передачи рисунков API-функциям.

Используя свойство Picture, можно копировать только изображение, загруженное с помощью метода LoadPicture. Свойство Image позволяет копировать все изобра­жение, в том числе фигуры, нарисованные в то время, когда значение свойства AutoRedraw было установлено равным True, если AutoRedraw во время прорисовки установлено False, то копирование невозможно.

1.2. Системы координат

Прежде чем приступить к рисованию необхо­димо ознакомиться с понятиями координат и системы координат, а также с их использованием в процессе рисования.

Координаты описывают положение отдельных пикселей на экране или точек на листе бумаги, распечатанной с помощью принтера. Номер столбца - это координата по вертикали, 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 не влияет на размер и другие характеристики элемента. Изменяется только плотность сетки, используемой для указания точек элемента.

1.2.1. Свойства и методы масштабирования Свойства Width и Height

Эти свойства определяют фактические размеры элемента управления, поэтому их значения всегда выражаются в единицах контейнера, содержащего элемент Предположим, вы поместили элемент PictureBox на форму, в системе координат которой использовались твипы. Тогда значения свойств Width и Height элемента также выразятся в твипах. При изменении системы координат элемента, значения этих свойств остаются прежними! Если изменить размеры элемента на форме, перемещая его маркеры указателем мыши, то значения свойств Width и Height изменятся и будут отображать новое значение размера элемента. Также значения этих свойств изменяются при изменении системы координат контейнера, отображая размеры элемента в новой системе координат.

Свойства Left и Тор

Свойства Left и Top - это координаты верхнего левого угла элемента Значения этих свойств устанавливаются в системе координат контейнера. При изменении их значений элемент перемещается. При изменении системы координат контейнера, значения этих свойств также изменяются, отражая положение элемента в новой системе координат.

Свойство ScaleMode

Свойство ScaleMode устанавливает (или возвращает) текущую систему координат элемента. Чтобы перейти в новую систему координат, установите значение этого свойства равным одному из указанных в табл. 1. Если установить значение свойства равным 0 (User), то следует установить значения свойств ScaleWidth и ScaleHeight. И наоборот, если вы сами установите значения свойств ScaleWidth и/или ScaleHeight, то значение свойства ScaleMode автоматически устанавливается равным 0.

Свойства ScaleWidth и ScaleHeight

Свойства ScaleWidth и ScaleHeight представляют собой внутренние размеры элемента в единицах измерения текущей системы координат. Изменение системы координат не изменяет размер элемента, а только число единиц, которые могут разместиться по двум осям координат. Допустим, элемент PictureBox размещен на форме шириной 2880 твипов и высотой 2880 твипов, т.е. примерно 2х2 дюйма. Значения свойств Width и Height формы равны 2880. Если изменить единицы системы координат формы на дюймы, то размеры элемента останутся прежними, а значения его свойств ScaleWidth и ScaleHeight станут равными 2. Значение координаты Х средней точки, прежде равное 1440, станет равным 1. Кроме того, можно самому задать значения этих свойств. В этом случае вы автоматически переключитесь в пользовательскую систему координат (значение свойства ScaleMode установится равным нулю).

Свойства ScaleLeft и ScaleTop

Свойства 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

Метод 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, однако не перемещает и не изменяет размеры элемента управления или формы.

Методы ScaleX и ScaleY

В некоторых случаях необходимо выразить новый размер элемента в заданной системе координат без изменения системы координат контейнера. Пусть, например, система координат формы соответствует значению 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

1.2.2. Свойства TwipsPerPixelX и TwipsPerPixelY

Свойства TwipsPerPixelX и TwipsPerPixelY применяют к объекту Screen (Экран) и возвращают число твипов на пиксель объекта, измеренное по горизонтали (TwipsPerPixelX) или вертикали (TwipsPerPixelY)

1.2.3. Свойства CurrentX и CurrentY

Основным понятием при рисовании является текущая точка (current point) Программа Visual Basic позволяет рисовать фигуры без указания начальной точки. Если начальная точка линии не указана, то ею становится текущая точка. После того, как линия проведена, текущей становится ее конечная точка. Свойства CurrentX и CurrentY устанавливают или считывают координаты текущей точки в единицах текущей системы координат. Чтобы отобразить на форме строку с конкретными координатами, установите их в свойства CurrentX и CurrentY, а затем используйте метод Print для отображения строки

1.3. Графические методы

В программах Visual Basic используются следующие методы рисования:

  • Print — отображение строковых данных;

  • Line — рисование линий и прямоугольников;

  • Circle - рисование окружностей и дуг;

  • Point - возврат значения Color (Цвет) точки;

  • PSet установка значения цвета точки.

Метод Print не имеет отношения к принтеру. Он предназначен для вывода текста в форму или элемент управления. В методах Line и Circle используют аргу­менты, расширяющие возможности рисования сложных геометрических фигур, наподобие эллипсов, залитых фигур и кольцевых диаграмм. Методы Point и PSet применяются для манипулирования пикселями в приложениях, обрабатывающих изображения, и для рисования кривых, которые строятся по точкам.

1.3.1. Вывод текста

К простейшим методам рисования относится метод Print, позволяющий выво­дить текст в форму или элементы PictureBox, начиная с текущей точки. При выводе используют текущие установки шрифта и его размера. По окончании вывода текущая точка переходит в конец текста.

Следующий оператор выводит строку в верхней части элемента PictureBox.

Picturel.Print " Рисование средствами Visual Basic"

Кроме того, этот оператор переводит текущую точку в следующую строку, подобно печати в элементе TextBox, допускающем наличие нескольких строк. Сле­дующая строка, которую вы будете печатать в этом элементе, отобразится под пер­вой строкой.

Длинные текстовые строки не переносятся автоматически по достижении правого края элемента. В программном коде следует предусмотреть разбивку длинных текстовых строк на строки меньшей длины до начала вывода.

Методы TextWidth и TextHeight

Для выравнивания текста на форме или элементе используют методы TextWidth и TextHeight. Данные методы принимают строку в качестве аргумента, а возвращают, соответственно, ширину и высоту текста. Объекты Form, Printer, а также элемент PictureBox, воспринимающие графические методы, имеют свойства TextWidth и TextHeight. В значениях этих свойств указываются требуемые длина и ширина поля печати строки на принтере с текущими установками шрифта.

1.4. Рисование линий и фигур

Метод рисования линий, называемый 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

1.4.1. Установка цвета

Цвет рисунка задается установкой свойства 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 элемента.

1.4.2. Использование относительных координат

Параметр 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)

Достаточно задать абсолютные координаты только начальной точки, а для остальных точек — относительные координаты. Обратите внимание необязательно задавать первую точку каждой стороны прямоугольника, поскольку она совпадает с конечной точкой предыдущей стороны.

1.4.3. Рисование прямоугольников

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 элемента или формы.

1.4.4. Заливка фигур

Помимо цвета, замкнутые фигуры можно заливать различными узорами, зави­сящими от установки свойства 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.

1.4.5. Использование метода Circle

Для рисования кругов, дуг и эллипсов используется метод 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.

1.5. Использование режимов рисования

По умолчанию при рисовании фигур с помощью графических методов пиксели, составляющие фигуру, замещают все существующие на элементе пиксели Однако 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, заменяющая существующие пиксели новыми.

1.5.1. Использование операции xor

Чаще всего на практике применяется установка 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 имеет интересное свойство: при первой прорисовки фигуры вы увидите ее на экране, отображенной поверх его содержимого. При этом изменяется только цвет перво­начального изображения. Если снова нарисовать эту же фигуру, конечным резуль­татом будет ее удаление без всякого воздействия на первоначальное изображение.

1.5.2. Рисование "резиновых" линий

Наиболее используемый режим рисования 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), в которой кнопка была отпущена.

1.6. Рисование кривых

Методы 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)

2. Практическая часть

2.1. Рисование круговых диаграмм (2 часа)

2.1.1 Порядок выполнения работы

Приложение «Круговые диаграммы» использует метод Circle для рисования секторных диаграмм с помощью соединенных дуг (рис.4). Поскольку соединенные дуги являются замкнутыми фигурами, они могут быть залиты узором или сплошным цветом, указанным свойствами FillStyle и FillColor. Приложение предос­тавляет выбор: залить сектор диаграммы узором, сплошным цветом или оставить его пустым.

Рис. 4. Приложение «Круговые диаграммы» использует соединенные дуги для вычерчивания сегментов секторной диаграммы

Программа генерирует 10 случайных чисел в диапазоне от 20 до 100, сохраняет их в массиве PieData() и вычисляет дугу, связанную с каждым числом. Поскольку результат должен составить полную окружность (2*pi), каждый элемент массива PieChart() соответствует дуге 2*pi*PieData(i)/Total радиан. Каждый начальный угол сегмента диаграммы является конечным углом предыдущего сегмента, а их конечные углы равны начальным углам плюс угол, соответствующий их элементу в массиве PieData() Ниже приведен код, реализующий этот метод, для вычерчивания секторной диаграммы

2.1.2 Программа. Приложение Diagram

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

  1. Создайте новую форму и разместите на ней 2 элемента CheckBox и кнопку управления.

  2. Для события Command1_click введите программный код.

  3. Запустите приложение и попробуйте отобразить различные варианты.

  4. Аналогичным образом создайте приложение, которое разбивает линейный индикатор на сегменты

2.1.3 Контрольные вопросы

  1. Объясните назначение аргументов методов Line и Circle.

  2. Чем отличаются замкнутые и незамкнутые фигуры?

  3. Как нарисовать замкнутый сектор?

  4. Что такое заливка цветом и заливка узором?

  5. Какими способами можно определить цвет линий?

  6. Какими способами можно определить цвет заливки?

2.2. Рисование «резиновых» линий (3 часа)

2.2.1 Порядок выполнения работы

Приложение Rubber позволяет рисовать на форме резиновые линии.

  1. Создайте новый проект, и для пустой формы запишите коды, приведенные ниже, для событий нажатия, опускания левой кнопки мыши и ее перемещения.

  2. Запустите его и нажмите левую кнопку мыши в стартовой точке резиновой линии. При перемещениях мыши в различных направлениях вторая конечная точка линии следует за указателем мыши. При каждом перемещении мыши между стартовой точкой и текущей позицией указателя мыши рисуется линия. Эта линия называется резиновой, поскольку при необходимости может поворачи­ваться, сжиматься и растягиваться, следуя движениям мыши. Такое поведение линии подобно поведению резиновой нити, прикрепленной одним концом к стартовой точке, а вторым — к указателю мыши.

  3. После выбора точного положения линии отпустите кнопку мыши, и последняя резиновая линия зафиксируется на форме.

  4. Определите цвет линии пересекающей уже существующую во время движения.

  5. Реализуйте такой же алгоритм для элемента PictureBox.

  6. Дополните форму пунктами «сохранить» и «восстановить», для которых напишите программный код записи изображения в файл «c:\tmp.bmp» и загрузки изображения из этого же файла.

  7. Нарисуйте две линии и выполните команду «сохранить»

  8. Нарисуйте еще несколько линий и выполните команду «загрузить». Оцените результат.

  9. Это приложение легко модернизировать для рисования резиновых прямо­угольников и окружностей. Создайте в приложении меню для выбора объекта «линия», «прямоугольник», «окружность» и реализуйте соответствующий программный код.

2.2.2 Программа. Приложение Rubber

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

2.2.3 Контрольные вопросы

  1. Что такое «резиновые линии» и как их получить?

  2. Какие режимы рисования чаще всего используются?

  3. Какие типы файлов можно загрузить в графические объекты?

  4. Какие типы файлов можно использовать для сохранения изображений?

  5. Для чего требуется установить параметр AutoRedraw равным True?

2.3. Вывод текста на графические объекты (1 час)

2.3.1 Порядок выполнения работы

Проект TxtPrint иллюстрирует использование метода Print (наряду со свойствами TextWidth и TextHeight) для вывода в форму выровненного текста.

  1. Создайте форму и определите ее свойства, как изменяемое окно. Создайте пункт меню «Центрировать». Для этого пункта меню определите очистку экрана и центрированный вывод текста.

  2. Чтобы очистить форму, наберите Form1.Cls

  3. Чтобы поместить текст в середину формы, рассчитайте ее среднюю точку.

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 не имеет значения: положение средней точки формы не зависит от масштаба, изменяются только абсолютные значения ее координат.

2.3.2 Контрольные вопросы

  1. С какой позиции начинает выводить метод Print текст в графический объект?

  2. Какими устанавливаются текущие позиции координат X и Y после применения метода Print?

  3. Как осуществить перенос длинных строк?

2.4. Вывод графиков функций

2.4.1 Порядок выполнения работы

В теоретическом разделе вы ознакомились со всеми важными частями программного кода, необ­ходимого для построения графиков функций. Соберите их вместе, чтобы создать приложение Graph (График).

Щелчок на кнопке «НАРИСОВАТЬ ГРАФИК» дает возможность построить график функции (см. рис.5) в элементе PictureBox. Выбор метода прорисовки можно определить при помощи элемента CheckBox.

Рис. 5. Приложение Graph строит графики математических функций

  1. Создайте форму и поместите в ней элементы: PictureBox, CheckBox и CommandButton

  2. Для кнопки «НАРИСОВАТЬ ГРАФИК» напишите приведенный ниже программный код

  1. Напишите ко функции, график которой следует вывести, например:

Function Function2(ByVal X As Double) As Double

Function2 = Cos(3 * X) * Sin(5 * X)

End Function

  1. Убедитесь, что приложение работает и выводит график функции.

  2. График функции показан на рис 6 справа. Недостатки кода проявляются в разрывах между соседними точками функции. Чтобы "закрыть" разрывы, можно заменить метод PSet (который устанавливает один пиксель) методом Line, рисующим сегмент линии между двумя соседними точками. Иными словами, разрывы графика устраняются построением сегментированной линии. Для этого установите флажок «РИСОВАТЬ ЛИНИЯМИ», и постройте график заново. График функции будет таким, как показано на рис.6 слева. Разумеется, графики функций должны отображаться непрерывными линиями. Обратите внимание, в методе Line используются относительные координаты текущей точки, которая одновре­менно служит конечной точкой предыдущего сегмента линии.

  3. Самостоятельно напишите код для кнопки «НАРИСОВАТЬ 2 ГРАФИКА», в качестве второй функции возьмите:

Function Function2(t As Double)

Function2 = Exp(2 / t) * Sin(2 * t)

End Function

  1. Приложение Graph используется как основа программы построения графиков. Можно к собственным функциям добавить различные средства, например, оциф­ровку осей, главные и дополнительные деления на осях, легенды и т.д. Кроме того, вы можете с помощью цвета строить графики множества функций, т.е. использовать приложение Graph как исходный материал для пользовательских приложений построения графиков.

2.4.2 Программный код кнопки «График 1»

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

2.4.3 Контрольные вопросы

  1. Как определить масштаб по оси X?

  2. Каким образом определяется шаг изменения параметра X?

  3. Каким образом определяются максимальные и минимальные значения функции на заданном интервале?

  4. Как определить масштаб по оси Y?

  5. В чем отличие прорисовки графика методами Pset и Line?

1

48

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