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

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

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

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

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

Рис. У6.2. Диалоговое окно

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

Число операций равным 4

       
  UserForm_Initialize
  1. Активизирует диалоговое окно.
  1. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> — вычислить.
  1. Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна.
 
  Нажатие кнопки вычислить запускает на выполнение процедуры CoramandButtonl_Click
  1. Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 5. Проверяет корректность ввода данных. 6. Вычисляет чистый текущий объем инвестиций.
 
  Нажатие кнопки отмена запускает на выполнение процедуру 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. Диалоговое окно Новые похождения Колобка

  1. Если расположить указатель мыши на Колобке и нажать правую кнопку становится печальным Если далее перемещать указатель мыши при нажатой правой кнопке по поверхности диалогового окна, то колобок будет передвигаться вслед за указателем мыши. Настроение колобка запрограммировано в процедурах веселыйКолобок и печальныйколобок. Изменение настроения колобка при нажатии и отпускании правой клавиши мыши запрограммировано в процедурах Image1_MouseDown и Image1_MouseUp, а перемещение — в Imagel_MouseMove.
  2. Если расположить указатель мыши на надписи колобок и переместить указатель мыши при нажатой правой кнопке в область второй надписи, обведенной рамкой, а там уже отпустить правую клавишу мыши, то во вторую надпись будет скопирован текст колобок. Процедура 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: