Урок 6

 

Тема: Управление размером и перемещением элементов управления

 

Цель урока

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

 

 Управлять размерами диалогового окна

 Задавать последовательности элементов управления в виде массива o6ъектов

 Определять текущий объем вклада

 Задавать параметры счетчика

 

Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно при помощи метода drag-and-chop по поверхности диалогового окна.

 

Теория

 

В первый свой рабочий день в банке молодой программист Нестор Щуки получил задание от менеджера составить приложение, вычисляющее чистый текущий объем инвестиций от вкладов банка. Допустим, что с помощью этого приложения необходимо найти чистый текущий объем инвестиций 10 000 руб при 7% годовой ставке, при которой банк получает годовые доходы 2 000 руб , 4 000 руб и 7 000 руб в последующие три года после вложения денег в инвестиционный проект.

 

Прежде чем описывать, с какими мыслями взялся за выполнение своего первого задания Нестор Щукин, поговорим немного о том, что же такое чистый текущий объем инвестиции. Предположим, что банк осуществляет некоторый инвестиционный проект, который через k1 год приносит прибыль или требует дополнительных капиталовложений в объеме Pk1 денег, через k2 года приносит прибыль или требует дополнительных капиталовложений в объеме Pk2 денег и т. д., через kn лет приносит прибыль или требует дополнительных капиталовложений в объеме Pkn денег. Тогда чистый текущий объем инвестиции при i% годовой ставке равен:

 

Pk1/(1+i)k1+...+Pkn/(1+i)kn,

 

где Pkn , которые соответствуют прибыли, входят в формулу со знаком плюс,

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

 

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

 

Практика

 

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

 

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

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

 

 

Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций

 

 

UserForm Initialize

1. Активизирует диалоговое окно.

2. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> — Вычислить.

 

 

3. Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна. ;

Нажатие кнопки Вычислить запускает на выполнение процедуры

CornmandButton1Click

4. Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции.

5. Проверяет корректность ввода данных.

6. Вычисляет чистый текущий объем инвестиций.

Нажатие кнопки Отмена запускает на выполнение процедуру

CommandButton2 Click

Закрывает диалоговое окно. |

SpinButton1 Change

Изменяет при помощи счетчика размер диалогового окна благодаря управлению свойством Width в зависимости от введенного числа операций.

 

Dim n As Integer

 

' n - число операций

 

Private Sub CommandButton1_Click()

 

' Процедура расчета чистого текущего объема инвестиций

 

Dim Операции(1 To 6) As Double

Dim Годы(1 To 6) As Byte

Dim Процент As Double

Dim i As Integer

Dim ТекущийОбъем As Double

 

' Операции - массив инвестиций и прибылей

' Годы  - массив лет, когда совершались операции

' Процент - годовая процентная ставка

' Текущий Объем - объем чистого начального вклада

' i - вспомогательная переменная

 

Dim ПолеВвода(1 To 6, 1 To 2) As Object

 

' Вспомогательный массив объектов, который будет

' использоваться при вводе данных из полей ввода

 

' Задание компонент массива объектов

 

Set ПолеВвода(1, 1) = TextBox1

Set ПолеВвода(2, 1) = TextBox2

Set ПолеВвода(3, 1) = TextBox3

Set ПолеВвода(4, 1) = TextBox4

Set ПолеВвода(5, 1) = TextBox5

Set ПолеВвода(6, 1) = TextBox6

Set ПолеВвода(1, 2) = TextBox7

Set ПолеВвода(2, 2) = TextBox8

Set ПолеВвода(3, 2) = TextBox9

Set ПолеВвода(4, 2) = TextBox10

Set ПолеВвода(5, 2) = TextBox11

Set ПолеВвода(6, 2) = TextBox12

 

' Проверка того, являются ли введенные в диалоговом окне значения числами

 

For i = 1 To n

If IsNumeric(ПолеВвода(i, 1).Text) = False Then

MsgBox "Ошибка в размере прибыли или инвестиции", _

vblnformation, "Расчет инвестиции"

ПолеВвода(i, 1).SetFocus

Exit Sub

 End If

Next i

For i = 1 To n

If IsNumeric(ПолеВвода(i, 2).Text) = False Then

MsgBox "Ошибка в годе", vbInformation, "Расчет инвестиции"

ПолеВвода(i, 2).SetFocus

Exit Sub

 End If

Next i

If IsNumeric(TextBox14.Text) = False Then

MsgBox "Ошибка в процентной ставке", vbInformation, _

"Расчет инвестиции"

TextBox14.SetFocus

Exit Sub

End If

 

' Ввод в массивы Операции и Годы данных из диалогового окна

 

For i = 1 To n

Операции(i) = CDbl(ПолеВвода(i, 1).Text)

Годы(i) = CByte(ПолеВвода(i, 2).Text)

Next i

 

'  Ввод процентной ставки

Процент = CDbl(TextBox14.Text) / 100

 

' Расчет чистого текущего объема инвестиции

 

ТекущийОбъем = 0

For i = 1 To n

ТекущийОбъем = ТекущийОбъем + Операции(i) / (1 + Процент) ^ Годы(i)

Next i

 

' Вывод в диалоговом окне величины чистого текущего объема инвестиций

 

ТекущийОбъем = Format(ТекущийОбъем, "Fixed")

TextBox15.Text = CStr(ТекущийОбъем)

End Sub

 

 

Private Sub CommandButton2_Click()

UserForm1.Hide

End Sub

 

Private Sub SpinButton1_Change()

 

' Процедура изменения размера диалогового окна

' в зависимости от введенного числа операций

 

' Вывод числа операций со счетчика в поле ввода

 

TextBox13.Text = CStr(SpinButton1.Value)

 

' Присвоение значения переменной n (числа операций) из поля ввода

 

n = CInt(TextBox13.Text)

 

' Изменение размера диалогового окна

 

UserForm1.Width = 120 + (n - 1) * 50

 

End Sub

 

Private Sub UserForm_Initialize()

 

' Процедура активизации диалогового окна Чистый текущий объем инвестиций

 

 

' Устанавливается первоначальное значение счетчика

 

SpinButton1.Value = 2

 

' Запрет не программного ввода данных в поля Процентная ставка

' и Чистый текущий объем инвестиций

 

TextBox13.Enabled = False

TextBox15.Enabled = False

 

' Назначение клавише <Enter> функции кнопки Вычислить

 

CommandButton1.Default = True

 

' Назначение функции клавиши <Еsс> кнопке Отмена

 

CommandButton2.Cancel = True

 

' Установка максимального и минимального

' допустимого значений счетчика, а также текста всплывающей подсказки

 

With SpinButton1

.Max = 6

.Min = 1

.ControlTipText = "Ввод числа операций"

End With

End Sub

 

 

Пример управления размером и перемещением элемента управления

 

Рассмотрим простой пример диалогового окна Похождения колобка (рис. У6.3), в котором при нажатии на кнопку Катись! Колобок перемещается по поверхности формы, а при нажатии на кнопку расти! он начинает увеличиваться в размерах. На рис. У6.4 показан вид Колобка после нескольких нажатий на кнопки катись! и расти!. Приведенная ниже программа позволяет реализовать описанные выше действия Колобка.

 

 

Перемещение элемента управления при помощи операции drag-and-drop

 

Рассмотрим диалоговое окно новые похождения колобка  с которым связана ниже приведенная программа, дающая два простых примера программирования операций drag-and-drop.

 

 

 

1. Если расположить указатель мыши на Колобке и нажать правую кнопку мыши, то веселый Колобок становится печальным. Если далее перемещать указатель мыши при нажатой правой кнопке по поверхности диалогового окна, то колобок будет передвигаться вслед за указателем мыши. Настроение колобка запрограммировано в процедурах Веселый Колобок и Печальный Колобок. Изменение настроения колобка при нажатии и отпускании правой клавиши мыши запрограммировано в процедурах Image1_MouseDown И Image1_MouseUp, а перемещение в Image1 MouseMove.

2 Если расположить указатель мыши на надписи Колобок и переместить указатель мыши при нажатой правой кнопке в область второй надписи, обведенной рамкой, а там уже отпустить правую клавишу мыши, то во вторую надпись будет скопирован текст Колобок. Процедура Label 1_MouseMove копирует заголовок первой надписи в объект DataObject, играющий роль буфера обмена, процедура Label2_BeforeDragOver контролирует операции diag-and-dlop во время перемещения указателя мыши, a Label2_BeforeDropOrPaste в момент отпускания правой кнопки мыши

 

Dim KoлoбoкDataObject  As DataObject

 

Private Sub CommandButton1_Click()

 

' Передвижение Колобка по поверхности формы

 

If Image1.Top > 0 And Image1.Left > 0 Then

Image1.Move Image1.Left - 5, Image1.Top - 6

Else

Image1.Visible = False

End If

End Sub

 

Private Sub CommandButton2_Click()

' Изменение размера Колобка

Image1.Height = Image1.Height + 3

Image1.Width = Image1.Width + 3

End Sub

 

Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

'Проверка какая клавиша нажата

If Button = 1 Then

КвадратныйКолобок

End If

End Sub

 

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

'движение колобка за курсором

If Button = 1 Then

If X ^ 2 + Y ^ 2 = 0 Then

A = 0

В = 0

Else

A = X / Sqr(X ^ 2 + Y ^ 2)

В = Y / Sqr(X ^ 2 + Y ^ 2)

End If

With Image1

.Top = Image1.Top + В

.Left = Image1.Left + A

 End With

End If

End Sub

 

Private Sub Image1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

КруглыйКолобок

End If

End Sub

 

Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

Set KoлoбoкDataObject = New DataObject

Dim ТипПеремещения As Integer

KoлoбoкDataObject.SetText UserForm2.Label1.Caption

ТипПеремещения = KoлoбoкDataObject.StartDrag

End If

End Sub

 

Private Sub Label2_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As Long, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)

Cance1 = True

'Effect = fmDropEffectCopy

Label2.Caption = KoлoбoкDataObject.GetText

 

End Sub

 

 

Private Sub UserForm_Initialize()

 

' Инициализация диалогового окна Похождения Колобка

 

With Image1

 

' Изображение колобка хранится в файле Dot.bmp

 

.Picture = LoadPicture("C:\Мои документы\Пр_Об\Уроки\КвКол.bmp")

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.BorderStyle = fmBorderStyleNone

.Visible = True

End With

' Установка рамок меткам

Label1.BorderStyle = fmBorderStyleSingle

Label2.BorderStyle = fmBorderStyleSingle

 

КруглыйКолобок

End Sub

 

Sub КвадратныйКолобок()

Image1.Picture = LoadPicture("C:\Мои документы\Пр_Об\Уроки\КвКол.bmp")

End Sub

 

Sub КруглыйКолобок()

Image1.Picture = LoadPicture("C:\Мои документы\Пр_Об\Уроки\КругКол.bmp")

End Sub

 

 

 

Самостоятельное задание

 

Разработать приложение с диалоговым окном Сумма квадратов  которое позволит:

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

2. Вычислять сумму квадратов элементов, введенных в поля ввода данных.