ООП на VB примерах

Автор: | 05.02.2018

Введение
Первая программа на Visual Basic
Приложение со стандартными диалоговыми окнами
Приложение «Графический редактор»
Приложение с классом разработчика
Пример приложения с коллекцией объектов

Введение

Основная задача этой темы – научиться читать VB программы. Что под этим подразумевается? Знать точку входа в программу, последовательность ее выполнения, уметь читать программу, соблюдая терминологию программиста.

Терминов в VB не так уж и много – переменная, функция, объект, класс, метод, свойство, коллекция, вызывается, объявляется, присваивается, описывается, создается. Но из них нужно уметь правильно составлять предложения. При этом можно излагать суть программного кода в произвольной интерпретации, но, не выходя при этом за рамки потери смысла. Чтобы не было так. Преподаватель задает студенту вопрос: “ Как работает холодильник?”. Студент отвечает: “Уууууу…”.

Ну, а теперь по порядку. Что такое программирование? Это описание данных и действий над ними. В процедурном или функциональном программировании данные – это переменные; действия – процедуры, функции, операции.

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

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

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

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

Методология ООП наиболее полно отражает реальную действительность. С помощью нее моделируются сущности, которые находят выражение в словаре нашего языка.  Некоторые слова могут одновременно определять обобщение (класс) и конкретику (объект). Например, словом «Преподаватель» можно характеризовать как множество людей, так и конкретного человека. В этой теме приведен VB код, где сущность «Преподаватель»  формализуется как класс и объект.

Аналогом класса и объекта в традиционном программировании есть, соответственно – типы и переменные. Что между ними общего? С помощью типа (класса) можно создавать множество переменных (объектов). Над переменными (объектами) можно выполнять только определенные действия (операции и методы), которые прописаны в API программной системы (классе).

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

Первая программа на Visual Basic

Начните новый проект в Visual Studio. В окне New Project выберите прототип VB проекта Windows Forms Application.

Создадим  программу, которая при нажатии на кнопку выдавала сообщение – «Привет».

Программирование в VB делится на 2 этапа – визуального программирования и создания исходного кода.

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

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

Справа (сверху) находится окно проводника, в нем указывается список файлов, используемых в проекте. Справа (внизу) находится окно свойств, если вы ничего не меняли, то это должны быть свойства текущей формы. У каждого элемента свои свойства, основные из них: name – имя элемента (используется в коде программы) и text – надпись на элементе.

Перенесите на форму элементы (TextBox и две кнопки Button) и измените свойства Text всех элементов, включая форму (см. рисунок). Cвойства name (Form1, TextBox1, Command1 и Command2), а также другие оставьте без изменений. Теперь ваша форма должна выглядеть так:

Выполните DoubleCliсk на кнопке «Привет», теперь на месте формы перед вами должно появиться окно кода с подготовленным шаблоном подпрограммы, обрабатывающей событие Click:

Добавьте в окне код:

Переключитесь обратно на форму (щелкните мышкой в окне проводника на Form1.vb[Dezign] ) и вставьте код для кнопки «Выход».

Запустите программу клавишей F5. Нажмите на кнопку «Привет», в текстовом окне появится сообщение привет.  Нажмите на кнопку «Выход», программа закончит свое выполнение.

Переходя на терминологию программиста опишем работу программы. При вызове процедуры обработки события Button1_Click свойству Text элемента (объекта) TextBox1 присваивается значение «Привет». При вызове процедуры обработки события Button2_Click вызывается функция Close().

Обратите внимание, что имя процедуры обработки событий состоит из 2-х частей,  разделенных знаком подчеркивания (_) – свойство name элемента и наименования события. Свойство name элемента есть ключ (идентификатор) для обеспечения взаимосвязи между данными и действиями. С подобным мы встречались при написании программы на языках VLISP и DCL, где данные были отделены от функций. Данные (свойства элементов) и действия (процедуры обработки событий, обычные процедуры, функции) на VB также описываются в отдельных файлах. В отличии от языка DCL на VB описание свойств элементов формируется в файле автоматически – на этапе визуального программирования.

Модифицируйте программу, чтобы текст воспринимался как пароль. Поставьте для элемента TextBox1 свойство PasswordChar равным звездочке (*).

Основная часть программного кода относится к кнопке «Вход»:

If TextBox1.Text = "Ваш пароль" Then MsgBox("Правильный пароль") Else MsgBox("Неправильный пароль")

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

Проверьте себя: « Если свойство Text объекта TextBox1 равно значению «Ваш пароль», то вызывается функция  MsgBox со значением параметра «Правильный пароль», иначе…»

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

Приложение со стандартными диалоговыми окнами

Существует несколько разновидностей диалоговых окон: нестандартные, встроенные и стандартные. Первые создаются разработчиками, встроенные вызываются функциями InputBox или Msgbox и стандартные окна вызываются методами элементов управления ColorDialog, FontDialog и др.

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

Создайте форму и перенесите на нее две кнопки (Button) и метку (Label). Затем перенесите элементы ColorDialog и FontDialog в любое место формы, они отобразятся в нижней части экрана (при запуске программы эти элементы не будут отображаться).

Установите свойства элементов управления в соответствии с таблицей:

Скопируйте листинг программного кода и протестируйте программу.

Public Class frmDialog

Private Sub cmdColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdColor.Click
With dlgColor
On Error GoTo ErrorLabel
.ShowDialog()
lblExample.BackColor = .Color
End With
ErrorLabel:
Exit Sub
End Sub

Private Sub cmdFont_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFont.Click
With dlgFont
On Error GoTo ErrorLabel
.ShowDialog()
lblExample.Font = .Font
lblExample.ForeColor = .Color
End With
ErrorLabel:
Exit Sub
End Sub

End Class

Ознакомьтесь с описанием программы.

Оператор With …..End With используется для того, чтобы не повторять имя элемента управления при определении его свойств или методов. Для перехвата ошибки используется оператор On Error GoTo, который обычно располагается перед вызовом метода, выполнение которого может привести к ошибке. Этот оператор переправляет действие к установленной в коде метке (ErrorLabel)

Стандартное диалоговое окно вызывается методом ShowDialog элемента dlgColor (dlgFont). Свойство Color (Font) элемента lblExample инициализируется при интерактивном его выборе в диалоговом окне.

Контрольный вопрос. Соблюдая терминологию прочитайте фрагменты VB кода:

dlgColor.ShowDialog()
lblExample.BackColor = dlgColor.Color

Приложение «Графический редактор»

Создадим простейший графический редактор, позволяющий рисовать (стирать) линии с помощью нажатия левой (правой) кнопки мыши.

Единственным элементом приложения есть сама форма. Установите основные свойства формы в соответствии с таблицей:

Скопируйте листинг программного кода в описание класса frmPaint:

Dim IsDraw As Boolean = False
Dim XO, YO, X, Y, XPre, YPre As Integer
Dim MyG As Graphics = CreateGraphics()
Dim Pen1 As Pen = New Pen(Color.Black, 1)
Dim Pen2 As Pen = New Pen(BackColor, 40)
Dim CurrentPen As Pen

Private Sub frmPaint_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
IsDraw = True
If e.Button = Windows.Forms.MouseButtons.Left Then
CurrentPen = Pen1
End If
If e.Button = Windows.Forms.MouseButtons.Right Then
CurrentPen = Pen2
End If
End Sub

Private Sub frmPaint_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If IsDraw Then
XPre = X
YPre = Y
X = e.X
Y = e.Y
MyG.DrawLine(CurrentPen, XPre, YPre, X, Y)
Else
X = e.X
Y = e.Y
End If
End Sub

Private Sub frmPaint_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
IsDraw = False
End Sub

Вначале объявляются переменные (объекты) и создаются объекты. Объекты создаются через вызов функции, которая возвращает ссылку на объект. Ссылка сохраняется в переменной.  При создании объектов может использоваться оператор New в сочетании с функцией, имя которой совпадает с именем класса. Такая функция называется конструктор. Ее основная задача – инициализировать через значения параметров свойства объекта.

В приложении обрабатываются следующие события:

  • MouseDown – нажата любая кнопка;
  • MouseUp – отпущена любая нажатая кнопка;
  • MouseMove – указатель мыши переместился.

Событие MouseMove вызывается циклично,  пока двигается курсор.  В событии MouseDown и MouseUp булева переменная IsDraw меняет значение и этим отключает (включает) режим рисования. Рисование выполняется с помощью метода DrawLine объекта MyG.

В каждую из процедур обработки событий передаются параметры, которые используются для получения а иногда для установки соответствующей информации внутри обработчика события. Так, в процедуре события MouseMove такими параметром есть объект e, свойства которого определяют текущее положение курсора (e.X, e.Y).

В событие MouseDown передается объект e, в свойстве которого (e.Button) сохраняется свойство-константа нажатой клавиши. Обратите внимание на глубину иерархии обращения к этой константе. При обращении к какому-либо свойству или методу указывается вся цепочка вхождений представителей объектов одних классов в описание других классов (см. Агрегация). Такая цепочка вхождений отражает фрагмент организации, так называемой объектной модели программной системы.

Для рисования и стирания используются объекты-карандаши (Pen1 и Pen2), разные по цвету и толщине линий. Стирание реализуется карандашом цвета фона – свойство BackColor объекта frmPaint. Обратите внимание, что около этого свойства имя объекта не указано, поскольку к свойству обращаются в пределах описания класса frmPaint.

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

  • В каком случае переменную можно назвать параметром, объектом или свойством?
  • Соблюдая терминологию прочитайте фрагменты VB кода:
Dim XO, YO, X, Y, XPre, YPre As Integer
Dim MyG As Graphics = CreateGraphics()
Dim Pen1 As Pen = New Pen(Color.Black, 1)
...
If e.Button = Windows.Forms.MouseButtons.Left Then CurrentPen = Pen1...
MyG.DrawLine(CurrentPen, XPre, YPre, X, Y)

Приложение с классом разработчика

В приложениях, которые описаны выше, объекты (элементы) создавались из стандартных классов, которые предоставила программная система. Ниже рассматривается приложение, в котором создаются объекты из класса, описанного непосредственно в этой же программе.

Из реального мира выделяем сущность «Преподаватель кафедры», которую формализуем в класс, наделенный определенными свойствами, методами и реакциями на события. Из класса в программе создаются объекты – конкретные преподаватели кафедры.

В приложении создается анкета на преподавателя кафедры Свирневского Николая, которая подписывается еще одним преподавателем – зав. кафедры Сергеем Кривым.

Создайте форму и разместите на ней элементы управления как показано на рисунке:

Определите для элементов свойства Text и свойства Name в соответствии с программным кодом, который приведен ниже. Скопируйте листинг программного кода в окно модуля формы.

 

Листинг программного кода модуля формы

Public Class Form1

Dim WithEvents MyObject As clsEmployee
'Dim MyObject As New clsEmployee
Dim MyBoss As New clsEmployee
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyObject = New clsEmployee
End Sub

Private Sub cmdEnter_Click_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEnter.Click
txtFirstName.Text = "Николай"
txtLastName.Text = "Свирневский"
txtSalary.Text = "1350"
txtDateHired.Text = #9/14/1987#
txtDptmnt.Text = "Итп"
End Sub

Private Sub cmdSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSave.Click
'Сохранения значений в свойствах объекта
With MyObject
.FirstName = txtFirstName.Text
.LastName = txtLastName.Text
.Salary = txtSalary.Text
.DateHired = CDate(txtDateHired.Text)
.Department = txtDptmnt.Text
End With
End Sub

Private Sub cmdTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdTest.Click
'Считывание свойства Department
txtDptmnt.Text = MyObject.Department
End Sub

Private Sub cmdSalary_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalary.Click
txtSalary.Text = MyObject.CalcRaise
End Sub

Private Sub cmdBoss_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBoss.Click
With MyBoss
.FirstName = "Сергей"
.LastName = "Кривой"
End With
'Определение значения свойства-объекта
MyObject.Supervisor = MyBoss
lblBoss.Text = MyBoss.FirstName & " " & MyObject.Supervisor.LastName
End Sub

Private Sub MyObject_DataError(ByVal sMessageText As String) Handles MyObject.DataError
MsgBox(sMessageText, vbCritical, "Ошибка!!!")
End Sub

End Class

Теперь выберите команду меню Project > Add Class. Укажите имя модуля класса clsEmployee, и для него откроется окно кода. Скопируйте листинг программного кода в окно модуля класса.

Листинг программного кода модуля класса

Public Class clsEmployee

Public FirstName As String
Public LastName As String
Public Salary As Decimal
Public DateHired As Date
Private nDeptNum As Integer
Private objSupervisor As clsEmployee
Public Event DataError(ByVal sMessageText As String)

Public Property Department() As String
Get
Select Case nDeptNum
Case 1
Return "Итп"
Case 2
Return "Графики"
Case Else
MsgBox("Введите правильное имя кафедры и сохраните данные")
Return Nothing
End Select
End Get
Set(ByVal value As String)
Select Case Trim(UCase(value))
Case "ИТП"
nDeptNum = 1
Case "ГРАФИКИ"
nDeptNum = 2
Case Else
nDeptNum = 0
End Select
End Set
End Property

Public Property Supervisor() As clsEmployee
Get
Supervisor = objSupervisor
End Get
Set(ByVal objBoss As clsEmployee)
objSupervisor = objBoss
End Set
End Property

Public Function CalcRaise() As Decimal
Dim sgPercentRaise As Single
If Me.Salary = 0 Then RaiseEvent DataError("HE УКАЗАНА ЗАРПЛАТА!!")
Select Case DateDiff("yyyy", Me.DateHired, Now)
Case Is > 1
sgPercentRaise = 0.06
Case Is <= 1
sgPercentRaise = 0.02
End Select
CalcRaise = Me.Salary * sgPercentRaise + Me.Salary
End Function

End Class

Приложение использует два объекта (MyObject и MyBoss) класса clsEmployee. Этот класс наделяет свои объекты свойствами: FirstName (имя служащего), LastName (фамилия), DateHired (дата поступления на работу), Salary (зарплата), Department (кафедра) и Supervisor (свойство-объект, характеризующее начальника).

Кроме этого, объект обладает методом CalcRaise, который позволяет вычислить надбавку к зарплате за стаж, и реагирует на событие DataError (возникает в случае если не определено свойство Salary при вычислении надбавки к зарплате).

Особенности программной реализации.

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

Простейший путь создания свойств – применение глобальных переменных. Просто поместите их в раздел объявлений модуля класса. В класс clsEmployee добавлено несколько обычных свойств с помощью следующего программного кода:

Public FirstName As String
Public LastName As String
Public Salary As Currency
Public DateHired As Date

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

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

Для создания методов в нужно добавить в модуль класса глобальные процедуры или функции. Глобальные процедуры работают так же, как обычные подпрограммы и функции, но ключевое слово Public означает, что они должны быть доступны пользователям объекта. Например, в класс служащих добавлена функция CalcRaise, которая оценивает промежуток времени с момента найма сотрудника (дата приема на работу хранится в свойстве DateHired) для того, чтобы назначить служащему 2- или 6-процентную надбавку.

Чтобы создать событие в классе, необходимо:

  1. Объявите событие в классе.
  2. В нужном месте инициализировать событие с помощью оператора RaiseEvent.

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

Public Event DataError (ByVal sMessageText As String)

Затем добавьте код, инициирующий событие. Вспомните написанный ранее метод CalcRaise, который использует свойство объекта Salary. Если значение свойства Salary (зарплата) еще не задано, то вычислять надбавку к зарплате бессмысленно. Поэтому модифицируйте метод CalcRaise, чтобы отправлять пользователю сообщение об ошибке через событие DataError. Для этого достаточно добавить один оператор If:

If Me. Salary = 0 Then RaiseEvent DataError ( "HE УКАЗАНА ЗАРПЛАТА!!")

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

Dim WithEvents objBoss As clsEmployee
Private Sub objBoss_DataError (ByVal sMessageText As String)
MsgBox sMessageText, vbCritical, "Ошибка!!!"
End Sub

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

  • Как создать пользовательский класс в VB приложении?
  • Как можно создать свойства (методы) в классе?
  • Чем отличается процедура свойств от процедуры-метода?
  • Чем отличается переменная (функция) от свойства (метода)?
  • Как создать событие в классе?
  • Чем вызов событийной функции отличается от вызова обычной функции?

Пример приложения с коллекцией объектов

Коллекция – это как раз то, что подразумевает название: набор объектов. Только не путайте понятия «набор» и «множество». Последнее больше соответствует термину «Класс».

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

Коллекция – это набор объектов, объединенных под одним именем, каждый из которых может иметь свой определенный тип. Visual Basic содержит встроенные коллекции объектов, например, такие как Forms или Controls. Чтобы выполнить действия над всеми элементами коллекций, следует воспользоваться конструкцией For Each. . .Next. В массивах доступ к элементам реализуется через указание индексов.

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

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

Усовершенствуем предыдущее программное приложение, добавив кнопку, обеспечивающую очистку текстовых полей:

Листинг программного кода (для добавления):

' Создаем новую коллекцию для всех текстовых полей формы
Dim colTextBoxes As New Collection

Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
'Переменная, используемая в цикле For Each
'для временного хранения указателя на элемент управления
Dim cntrlItem As Control
' Цикл по всем элементам управления формы
For Each cntrlItem In Me.Controls
'Если элемент управления - текстовое поле, добавляем его в коллекцию
If TypeName(cntrlItem) = "TextBox" Then
colTextBoxes.Add(cntrlItem)
End If
Next cntrlItem
End Sub

Private Sub cmdClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClear.Click
'Переменная, используемая в цикле For Each
'для временного хранения указателя на элемент управления
Dim cntrlItem As Control
' Очищаем каждое текстовое поле коллекции
For Each cntrlItem In colTextBoxes
cntrlItem.Text = ""
Next cntrlItem
End Sub

Описание свойств и методов объекта Collection:

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

  • Коллекция — это класс, объект или набор объектов?
  • Чем коллекция отличается от массива?

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *