Растровая и векторная графика, система координат. Базовые методы класса

Graphics.

Все графические изображения подразделяются на векторные и растровые. В векторных

изображениях положение точек (пикселей), из которых они состоят, определяется

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

прямой или эллипса). Растровое изображение тоже состоит из точек. Но в нем каждая

точка определяется отдельно.

Существенное различие между векторной и растровой графикой состоит в том, что

векторная графика не привязана к разрешению экрана. При любом разрешении векторное

изображение будет иметь один и тот же размер, заданный в его определении. Растровое

же изображение при любом разрешении экрана будет содержать одно и то же количество

пикселей. Следовательно, чем выше разрешение экрана, тем меньший физический размер

будет иметь пиксель и тем меньший размер будет иметь растровое изображение.

VB.NET позволяет рисовать практически на любом элементе управления. Чаще всего

графика выводится на двух объектах: Form и PictureBox.

Каждая форма и каждое графическое поле PictureBox обладают своей системой

координат. По умолчанию начало отсчета находится в левом верхнем углу формы. Ось Х направлена

вправо, ось Y – вниз.

Система координат по умолчанию состоит из строк и столбцов графических элементов –

пикселей. Пиксель – это минимально возможная точка, физические размеры которой

зависят от установленной в операционной системе разрешающей способности экрана.

Нумерация строк и столбцов пикселей начинается с 0. Точка с координатами (9, 4)

означает пиксель, находящийся на пересечении столбца № 9 пикселей со строкой № 4

пикселей

Можно загрузить изображение на управляющий элемент на этапе разработки (в состоянии

проекта design). Для этого следует выделить этот объект и в окне свойств найти

свойство Image. Затем в поле значения этого свойства нужно щелкнуть на кнопке с многоточием. В ответ

откроется диалоговое окно Open (открыть), в котором следует выбрать файл, содержащий

изображение.

Для установления соответствия между размерами изображения и размерами

управляющего элемента следует воспользоваться свойством SizeMode последнего (если

управляющий элемент имеет такое свойство). Это свойство может принимать значения:

Normal – размер рисунка не изменяется;

CenterImage – размещение рисунка по центру управляющего элемента (имеет смысл,

если рисунок меньше управляющего элемента);

StretchImage – размер рисунка будет подогнан под размер управляющего элемента;

AutoSize – размер управляющего элемента будет подогнан по размеру рисунка.

Можно загрузить изображение на управляющий элемент на этапе выполнения (в

состоянии проекта Debugging). Следующая инструкция размещает на графическом поле

pbxMoney рисунок, хранящийся в файле dollars.gif:

pbxMoney.Image = System.Drawing.Bitmap.FromFile _

("D:\Моя рабочая папка\dollars.gif")

В состоянии выполнения проекта изображение можно изменять через код проекта.

Свойство Image объекта управления представляет собой объект, следовательно, имеет

свойства и методы для манипулирования изображением.

Можно также удалить изображение на управляющем элементе на этапе выполнения.

Следующая инструкция удаляет рисунок с графического поля pbxMoney:

If Not (pbxMoney.Image Is Nothing) Then

pbxMoney.Image.Dispose()

pbxMoney.Image = Nothing

End If

Так метод RotateFlip позволяет выполнить поворот или зеркальное отображение

рисунка.

Набор классов, предназначенных для вывода текста и изображений, составляет интерфейс

для создания графики – GDI (Graphics Design Interface). GDI+ – это его последняя версия.

Классы GDI+ располагаются в модулях: System.Drawing,

System.Drawing.Drawing2D, System.Drawing.Imaging и

System.Drawing.Text. Необходимые для использования в проекте модули следует

импортировать в проект, поместив в начале кода проекта предложение:

Imports System.Drawing, System.Drawing.Drawing2D, _

System.Drawing.Imaging, System.Drawing.Text

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

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

объект Graphics. Выбрав соответствующий метод этого объекта, можно нарисовать

нужную геометрическую фигуру.

Далее выбирается инструмент. Инструментом может быть объект Pen (перо) или объект

Brush (кисть). Перо предназначено для рисования линий или контуров. Кистью можно

нарисовать заполненный контур. Главными характеристиками объекта Pen являются цвет

и толщина линии. Главными характеристиками объекта Brush являются цвет и образец

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

движения. Листинг 6.2 содержит код, рисующий на форме две прямые линии.

Подпрограмма Button1_Click рисует горизонтальную прямую линию синего цвета (на

рис. 6.3 эта линия расположена снизу). Подпрограмма Form1_Paint рисует прямую

линию красного цвета (на рис. 6.3 эта линия расположена сверху). Событие Paint

происходит, когда объект или его часть снова становится видимым после того, как он был

перемещен, увеличен, заслонен другим окном или изменил размеры.

Если у управляющего элемента есть свойство Graphics, значит, на нем можно рисовать.

Свойство Graphics возвращает одноименный объект, который представляет набор

методов, необходимых для рисования на поверхности элемента управления. Для

извлечения объекта, связанного с конкретным элементом управления нужно вызвать

метод CreateGraphics этого элемента управления. Например, для рисования на

элементе управления PictureBox1 сначала следует объявить объектную переменную

типа Graphics и инициализировать ее объектом, возвращаемым методом

CreateGraphics элемента управления PictureBox1:

Dim G As Graphics

G = PictureBox1.CreateGraphics

Если же нужно рисовать на форме, необходимо создать объект Graphics с помощью

метода CreateGraphics этой формы:

Dim G As Graphics

G = Me.CreateGraphics

У объекта Graphics имеется несколько базовых свойств. Свойство PageUnit

определяет единицу изменения, которая будет использоваться для выражения координат в

объекте Graphics.

Структуры.

Кроме базовых типов данных, таких как Integer, Long и т.п., VB поддерживает

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

базовых типов данных, так и на основе типов ранее определенных пользователем.

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

построении файлов произвольного доступа.

Для определения пользовательского типа (структуры) данных используется

ключевое слово Structure:

[Public/Private]Structure Имя_типа

Dim/Public/Private Элемент1 As Тип

Dim/Public/Private [Элемент2 As Тип]

.

.

.

End Structure

Структура не может быть объявлена внутри процедуры или в функции. Она может быть

объявлена только в начале проекта, а также в форме или в модуле до первой процедуры.

Определив собственный тип данных, Вы можете использовать его для объявления

переменных этого типа. Эти переменные могут быть локальными, переменными области

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

записью. Отдельные компоненты этой переменной называют полями записи. Переменная

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

свой состав отдельные элементы, но в отличие от массива, ее элементы могут иметь

разный тип:

Public Class Form1

Structure Товар

Dim Название As String

Dim Цена As Decimal

Dim Номер As Long

End Structure

Dim Инструмент As Товар

Private Sub Button1_Click()

..

.

Инструмент.Название = "Отвертка"

Инструмент.Цена = 120

.

.

.

End Sub

В этом примере определяется тип данных Товар. Затем объявляется переменная

Инструмент типа Товар, а конкретные значения составляющих этой переменной

устанавливаются в процедуре Buttonl_Click.

Доступ к элементам переменной пользовательского типа осуществляется, по аналогии с

доступом к свойствам, путем указания точки после имени переменной. При этом

переменные одинакового типа можно присваивать не поэлементно, а напрямую:

Structure Субъект

Dim Фамилия_и_Инициалы As String

Dim ТабельныйНомер As Integer

End Structure

Dim Читатель, Пользователь As Субъект

Private Sub Button1_Click()

Пользователь.Фамилия_и_Инициалы = "Иванов И.И."

Пользователь.ТабельныйНомер = 218739

Читатель = Пользователь

End Sub

Переменные Читатель и Пользователь относятся к одному типу Субъект. Поэтому

они присваиваться напрямую, а не поэлементно.

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

последовательность определения типов. Сначала нужно определить базисный тип,

который будет использоваться далее в составных типах. Если не соблюдать это правило,

то после запуска программы появится сообщение об ошибке. Ниже приводится пример

использования составных пользовательских типов данных:

Structure Персона

Dim Имя As String

Dim Фамилия As String

End Structure

Structure Клиент

Dim Идентификатор As Персона

Dim ДеньРождения As Date

End Structure

Dim Покупатель As Клиент

Private Sub Button1_Click()

Покупатель.Идентификатор.Имя = "Иван"

Покупатель.Идентификатор.Фамилия = "Петров"

End Sub

Можно в подпрограмме Button1_Click создать массив записей:

Dim Персоны(100) As Персона

Обращение к полям седьмого элемента этого массива выглядит так:

Персоны(6).Имя

Персоны(6).Фамилия

В качестве элементов структуры можно использовать массивы.

Данные пользовательского типа рекомендуется использовать при обработке

данных неизменной структуры.

28)Файлы с последовательным доступом, открытие, запись, чтение.

Записать в файл последовательного доступа произвольного (по желанию

пользователя) числа записей. Затем все записи прочитать из файла и отобразить в

текстовом поле.

Работа с файлом последовательного доступа

Private Sub btnПуск_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnПуск.Click

Dim s, ss As String

Dim k As Integer

Dim b As Boolean

k = FreeFile()

5: FileOpen(k, "E:\MY Documents\F1.txt", OpenMode.Output)

Do Until b

s = InputBox("Содержание записи = ?")

PrintLine(k, s)

s = InputBox("Продолжать? Введите да или иное - (нет)")

10: If s = "да" Then b = False Else b = True

Loop

FileClose(k)

k = FreeFile()

FileOpen(k, "E:\MY Documents\F1.txt", OpenMode.Input)

15: ss = “”

Do Until EOF(k)

s = LineInput(k)

ss = ss & s & vbCrLf

Loop

20: FileClose(k) txtЖурнал.AppendText(ss)

End Sub

Чтобы иметь возможность использовать файл, его нужно открыть или создать, если он

еще не существует. Функция FileOpen(), выполняющая эту операцию, принимает

множество аргументов, из которых обязательными являются только первые три:

FileOpen(number, path, mode _

[, access][, share][, recordLen])

В аргументе number задается номер файла, предварительно полученный с помощью

функции FreeFile().В аргументе path задается путь к открываемому файлу. Аргумент

mode определяет режим открытия файла и может содержать одно из значений,

перечисленных в табл.

Значение Описание
OpenMode.Input Файл открывается только для ввода данных (то есть для чтения из файла)
OpenMode.Output Файл открывается только для вывода (то есть для записи в файл)
OpenMode.Append Файл открывается для добавления новых данных

В файле с последовательным доступом изменять отдельные элементы данных

нельзя. Можно либо прочитать их (а при желании и сохранить в другом файле), либо

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

открыть его в режиме Input, считать данные и закрыть файл. Для перезаписи данных

нужно снова открыть этот файл, на этот раз в режиме Output, и сохранить в нем новые

данные.

Если не нужно перезаписывать существующий файл, и Вы хотите просто добавить в него

данные (не меняя существующие), откройте файл в режиме Append.В случае открытия файла в режиме Output (и только в этом режиме) VB сотрет его

содержимое, даже если Вы ничего в него не запишете. Более того, VB не станет

предупреждать Вас о своем намерении стереть файл.

Аргумент access определяет, следует ли открыть файл для чтения (Read), записи

(Write) или и чтения, и записи (ReadWrite). Если открыть файл с опцией Read,

программа не сможет модифицировать его даже по ошибке. Данный аргумент не имеет

никакой связи с типом файла. Файлы с последовательным доступом можно открывать

лишь с опциями Read и Write, поскольку их можно либо только записывать, либо

только считывать. Аргумент access предназначен исключительно для защиты данных от

случайного изменения. Если Вам нужно прочитать данные из файла, откройте его с

опцией Read, что позволит исключить риск их изменения.

Аргумент share определяет права других приложений Windows на то время, пока ваше

приложение держит файл открытым.

ФункцияPrintLine() записывает данные в файл с последовательным доступом:

PrintLine(file_number, output_list)

В ее первом аргументе задается номер файла, в который производится запись, а в

остальных аргументах – записываемые значения. Аргумент output_list представляет

собой массив параметров, через который функции можно передать любое количество

значений:

PrintLine(n, v1, v2, "Петров", 123.456)Если в файл записывается несколько значений, они разделяются запятыми, и каждая такая

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

Зоне вывода соответствуют 14 позиций.

Для чтения очередной записи данных из файла с последовательным доступом

используется функция LineInput():

LineInput(file_number)

В аргументе file_number ей передается номер уже открытого файла. При первом

вызове она считывает все символы от начала файла до первого символа новой записи.

Когда Вы вызываете ее во второй раз, она возвращает все последующие символы вплоть

до следующего символа новой записи.

Символ новой строки не включается в результирующие данные – он используется только

в качестве разделителя. Приведенный ниже код прочитает две очередные записи файла и

присвоит их строковым переменным st1 и st2:

st1 = LineInput(n)

st2 = LineInput(n)

Если требуется сохранить в файле на диске обычный текст, следует создать для этой цели

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

открыть файл снова и прочитать текст построчно с помощью функции LineInput().

FilePut(file_number, value[, record_number]),

FileGet(file_number, value[, record_number])

29) Файлы с произвольным доступом и двоичные файлы, открытие, запись, чтение.

Режим Random предназначен для файлов с произвольным доступом, а Binary – для двоичных

файлов.

Значение Описание
OpenMode.Random Файл открывается для произвольного доступа (чтения и записи, по одной записи зараз)
OpenMode.Binary Файл открывается как двоичный

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

Каждой из них может быть передан номер записи, с которой Вы хотите работать. В

аргументе record_number задается номер записи, а в аргументе value – переменная,

содержащая записываемую в файл запись или принимающая запись, которая считывается

из файла. Аргумент record_number не обязателен; если он не задан, будет

записываться или считываться текущая запись. После записи или чтения очередной

записи текущей становится следующая запись. Таким образом, вызвав функцию

FilePut() десять раз подряд без указания номера записи, Вы последовательно

создадите или перезапишете первые десять записей файла с произвольным доступом.

Точно так же, вызвав десять раз подряд функцию FileGet() без указания номера

записи, Вы последовательно прочитаете первые десять записей файла.

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

Вы хотите создать файл с произвольным доступом для хранения списка товаров.

Информация о каждом из товаров содержится в структуре Товар, определяемой

следующим образом:

Structure Товар

Dim Код As String

Dim Название As String

Dim Цена As Decimal

End Structure

Структура Товар будет использоваться для хранения информации о товаре перед ее

записью в файл. Начнем с объявления переменой типа Товар:

Dim Тов As Товар

Теперь можно присвоить значения полям структуры Тов:

Тов.Код = "TV00180-A"

Тов.Название = "SONY Trinitron TV"

Тов.Цена = 799.99

Для записи данных, хранящихся в переменной Тов, в файл с произвольным доступом, мы

воспользуемся функцией FilePut(). Конечно, файл сначала нужно создать с помощью

инструкций:

fn = FreeFile()

FileOpen(fn, "c:\products.dat", OpenMode.Random)

Как видите, последний аргумент, в котором задается длина записи, здесь опущен. Записи

содержат строки, следовательно, имеют переменную длину. Информация о длине каждой

строки хранится вместе с самой строкой, так что определять длину каждой записи не

понадобится. Далее переменная Тов записывается в файл с помощью инструкции:

FilePut(fn, Тов)

Обратите внимание, что номер записи, в которой сохраняются данные, не указан. Вы

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

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

помощью инструкции FileClose(fn).

Для того чтобы прочитать данные из файла, нужно открыть его с применением той же

функции FileOpen(), с помощью которой мы открывали его для записи данных:

fn = FreeFile()

FileOpen(fn, "c:\products.dat", OpenMode.Random)

Затем обычно выполняется цикл чтения записей.

Следующий фрагмент кода демонстрирует, как записать в файл с произвольным доступом

записи разной длины с помощью функции FilePut() и как их прочитать с помощью

функции FileGet(). Прежде всего, добавьте в форму до первой процедуры следующее

объявление структуры:

Structure Товар

Dim Код As String

Dim Название As String

Dim Цена As Decimal

End Structure

Затем поместите в форму кнопку и введите в обработчике ее события Click такие

инструкции:

Dim fn As Integer

Dim Тов As Товар

Тов.Код = "TV00180-A"

Тов.Название = "SONY Trinitron TV"

Тов.Цена = 799.99

fn = FreeFile()

FileOpen(fn, "c:\products.dat", OpenMode.Random)

FilePut(fn, Тов)

Тов.Код = "TV-RCA"

Тов.Название = "This is an RCA Trinitron TV"

Тов.Цена = 699.99

FilePut(fn, Тов)

Тов.Код = "TV810X"

Тов.Название = "Real cheap BIG Trinitron TV"

Тов.Цена = 399.99

FilePut(fn, Тов)

FileClose(fn)

fn = FreeFile()

FileOpen(fn, "c:\products.dat", OpenMode.Random)

FileGet(fn, Тов, 2)

FileClose(fn)

Console.WriteLine(Тов.Код)

Console.WriteLine(Тов.Название)

Console.WriteLine(Тов.Цена)

Коды и описания различных товаров представляют собой строки разной длины. Первая

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

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

переменную длину. Функции FilePut() и FileGet() берут на себя ответственность за

работу с такими строками, предоставляя Вам доступ к данным файлов с произвольным

доступом и используя запись в качестве базовой единицы длины.

30)Реляционные базы данных. Связь между таблицами. Виды связи «один ко многим»,

«многие ко многим».(неполный)

База данных обеспечивает хранения сложных структурированных данных и при этом

позволяет сравнительно просто извлекать данные. Базы данных поддерживаются

специальными программами, такими как Access и SQL Server. Эти программы

называются системами управления базами данных (СУБД). Различают базы данных

иерархические, сетевые и реляционные. Наиболее распространены реляционные базы

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

VB.NET позволяет отображать, анализировать и изменять информацию в базах данных.

Для этой цели предусмотрена модель доступа к данным, которая называется ADO.NET.

Эта модель позволяет работать с мощными базами данных, созданными одной из СУБД

(Microsoft Access, Microsoft FoxPro, Paradox, Oracle и Microsoft SQL Server).

! Простая база данных может включать в свой состав всего одну таблицу. Но чаще всего

такое решение недопустимо.

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

базе данных такие сведения носят название первичного ключа таблицы. Первичный ключ

применяется для связи с другими таблицами. Он не может не иметь значения, его

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

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

?Вернемся к рассмотренному в предыдущем разделе примеру о книгах. Таблица

книг связана с таблицей авторов. Но один и тот же автор может быть автором нескольких

книг. Такая связь между таблицей книг и таблицей авторов представляет собой отношение

«один-ко-многим». Для реализации такой связи между таблицей книг и таблицей авторов

в таблице книг следует поместить поле вторичного ключа, в котором для каждой книги

указывается значение первичного ключа соответствующего автора в таблице авторов.

Учтем, что у книги может быть не один, а несколько авторов. С другой стороны,

отдельный автор может быть автором нескольких книг. Следовательно, для каждой

записи таблицы книг может существовать несколько записей в таблице авторов. И,

наоборот, для каждой записи в таблице авторов может существовать несколько записей в

таблице книг. Такой тип связи между таблицами называется отношением «многие-ко-

многим».

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

каждого отдельного автора книги, нельзя признать удачной. Сколько бы не было

предусмотрено возможностей включить для книги новое поле для дополнительного

автора, этих полей может оказаться недостаточно. И в то же время, когда авторов книги

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

использованию памяти.

Решением этой проблемы является создание третьей, связующей, таблицы, имеющей

всего два поля. С помощью связующей таблицы отношение «многие-ко-многим»

разбивается на два отношения «один-ко-многим». В первое поле связующей таблицы

записывается первичный ключ книги. Во второе поле записывается первичный ключ

автора. Если у книги несколько авторов, то запись с первичным ключом книги в

связующей таблице повторяется столько раз, сколько авторов у книги. В этой связующей

таблице роль первичного ключа играют два вторичных ключа, сочетание значений

которых, является уникальным для всей совокупности записей связующей таблицы

Наши рекомендации