Для решения задачи нахождения чистого текущего объема инвестиций и управления размером диалогового окна с помощью редактора пользовательских форм cоздадим диалоговое окно Чистый текущий объем инвестиций (рис. У6.1). Отметим, что данное приложении предназначено для расчета до шести финансовых операций (инвестиций и прибыли).
При инициализации диалогового окна его отображение на экране имеет меньшую ширину (в нем только поля ввода для двух выплат), хотя при его конструировании в него помещается поля ввода для всех шести выплат. При помощи счетчика Число операций можно управлять шириной диалогового окна так, чтобы было достаточно места для размещения в нем того количества полей ввода данных, которое задается счетчиком (рис. У6.2).
Обсудим, как приведенная ниже программа решает перечисленные задачи и что происходит в программе.
Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций
Рис. У6.2. Диалоговое окно
Чистый текущий объем инвестиций со значением счетчика
Число операций равным 4
|
|
UserForm_Initialize |
| ||
Нажатие кнопки вычислить запускает на выполнение процедуры CoramandButtonl_Click |
| ||
Нажатие кнопки отмена запускает на выполнение процедуру CoramandButton2_Click | Закрывает диалоговое окно. | ||
SpinButton1 Change | Изменяет при помощи счетчика размер диалоге вого окна благодаря управлению свойством width в зависимости от введенного числа операций. | ||
'
' Переменная уровня модуля
'
Dim n As Integer
'
' n - число операций
'
Private Sub CommandButton1_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) = TextBox1
Set ПолеВвода (2, 1) = TextBox2
Set ПолеВвода(3, 1) = TextBox3
Set ПолеВвода(4, 1) = TextBox4
|
|
Set ПолеВвода(5, 1) = TextBox5
Set ПолеВвода(6, 1) = TextBox6
Set ПолеВвода(1, 2) = TextBox10
Set ПолеВвода(2, 2),= TextBox11
Set ПолеВвода(3, 2) '= TextBox12
Set ПолеВвода(4, 2) = TextBox13
Set ПолеВвода(5, 2) = TextBox14
Set ПолеВвода(6, 2) = TextBox15
'
' Проверка того, являются ли введенные в диалоговом окне значения числами
'
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()
'
' Процедура закрывает диалоговое окно
'
UserForm1.Hide End Sub
'
Private Sub SpinButton1_Change()
'
' Процедура изменения размера диалогового окна
' в зависимости от введенного числа операций
' Вывод числа операций со счетчика в поле ввода
'
TextBoxV.Text = CStr(SpinButton1.Value)
'
' Присвоение значения переменной n (числа операций) из поля ввода
n = CInt(TextBox7.Text)
'
' Изменение размера диалогового окна
'
UserForm1.Width = 120 + (n - 1) * 50
'
End Sub
'
Private Sub UserForm_Initialize()
'
' Процедура активизации диалогового окна Чистый текущий объем инвестиций
'
' Устанавливается первоначальное значение счетчика
SpinButton1.Value = 2
' Запрет не программного ввода данных в поля Процентная ставка
' и Чистый текущий объем инвестиций
'
TextBox7.Enabled = False TextBox9.Enabled = False
' Назначение клавише <Enter> функции кнопки Вычислить
'
CommandButton1.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 CommandButton1_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
Перемещение элемента управления при помощи операции 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