Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
16
Добавлен:
06.11.2017
Размер:
859.54 Кб
Скачать

5.1.3. Структура приложений в vb

В VB можно создавать различные приложения. Кратко охарактеризуем три основных шаблона проектов:

  • Приложение с Windows Form (Windows FormApplication) – основной вид проектов языкаVB. Интерфейс таких приложений строится в визуальном стиле на основе формWindows. ПриставкаVisualв названии языка во многом определяется возможностями этого типа проектов.

  • Библиотека классов (Class Library)– проект, позволяющий построитьDLL(Dynamic Link Library) – динамически подключаемую библиотеку классов. Дело в том, что всегда полезно отделять содержательную часть приложения от ее интерфейса. Классы, определяющие содержание приложения, могут собираться вDLL, которая затем будет подключаться к проекту, описывающему интерфейс приложения. Такой подход в наибольшей степени соответствуетповторному использованию. Один раз созданные содержательные классы, собранные вDLL, могут использоваться в разных приложениях.

  • Консольное приложение (Console Application) – этот тип проектов не используется в программных продуктах, для которых интерфейс играет крайне важную роль. Тем не менее, это весьма популярный у разработчиков тип проектов, используемый для внутренних целей в ходе разработки. Этот тип проектов довольно часто будет использоваться в примерах, когда для понимания тех или иных возможностей языкаVBдостаточно весьма простого интерфейса – ввода и вывода данных на консоль.

Рис. 5.1-12. Диалоговое окно Создать проект (New Project)

Как известно, для создания любого проекта в VS используется диалоговое окно Создание проекта (New Project) (рис. 5.1-12). Для его открытия необходимо выполнить одно из следующих действий:

  • выбрать ссылку Создать: проект... (Create: Project...) в окне Начальная страница (Start Page);

  • выполнить команду Создать проект… (New Project…) из элемента главного меню Файл (File);

  • нажать кнопку Создать проект (New Project), расположенную на стандартной панели инструментов.

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

Класс (Class)– это центральное понятие объектно-ориентированного программирования и языка VB. Разработчик проектов на VB использует стандартные классы из библиотекиFCL(т.е. Framework Class Library, библиотеки классов платформы .NET) и создает собственные классы.

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

Во-первых, Класс– это модуль – архитектурная единица построения проекта по модульному принципу. Справиться со сложностью большого проекта можно только путем деления его на модули, - сравнительно небольшие единицы, допускающие независимую разработку и последующее объединение в большую систему.

Во-вторых, Класс– это тип данных. Тип данных – это семантическая единица, описывающая свойства и поведение множества объектов, называемых экземплярами класса. Синтаксически класс представляет описание данных, называемых полями класса, описание методов класса и описание событий класса. Для класса, рассматриваемого как тип данных, поля определяют состояние объектов, методы – поведение объектов. События – это некоторые специальные состояния, в которых может находиться объект, и которые могут обрабатываться внешними по отношению к классу обработчиками события.

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

Объект (Object). Определив класс, разработчик получает возможность динамически создавать объекты класса. Для программистов, начинающих работать в объектном стиле, типичной ошибкой является путаница понятий объекта и класса. Нужно с самого начала уяснить разницу. Класс, создаваемый разработчиком, представляет статическое описание множества объектов. Объект – это динамическое понятие, он создается в ходе выполнения программной системы, реально существует в памяти компьютера и обычно исчезает по завершении выполнения проекта. Программист может создать программную систему, включающую два - три класса, но в ходе работы такой системы могут динамически появляться сотни объектов, взаимодействующих друг с другом достаточно сложным образом. Показателен тот факт, что центральный класс в библиотекеFCL, являющийся прародителем всех классов как библиотечных, так и создаваемых разработчиком проектовVB, назван именемObject.

Пространство имен (Namespace)– это оболочка, содержащая множество классов, объединенных, как правило, общей тематикой или группой разработчиков. Собственные имена классов внутри пространства имен должны быть уникальны. В разных пространствах могут существовать классы с одинаковыми именами. Полное или уточненное имя класса состоит из уникального имени пространства имен и собственного имени класса. В пространстве имен могут находиться как классы, так и пространства имен.

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

Пространства имен придают структуру библиотеке FCL, содержащей большое число различных пространств имен, объединяющих классы определенной тематики. Центральным пространством имен библиотекиFCLявляется пространствоSystem, содержащее другие пространства и классы, имеющие широкое употребление в различных проектах.

Проект (Project)– это единица компиляции. Результатом компиляции проекта является сборка. Каждый проект содержит одно или несколько пространств имен. Как уже говорилось, на начальном этапе создания проекта по заданному типу проекта автоматически строится каркас проекта, состоящий из классов, являющихся наследниками классов, входящих в состав библиотекиFCL. Так, если разработчик указывает, что он хочет построить проект типаWindows приложение, то в состав каркаса проекта по умолчанию войдет классForm1– наследник библиотечного классаForm. Разработчик проекта дополнит созданную форму элементами управления – объектами соответствующих классов, тем самым расширив возможности класса, построенного по умолчанию.

Каждый проект содержит всю информацию, необходимую для построения сборки. В проект входят все файлы с классами, построенные автоматически в момент создания проекта, и файлы с классами, созданные разработчиком проекта. Помимо этого проект содержит ссылки на пространства имен из библиотеки FCL, содержащие классы, используемые в ходе вычислений. Проект содержит ссылки на все подключаемые к проектуDLL,COM-объекты, другие проекты. В проект входят установки и ресурсы, требуемые для работы. Частью проекта является файл, содержащий описание сборки.

В зависимости от выбранного типа проект может быть выполняемым или невыполняемым. К выполняемым проектам относятся проекты типа ConsoleилиWindows. При построении каркаса выполняемого проекта в него включается класс, содержащий статическую процедуру с именемMain( ).

К невыполняемым проектам относятся проекты типа DLL. В результате компиляции такого проекта в сборку войдет файл с расширением *.dll. Такие проекты (сборки) непосредственно не могут быть выполнены на компьютере. Они присоединяются к выполняемым сборкам, откуда и вызываются методы классов, размещенных в невыполняемом проекте (DLL) .

Сборка (Assembly)– результат компиляции проекта. Сборка представляет собой коллекцию из одного или нескольких файлов, помеченных номером версии. Каждая сборка разворачивается на компьютере как единое целое. Программист работает с проектами,CLR (CommonLanguageRuntime– общеязыковая среда выполнения) работает со сборками. Сборка позволяет решать вопросы безопасности, так как содержит описание требуемых ей ресурсов и права доступа к элементам сборки. Каждая сборка содержит манифест, содержащий полное описание сборки, ее элементов, требуемые ресурсы, ссылки на другие сборки, исполняемые файлы. Благодаря этому описаниюCLRне требуется никакой дополнительной информации для развертывания сборки, трансляции промежуточного кода и его выполнения. Манифест идентифицирует сборку, специфицирует файлы, требуемые для реализации сборки, специфицирует типы и ресурсы, составляющие сборку, задает зависимости, необходимые в период компиляции для связи с другими сборками, специфицирует множество разрешений, необходимых, чтобы сборка могла выполняться на данном компьютере.

Решение (Solution).Каждый проект, создаваемый в VS, помещается в некоторую оболочку, называемуюРешением (Solution). Решение может содержать несколько проектов, как правило, связанных общей темой. Например, все проекты, рассматриваемые в данном пособии, могут быть помещены в одноРешение. В примерах данного разделаРешениебудет содержать три проекта –DLLс классами, определяющими содержательную сторону приложения, и два интерфейсных проекта –консольный иWindowsприложения.

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

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

Рассмотрим на примере основные шаги создания основных типов проектов и решения.

Пример 5.1-4. Создать три проекта, которые содержат –библиотеку классов,консольный проектиWindows-проект. ПроектClassLibraryMath должен реализовать классClassLibraryMath,аналог классаMath, причем здесь ограничимся вычислением одной функцииsin(x), что позволит повторно использовать ее, присоединяя к консольному иWindowsпроектам.

Напомним, что функцию sin(x), как и другие математические функции, можно вычислить, используя разложение в ряд Тэйлора:

Построим необходимые рекуррентные соотношения. Запишем соотношения для a0, ak, ak+1:

Вычислив отношение ak+1/ak, получим требуемое рекуррентное соотношение:

  1. Создание DLL - проекта типа Библиотека классов (Class Library)

Запустим VS, со стартовой страницы перейдем к созданию проекта и в качестве типа проекта укажем типБиблиотека классов (Class Library). В открывшемся окне созданияDLL, все поля заполнены значениями по умолчанию. Как правило, их следует переопределить.

В поле Имя(Name)задается имя строящейсяDLL–ClassLibraryMath.

В поле Расположение(Location)указывается путь к папке проекта.

Обратите внимание и на другие установки, сделанные в этом окне - в верхнем окошке из списка возможных каркасов выбран каркас Framework .Net 3.5. Задав требуемые установки и щелкнув по кнопкеOK, получим автоматически построенную заготовку проектаDLL, открытую в среде разработки проектовVS.

В окне проектов Обозреватель решений (Solution Explorer)показаноРешениес именемClassLibraryMath, содержащее проектDLLс именемClassLibraryMath. В папкеСвойства(Properties)проект содержит файл с описанием сборки – ее имя и другие характеристики. В папкеСсылки(References)проект содержит ссылки на основные пространства имен библиотекиFCL, которые могут понадобиться в процессе работыDLL. Если содержимое этой папки не отображается, то необходимо щелкнуть по значкуПоказать все файлыв верхней частиОбозревателя решений (Solution Explorer).

Поскольку всякая DLLсодержит один или несколько классов, то для одного класса, которому по умолчанию дано имяClass1, заготовка построена. Класс этот, показанный в окне кода, пока что пуст – не содержит никаких элементов.

Построенный автоматически класс вложен в пространство имен, которое по умолчанию получило имя, совпадающее с именем проекта – ClassLibraryMath.

Была рассмотрена подготовительная часть работы, которую Visual Studio выполнила для нас. Дальше предстоит потрудиться самим.

Изменим имя Class1на имяClassLibraryMath.Это продиктовано правилом стиля –имя класса и имя файла, хранящего класс,должны совпадать. Переименование имени файла делается непосредственно в окне проектовSolution Explorer.

Поскольку необходимо создать аналог класса Math, то в нашем классе должны быть аналогичные методы. Начнем, как уже говорилось, с метода, позволяющего вычислить функциюsin(x). Заголовок метода сделаем такой же, как и в классе аналоге. В результате программный код класса будет как на рис.5.1-13.

Option Explicit On

Option Strict On

Public Class ClassLibraryMath

'Константы класса

Const EPS As Double = 0.000000001

'Статические методы класса

Shared Function Sin(ByVal x As Double) As Double

Dim a, res As Double

Dim k As Integer

a = x

res = 0

k = 0

'Основные вычисления

Do While (Math.Abs(a) > EPS)

res = res + a

a = a * (-x * x / ((2 * k + 2) * (2 * k + 3)))

k = k + 1

Loop

Return res

End Function

End Class

Рис. 5.1-13

Поставленная цель достигнута, - создан программный код, содержащий класс, метод которого позволяет вычислять по заданному аргументуx функциюsin(x). Метод построен в полном соответствии с алгоритмом, описанным вп.п.4.6 Темы 4.

Теперь вернемся к технической стороне дела. Построим Решение, содержащее проект, для чего вГлавном менюсреды выберем элементПостроение (Build)и выполним командуПостроить решение (Build Solution). В результате успешной компиляции будет построен файл с уточнением*.dll. Поскольку построенная сборка не содержит выполняемого файла, то непосредственно запустить наш проект на выполнение не удастся. Далее построим консольный проект, к которому присоединим нашу библиотекуDLL, и протестируем, насколько корректно работают созданные нами методы. Заодно разберемся с тем, как строится консольный проект и как к нему подсоединяется сборка, содержащаяDLL.

  1. Создание консольного проекта

Вначале необходимо построить интерфейс, обеспечивающий конечному пользователю доступ к тем сервисам, которые предоставляет созданный класс ClassLibraryMath. Начнем с построения простейшего интерфейса, позволяющего пользователю с консоли вводить исходную информацию – в нашем случае аргументx. С исходными данными пользователь может провести вычисления, а затем полученные результаты вывести на консоль – экран дисплея. Для организации подобного интерфейса и служит тип проекта – Консольное приложение.

Чтобы создать новый проект, находясь в среде разработки, вовсе не обязательно начинать со стартовой страницы. Достаточно выбрать элемент Новый (New)основного менюФайл (File)и выполнить командуПроект (Project), приводящий на страницу создания нового проекта. В этом окне, как описано ранее, зададим тип строящегося проекта, и дадим ему имяConsoleToMath.

В консольном проекте стандартный модуль Module1создается автоматически и содержит единственный статический метод – процедуруMain( ). Если этот проект запустить на выполнение, то начнет выполняться код этой процедуры, пока отсутствующий и который предстоит нам создать.

Когда проект запускается на выполнение, то в него должна входить сборка, отмеченная как стартовая, содержащая класс с точкой входа – статическим методом (процедурой) Main( ). Дальнейший сценарий зависит от содержимого точки входа. Как правило, в процессе работы методаMain( )создаются один или несколько объектов других классов, они и вызывают методы и/или обработчики событий, происходящих с созданными объектами. В этих методах и обработчиках событий могут создаваться новые объекты, вызываться новые методы и новые обработчики. Так, начиная с одной точки, разворачивается целый мир объектов приложения.

Далее в проект добавим соответствующий программный код (Рис. 5.1-14).

Option Explicit On

Option Strict On

Namespace ConsoleToMath 'В данном случае можно опустить

Module Module1

Sub Main()

'Входные данные

Dim x As Double = 0

Const INVITE As String = _

"Введите вещественное число x" + _

"- аргумент функции Sin(x)"

Const CONTINU As String = _

"Продолжим? (Yes/No)"

Dim answer As String = "yes"

Do 'Организация ввода данных

Console.WriteLine(INVITE)

Dim temp As String = Console.ReadLine()

x = Convert.ToDouble(temp)

'Вычисления и вывод результата

Dim res As Double = 0

res = Math.Sin(x)

Console.WriteLine("Math.Sin(x) = " + _

res.ToString())

res = ClassLibraryМаth.ClassLibraryМаth.Sin(x)

Console.WriteLine("MathTools.MyMath.Sin(x) = " + _

res.ToString())

'диалог с пользователем

Console.WriteLine(CONTINU)

answer = Console.ReadLine()

Loop While (answer <> "No")

End Sub

End Module

End Namespace

Рис. 5.1-14

  1. Связывание с DLL

Первым делом свяжем два построенных проекта, для чего в консольный проект добавим ссылку на проект с DLLClassLibraryMath. Для этого в окнеОбозреватель решений (Solution Explorer)подведем указатель мыши к имени консольного проекта и из контекстного меню, появляющегося при щелчке правой кнопки, выполним командуДобавить ссылку (Add Reference). В открывшемся окне добавления ссылок выберем вкладкуПроект (Projects). Поскольку проектClassLibraryMathне включен в текущееРешение, то он автоматически не появится в открывшемся окне. Если ссылку нужно установить на проект, не включенный вРешение, как в нашем случае, то в окне добавления ссылок нужно задать путь к проекту. Для этого необходимо щелкнуть на вкладке Обзор и задать путь к проектуClassLibraryMath, в папке…\bin\Relase\ClassLibraryMath.dllкоторого и находится нужный файл. После этого добавления ссылка наDLLпоявится в папкеСсылки(References)консольного проекта. Теперь проекты связаны и из консольного проекта доступны сервисы, предоставляемые соответствующей библиотекойDLL.

  1. Организация консольного интерфейса

Задача программного кода, который непосредственно встроен в уже созданную процедуру Main( ),достаточно понятна. Дадим краткие комментарии к этому коду:

Входные данные устроены просто – задается лишь одна переменная xтипаDouble.

Вводу значения xпредшествует, как и положено для хорошего стиля программирования, приглашение к вводу. Для ввода и вывода значений используются статические методыReadLine( )иWriteLine( )классаConsole, входящего в библиотекуFCLи предоставляющего свои сервисы пользователям консольных приложений. Для преобразования введенных данных, представляющих собой строки текста, к нужному типу (в нашем случае к типуDouble) используются статические методы классаConvert, сервисы которого позволяют проводить различные преобразования между типами данных.

Значение функции Sin(x)вычисляется двумя разными методами – методом стандартного классаMathи методом классаClassLibraryMath.

В коде применяется стандартный прием зацикливания тела метода Main( ), позволяющий пользователю самому решать, когда прервать выполнение метода.

На Рис. 5.1-15 показаны результаты работы консольного проекта.

Рис. 5.1-15. Результаты работы консольного проекта

Анализируя эти результаты можно видеть, что два метода на всех исследуемых аргументах дают одинаковые результаты, совпадающие с точностью до 9 цифр после запятой. Точность методов в классе MyMath обеспечивается константой EPS этого класса. Достигнутая точность вполне достаточна для большинства практических задач. Остается понять, насколько написанные нами методы проигрывают методу стандартного класса по времени.

Консолью называется окно операционной системы, в котором пользователи взаимодействуют с операционной системой или текстовым консольным приложением путем набора текстового ввода с клавиатуры и чтения текстового вывода с экрана компьютера. Например, в Windows консоль называется окном командной строки и принимает команды MS-DOS. Класс Console предоставляет базовую поддержку приложениям, считывающим символы с консоли и записывающим их на консоль.

Когда консольное приложение начинает работу, операционная система автоматически связывает с консолью три потока ввода-вывода. Приложение может считывать пользовательский ввод из стандартного входного потока, записывать обычные данные в стандартный выходной поток и записывать данные об ошибках в стандартный поток сообщений об ошибках. Эти потоки представлены в приложении значениями свойств In, Out и Error.

По умолчанию значением свойства In является объект System.IO..::.TextReader, а значениями свойств Out и Error - объекты System.IO..::.TextWriter.

Члены класса Console, работающие нормально, когда базовый поток направлен на консоль, могут выбрасывать исключение, если поток перенаправлен, например, в файл. Поэтому в приложениях следует перехватывать исключение System.IO..::.IOException, если стандартный поток перенаправлен.

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

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

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

Началом координат сетки символьных ячеек в буфере экрана является его верхний левый угол, и позиция курсора в окне консоли измеряется относительно этого начала координат. Для указания позиции используются индексы, отсчитываемые от нуля, то есть самая верхняя строка, и крайний слева столбец имеют индекс 0. Максимальное значение индексов строки и столбца определяется значением свойства Int16..::.MaxValue.

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

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

Public Shared Sub Main()

Console.Write("Hola ")

Console.WriteLine("Mundo!")

Console.WriteLine("What is your name: ")

Dim name As String = Console.ReadLine()

Console.Write("Buenos Dias, ")

Console.Write(name)

Console.WriteLine("!")

End Sub 'Main

  1. Создание Windows проекта

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

Создадим простой пользовательский интерфейс (рис. 5.1-16) и программный код класса Form1(рис. 5.1-17).

Рис. 5.1-16. Пользовательский интерфейс формы класса Form1

Option Explicit On

Option Strict On

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button1.Click

Dim x As Double

Dim temp As String

temp = TextBox1.Text

x = Val(temp)

'Вычисления и вывод результата

Dim res As Double = 0

res = Math.Sin(x)

TextBox2.Text = Convert.ToString(res)

res = ClassLibraryМаth.ClassLibraryМаth.Sin(x)

TextBox3.Text = Convert.ToString(res)

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button2.Click

End

End Sub

End Class

Рис. 5.1-17. Программный код класса Form1

При создании консольного проекта автоматически создавался класс, содержащий метод Main( )с пустым кодом метода. ВWindowsпроекте автоматически создается класс с именемForm1. Этот класс является наследником классаFormиз библиотекиFCLи наследует все свойства и поведение (методы и события) родительского класса. КлассFormподдерживает организациюинтерфейса пользователяв визуальном стиле. Форма является контейнером для размещения визуальных элементов управления – кнопок (Button), текстовых полей (TextBox), списков (ListBox) и более экзотичных элементов – таблиц (DataGridView), деревьев (TreeView) и многих других элементов. С некоторыми элементами управления мы уже знакомы.

Классы в VBсинтаксически не являются неделимыми, а могут состоять из нескольких частей, каждая из которых начинается с ключевого словаPartial (частичный). Таковым является и построенный автоматически классForm1. Возможность разбиения описания одного класса на части облегчает работу над большим классом. Каждая часть класса хранится в отдельном файле со своим именем. Одна часть классаForm1хранится в файле с именемForm1.Designer.vb. Эта часть класса заполняется автоматически инструментарием, называемымДизайнером формы. Когда мы занимаемся визуальным проектированием формы и размещаем на ней различные элементы управления, меняем их свойства, придаем форме нужный вид, задаем обработчиков событий для элементов управления, тоДизайнер формытранслирует наши действия в действия над объектами соответствующих классов, создает соответствующий код и вставляет его в нужное место классаForm1. Предполагается, что разработчик проекта не вмешивается в работу Дизайнера и не корректирует часть классаForm1, созданную Дизайнером. Тем не менее, понимать код, созданный Дизайнером необходимо, а иногда полезно и корректировать его. Другая часть классаForm1, хранящаяся в файлеForm1.vb, предназначена для разработчика, – именно в ней располагаются автоматически создаваемые обработчики событий, происходящих с элементами управления, код которых создается самим разработчиком. Такая технология программирования, основанная на работе с формами, называетсявизуальной,событийно управляемой технологией.

При создании Windows-Приложений (Windows Application) и Консольных приложений (Console Application) программа (программный код проекта) на языке VB может состоять из программного кода, генерируемого средой разработки, и программного кода, написанного или дописанного программистом. Причем базовая структура программного кода проекта создается автоматически в тот момент, когда пользователь выбирает в окне Создание проекта (New Project) соответствующий шаблон. При выборе Windows-Приложения, базовая структура содержит модуль формы, а при выборе Console Application, базовая структура содержит стандартный модуль и метод Main( ) внутри модуля.

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

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

  • модуль формы;

  • стандартный модуль;

  • модуль класса.

В общем виде Приложения могут состоять из нескольких форм, нескольких стандартных модулей и нескольких модулей

Option Explicit on

Option Strict on

Imports System.Math

Imports System.IO

'импортирование компонент других библиотек классов

Module Module_1

'стандартный модуль 1

End Module

Module Module_n

'стандартный модуль n

End Module

Public Class Class1

'модуль класса 1

End Class

Public Class Class_k

'модуль класса k

End Class

Public Class Form1

'модуль формы 1

End Class

Public Class Form_m

'модуль формы m

End Class

Обратите внимание, что каждое приложение VB должно содержать точку входа. Этой точкой входа является процедура с именем Main( ). Платформа .NET Framework вызывает процедуру Main( ) при загрузке приложения. Main( ) содержит код, который будет выполняться в первую очередь. В процедуре Main( ) пользователь может определить, какая форма загружается первой при запуске программы, установить, работают ли в системе копии данного приложения, ввести набор переменных для приложения или открыть необходимую для приложения базу данных. Причем основную работу выполняет метод Run( ) – в процессе его вызова создается объект класса Form1 и открывается форма – визуальный образ объекта, с которой может работать конечный пользователь проекта. Если, как положено, форма спроектирована и заполнена элементами управления, то конечному пользователю остается вводить собственные данные в поля формы, нажимать на кнопки, вообще быть инициатором возникновения различных событий в мире объектов формы. В ответ на возникающие события начинают работать обработчики событий, что приводит к желаемым (или не желанным) изменениям мира объектов. Типичной ситуацией является проведение вычислений по данным, введенным пользователем и отображение результатов этих вычислений в полях формы, предназначенных для этих целей.

Файл, запускаемый самостоятельно с расширением *.exe, должен также содержать процедуру Main( ).В то время как, библиотека (например, с расширением *.dll) не может быть запущена самостоятельно и не требует процедуры Main( ). Рассмотрим требования к процедуре Main( ) для различных типов проектов.

  1. Консольные приложения выполняются самостоятельно, в них необходимо указать, по крайней мере, одну процедуру Main( ), которая создается автоматически и заполняется программным кодом пользователем.

Проще всего объявить процедуру Sub.

Module mainModule

Sub Main()

End Sub

End Module

В VB стартовым объектом всегда является процедура Main( ). Имя этой процедуры должно быть указано на вкладке Приложение (Application) диалогового окна My Project (рис. 5.1-18). Диалоговое окноMy Project появляется на экране, если дважды щелкнуть по его имени в окнеОбозреватель решений (Solution Explorer)

Рис. 5.1-18. Информация о стартовой процедуре

  1. Приложения Windows Forms выполняются самостоятельно. Для этого VB в таких приложениях создает процедуру Main( ) автоматически, и поэтому ее не требуется создавать. Дело в том, что в VB поддерживается концепция стартового объекта, автоматически создаваемого при запуске приложения. По умолчанию стартовым объектом всегда является исходный класс, производный от класса Form. Имя этого объекта указывается на вкладке Приложение (Application) диалогового окна My Project (рис. 5.1-19). Диалоговое окноMy Project появляется на экране, если дважды щелкнуть по его имени в окнеОбозреватель решений (Solution Explorer).

Рис. 5.1-19. Информация о стартовом объекте

  1. Библиотеки классов не требуют процедуры Main( ). Программа VB построена из стандартных блоков. Решение состоит из одного или нескольких проектов. Проект, в свою очередь, может содержать одну или несколько сборок. Каждая сборка компилируется из одного или нескольких исходных файлов. Исходный файл включает в себя определения и реализацию классов, структур, модулей и интерфейсов, и, в конечном счете, содержит весь код.

Сборки образуют базовую единицу развертывания и принимают форму исполняемого файла (*.exe) или файла библиотеки динамической компоновки (DLL); они являются стандартными блоками платформы .NET Framework. Среда CLR получает от них сведения, необходимые для реализации типов. Сборку можно представить как коллекцию типов и ресурсов, формирующих логическую единицу функциональности и собранных для совместной работы.

В VB используется содержимое сборок, и добавляются ссылки на них. Кроме того, каждая сборка содержит манифест сборки. Подобно содержанию манифест сборки содержит Идентификатор сборки (ее имя и версию); Таблицу файлов, в которой описаны все другие файлы, образующие сборку, например, любые другие сборки, с которыми связаны *.exe-файлы или библиотеки DLL, или даже точечные рисунки или текстовые файлы; Список ссылок на сборки, который представляет собой список всех внешних зависимостей – файлов библиотек DLL или других необходимых приложению файлов, которые могли быть созданы кем-либо еще.

Поскольку сборки содержат сведения о содержимом, отслеживании версий и зависимостях, то правильность работы приложений, создаваемых с помощью VB, не зависит от значений реестра. Сборки уменьшают конфликты библиотек DLL и делают приложение более надежным и простым для развертывания.

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

  1. Операторы Option.

  2. Операторы Imports.

  3. Операторы Namespace и элементы уровня пространства имен.

Размещение операторов в иной последовательности может вызвать ошибки компиляции.

Операторы Option и Importsбыли рассмотрены ранее.

Операторы пространства имен помогают организовывать и классифицировать элементы программирования для облегчения их группировки и доступа к ним. Оператор Namespace используется для классификации следующих операторов в определенном пространстве имен и объявляет имя пространства имен и вызывает исходный код ниже объявления для компиляции в пределах этого пространства имен:

Namespace { name | name.name }

[ componenttypes ]

End Namespace

Где name:

Обязательное уникальное имя пространства имен, которое должно быть допустимым идентификатором Visual Basic;

Componenttypes:

Дополнительный элемент пространства имен. В пространство имен могут входить структуры, интерфейсы, классы, модули, делегаты, другие пространства имен и прочие элементы;

End Namespace:

Завершает блок Namespace.

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

Можно использовать инструкцию Namespace только на уровне файла или пространства имен. Это означает, что контекст объявления внутри пространства имен должен быть исходным файлом или другим пространством имен и не может быть классом, структурой, модулем, интерфейсом или процедурой.

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

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