Цель урока
В уроке разрабатывается приложение, позволяющее управлять размерами диалогового окна и вычислять текущий объем вклада при равномерных выплатах и постоянной процентной ставке. Конструируя данное приложение, вы узнаете, как:
Управлять размерами диалогового окна
Задавать последовательности элементов управления в виде массива объектов
Определять текущий объем вклада
Задавать параметры счетчика
Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода drag-and-drop по поверхности диалогового окна.
Перемещение элемента управления при помощи операции drag-and-drop
Рассмотрим диалоговое окно новые похождения колобка (рис. У6.5), с которым связана ниже приведенная программа, дающая два простых примера программирования операций drag-and-drop.
Рис. У6.5. Диалоговое окно Новые похождения Колобка
Если расположить указатель мыши на Колобке и нажать правую кнопку становится печальным Если далее перемещать указатель мыши при нажатой правой кнопке по поверхности диалогового окна, то колобок будет передвигаться вслед за указателем мыши. Настроение колобка запрограммировано в процедурах веселыйКолобок и печальныйколобок. Изменение настроения колобка при нажатии и отпускании правой клавиши мыши запрограммировано в процедурах Image1_MouseDown и Image1_MouseUp, а перемещение — в Imagel_MouseMove.
Если расположить указатель мыши на надписи колобок и переместить указатель мыши при нажатой правой кнопке в область второй надписи, обведенной рамкой, а там уже отпустить правую клавишу мыши, то во вторую надпись будет скопирован текст колобок. Процедура Labeli_MouseMove копирует заголовок первой надписи в объект Dataobject, играющий роль буфера обмена, процедура Label2_BeforeDragOver контролирует операции drag-and-drop во время перемещения указателя мыши, a Label2_BeforeDropOrPaste в момент отпускания правой кнопки мыши.
'
' Определение переменной уровня модуля
Dim Kono6oкDataObject As DataObject
'
Private Sub imagel_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 Imagel_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 Imagel_MouseMove(ByVal Button As Integer,
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 1 Then
IfX^2+Y^2 = 0 Then A = 0 В = 0
Else
A = X / Sqr(X л 2 + Y л 2) В = Y / SqrtX л 2 + Y л 2)
End if With Imagel
.Top = Imagel.Top + В
.Left = Imagel.Left + A
End With
End If
End Sub
'
Private Sub Labell_MouseMove(ByVal Button As Integer,
ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 1 Then
Set КoлoбoкDataObject = New DataObject
Dim ТипПеремещения As Integer
Kono6oKDataObject.SetText Labell.Caption
ТипПеремещения = Кoл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.ReturnEffeet,
ByVal Shift As Integer)
Cancel = True
Effect = fmDropEffectCopy
End Sub
Private Sub Label2_BeforeDropOrPaste(ByVal Cancel
As MSForms.ReturnBoolean,
ByVal Action As Long,
ByVal Data As MSForms.DataObject,
ByVal X As Single,
ByVal Y As Single,
ByVal Effect As MSForms.ReturnEffeet,
ByVal Shift As Integer)
Cancel = True
Effect = fmDropEffectCopy
Label2. Caption = KолoбoкDataObject .GetText
End Sub
Private Sub UserForm_Initialize()
'
Labell.BorderStyle = fmBorderStyleSingle
Label2.BorderStyle = fmBorderStyleSingle
With Imagel
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureSizeMode = fmPictureSizeModeZoom
.BorderStyle = fmBorderStyleNone End With
'ВеселыйКолобок
End Sub
Sub ВесельйКолобок()
Imagel.Picture = LoadPicture("Dot_a.bmp")
End Sub
'
Sub ПечальныйКолобок()
Image1.. Picture = LoadPicture ("Dotl_a.bmp"
) End Sub
Практика
Для решения задачи нахождения чистого текущего объема инвестиций и управления размером диалогового окна с помощью редактора пользовательских форм cоздадим диалоговое окно Чистый текущий объем инвестиций (рис. У6.1). Отметим, что данное приложении предназначено для расчета до шести финансовых операций (инвестиций и прибыли).
При инициализации диалогового окна его отображение на экране имеет меньшую ширину (в нем только поля ввода для двух выплат), хотя при его конструировании в него помещается поля ввода для всех шести выплат. При помощи счетчика Число операций можно управлять шириной диалогового окна так, чтобы было достаточно места для размещения в нем того количества полей ввода данных, которое задается счетчиком (рис. У6.2).
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций
Рис. У6.2. Диалоговое окно
Чистый текущий объем инвестиций со значением счетчика
Число операций равным 4
UserForm_Initialize |
Активизирует диалоговое окно. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> — вычислить. Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна. | ||||
Нажатие кнопки вычислить запускает на выполнение процедуры CoramandButtonl_Click |
Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 5. Проверяет корректность ввода данных. 6. Вычисляет чистый текущий объем инвестиций. | ||||
Нажатие кнопки отмена запускает на выполнение процедуру CoramandButton2_Click | Закрывает диалоговое окно. | ||||
SpinButtonl Change | Изменяет при помощи счетчика размер диалоге вого окна благодаря управлению свойством width в зависимости от введенного числа операций. | ||||
'
' Переменная уровня модуля
'
Dim n As Integer
'
' n - число операций
'
Private Sub CommandButtonl_Click()
'
' Процедура расчета чистого текущего объема инвестиций
'
Dim Операции(1 То 6) As Double
Dim Годы(1 То 6) As Byte
Dim Процент As Double
Dim i As Integer
Dim ТекущийОбъем As Double
' Операции - массив инвестиций и прибылей
' Годы - массив лет, когда совершались операции
' Процент - годовая процентная ставка
' ТекущийОбъем - объем чистого начального.вклада
' i - вспомогательная переменная
'
Dim ПолеВвода(1 То 6, 1 To 2) As Object
'
' Вспомогательный массив объектов, который будет
' использоваться при вводе данных из полей ввода
' Задание компонент массива объектов
'
Set ПолеВвода(1, 1) = TextBoxl
Set ПолеВвода (2, 1) = TextBox2
Set ПолеВвода(3, 1) = TextBox3
Set ПолеВвода(4, 1) = TextBox4
Set ПолеВвода(5, 1) = TextBox5
Set ПолеВвода(6, 1) = TextBox6
Set ПолеВвода(1, 2) = TextBoxl0
Set ПолеВвода(2, 2),= TextBoxl1
Set ПолеВвода(3, 2) '= TextBoxl2
Set ПолеВвода(4, 2) = TextBoxl3
Set ПолеВвода(5, 2) = TextBoxl4
Set ПолеВвода(6, 2) = TextBoxl5
'
' Проверка того, являются ли введенные в диалоговом окне значения числами
'
For i = 1 То n
If IsNumeric(ПолеВвода(i, 1).Text) = False Then
MsgBox "Ошибка в размере прибыли или инвестиции",
vblnformation, "Расчет инвестиции" ПолеВвода(i, l).SetFocus
Exit Sub
End If
Next i
For i = 1 To n
If IsNumeric(ПолеВвода(i, 2).Text) = False Then
MsgBox "Ошибка в годе", vblnformation, "Расчет инвестиции" ПолеВвода(i, 2).SetFocus Exit Sub End If Next i
If isNumeric(TextBoxS.Text) = False Then
MsgBox "Ошибка в процентной ставке", vblnformation,
"Расчет инвестиции" TextBoxS.SetFocus
Exit Sub
End If
' Ввод в массивы Операции и Годы данных из диалогового окна
'
For i = 1 То n
Операции(i) = CDbl(ПолеВвода(i, l).Text)
Годы(1) = CByte(ПолеВвода(i, 2).Text) Next i
'
' Ввод процентной ставки '
Процент = CDbl(TextBoxS.Text) / 100
' Расчет чистого текущего объема инвестиции
ТекущийОбъем = 0 For i = 1 То п
ТекущийОбъем = ТекущийОбъем + Операции(i) / (1 + Процент) ^ Годы(1)
Next i
' Вывод в диалоговом окне величины чистого текущего объема инвестиций
'
ТекущийОбъем = Format(ТекущийОбъем, "Fixed")
TextBox9.Text = CStr(ТекущийОбъем)
End Sub
Private Sub CommandButton2_Click()
'
' Процедура закрывает диалоговое окно
'
UserForml.Hide End Sub
'
Private Sub SpinButtonl_Change()
'
' Процедура изменения размера диалогового окна
' в зависимости от введенного числа операций
' Вывод числа операций со счетчика в поле ввода
'
TextBoxV.Text = CStr(SpinButtonl.Value)
'
' Присвоение значения переменной n (числа операций) из поля ввода
n = CInt(TextBox7.Text)
'
' Изменение размера диалогового окна
'
UserForml.Width = 120 + (n - 1) * 50
'
End Sub
'
Private Sub UserForm_Initialize()
'
' Процедура активизации диалогового окна Чистый текущий объем инвестиций
'
' Устанавливается первоначальное значение счетчика
SpinButtonl.Value = 2
' Запрет не программного ввода данных в поля Процентная ставка
' и Чистый текущий объем инвестиций
'
TextBox7.Enabled = False TextBox9.Enabled = False
' Назначение клавише <Enter> функции кнопки Вычислить
'
CommandButtonl.Default = True
' Назначение функции клавиши <Esc> кнопке Отмена
'
CommandButton2.Cancel = True
' Установка максимального и минимального
' допустимого значений счетчика, а также текста всплывающей подсказки
With SpinButton1
.Max = 6
.Min = 1
.ControlTipText = "Ввод числа операций"
End With
End Sub
Пример управления размером
и перемещением элемента управления
Рассмотрим простой пример диалогового окна похождения колобка (рис. У6.3), в котором при нажатии на кнопку катись! Колобок перемещается по поверхности формы, а при нажатии на кнопку Расти \ он начинает увеличиваться в размерах. На рис. У6.4 показан вид Колобка после нескольких нажатий на кнопки катись! и Расти!. Приведенная ниже программа позволяет реализовать описанные выше действия Колобка.
Рис. У6.3. Диалоговое окно Похождения Колобка
Рис. У6.4. Вид Колобка после нескольких движений
Private Sub CommandButtonl_Click()
'
' Передвижение Колобка по поверхности формы
'
If Imagel.Top > 0 And Imagel.Left > 0 Then
Imagel.Move Imagel.Left - 5, Imagel.Top - 6
Else
Imagel.Visible = False
End If
End Sub
'
Private Sub CommandButton2_Click()
'
' Изменение размера Колобка
'
Imagel.Height = Imagel.Height + 3 Imagel. Width = Imagel.Width + 3
End Sub
Private Sub UserForm_Initialize()
'
' Инициализация диалогового окна Похождения Колобка
'
With Imagel
'
' Изображение колобка хранится в файле Dot.bmp
.Picture = LoadPicture("Dot.bmp")
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureSizeMode = fmPictureSizeModeZoom
.BorderStyle = fmBorderStyleNone
.Visible = True End With End Sub
Самостоятельное задание
Разработать приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:
При помощи счетчиков управлять шириной и высотой диалогового окна.
Вычислять сумму квадратов элементов, введенных в поля ввода данных.
Рис. У6.6. Диалоговое окно Сумма квадратов
Теория
В первый свой рабочий день в банке молодой программист Нестор Щукин получил задание от менеджера составить приложение, вычисляющее чистый текущий объем инвестиций от вкладов банка. Допустим, что с помощью этого приложения необходимо найти чистый текущий объем инвестиции 10 000 руб. при 7% годовой ставке, при которой банк получает годовые доходы 2 000 руб., 4 000 руб. и 7 000 руб. в последующие три года после вложения денег в инвестиционный проект.
Прежде чем описывать, с какими мыслями тялся за выполнение своего первого задания Нестор Щукин, поговорим немного о том, что же такое чистый текущий объем инвестиции. Предположим, что банк осуществляет некоторый инвестиционный проект, который через k1 год приносит прибыль или требует дополнительных капиталовложений в объеме Pk1денег, через k-i года приносит прибыль или требует дополнительных капиталовложений в объеме Pk денег и т. д., через kn лет приносит прибыль или требует
дополнительных капиталовложений в объеме /V денег. Тогда чистый текущий объем инвестиции при i% годовой ставке равен:
Pk1/(1+i)k1 + ... + Pkn(d+i)kn,
где Рkn , которые соответствуют прибыли, входят в формулу со знаком плюс, а те, которые соответствуют дополнительным инвестициям - со знаком минус.
Итак, мы разобрались с тем, что должен подготовить Нестор Щукин. Осталось только узнать, как он это сделал. Нестор Щукин был амбициозным молодым человеком и, что само собой разумеется, решением своей первой задачи он хотел произвести наиболее благоприятное впечатление на менеджера, в надежде доказать свою незаменимость и необходимость, а может быть даже повышения зарплаты. На пользователей обычно впечатляюще действуют всевозможные динамические штучки, которые можно производить с диалоговым окном и элементами управления. Поэтому Нестор решил создать приложение с диалоговым окном, изменяющим свой размер в зависимости от числа членов в формуле, вычисляющей чистый текущий объем инвестиции.
УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
УРОК 6. ТЕМА: УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
ЦЕЛЬ УРОКА
ТЕОРИЯ
ПРАКТИКА
Пример управления размером и перемещением элемента управления
Перемещение элемента управления при помощи операции drag-and-drop
САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ
Урок 6
Тема: Управление размером и перемещением элементов управления