В уроке разрабатывается
приложение, позволяющее управлять размерами диалогового окна и вычислять текущий
объем вклада при равномерных выплатах и постоянной процентной ставке. Конструируя
данное приложение, вы узнаете, как:
Кроме того,
в этом уроке приведены примеры, показывающие, как можно управлять размерами
элементов управления, перемещать их программно и при помощи метода drag-and-drop
по поверхности диалогового окна.
В первый
свой рабочий день в банке молодой программист Нестор Щукин получил задание от
менеджера составить приложение, вычисляющее чистый текущий объем инвестиций
от вкладов банка. Допустим, что с помощью этого приложения необходимо найти
чистый текущий объем инвестиции 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
, которые соответствуют прибыли, входят в формулу со знаком плюс, а
те, которые соответствуют дополнительным инвестициям - со знаком минус.
Итак, мы
разобрались с тем, что должен подготовить Нестор Щукин. Осталось только узнать,
как он это сделал. Нестор Щукин был амбициозным молодым человеком и, что само
собой разумеется, решением своей первой задачи он хотел произвести наиболее
благоприятное впечатление на менеджера, в надежде доказать свою незаменимость
и необходимость, а может быть даже повышения зарплаты. На пользователей обычно
впечатляюще действуют всевозможные динамические штучки, которые можно производить
с диалоговым окном и элементами управления. Поэтому Нестор решил создать приложение
с диалоговым окном, изменяющим свой размер в зависимости от числа членов в формуле,
вычисляющей чистый текущий объем инвестиции.
Для решения
задачи нахождения чистого текущего объема инвестиций и управления размером диалогового
окна с помощью редактора пользовательских форм cоздадим диалоговое окно Чистый
текущий объем инвестиций (рис. У6.1). Отметим, что данное приложении предназначено
для расчета до шести финансовых операций (инвестиций и прибыли).
При инициализации
диалогового окна его отображение на экране имеет меньшую ширину (в нем только
поля ввода для двух выплат), хотя при его конструировании в него помещается
поля ввода для всех шести выплат. При помощи счетчика Число операций можно управлять
шириной диалогового окна так, чтобы было достаточно места для размещения в нем
того количества полей ввода данных, которое задается счетчиком (рис. У6.2).
Обсудим,
как приведенная ниже программа решает перечисленные задачи и что происходит
в программе.
Рис.
У6.1. Диалоговое окно Чистый текущий объем инвестиций
Рис. У6.2. Диалоговое окно
Чистый текущий объем инвестиций со значением счетчика
Число операций
равным 4
|
|
||
Нажатие кнопки
вычислить запускает на выполнение процедуры CoramandButtonl_Click |
|
||
Нажатие кнопки
отмена запускает на выполнение процедуру 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
Перемещение
элемента управления при помощи операции drag-and-drop
Рассмотрим
диалоговое окно новые похождения колобка (рис. У6.5), с которым связана ниже
приведенная программа, дающая два простых примера программирования операций
drag-and-drop.
Рис.
У6.5. Диалоговое окно Новые похождения Колобка
'
' Определение
переменной уровня модуля
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
Разработать
приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:
Рис. У6.6. Диалоговое окно Сумма квадратов
Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.
Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").
Максимально, на что может претендовать "мысленный эксперимент" - это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.
Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.
Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.