к оглавлению   к 4GL - визуальному программированию

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

Цель урока

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

Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода 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


UserForm_Initialize

  1. Активизирует диалоговое окно.
  2. Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> — вычислить.
  3. Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна.

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

CoramandButtonl_Click

  1. Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 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

Перемещение элемента управления при помощи операции 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

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

Разработать приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:

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

Рис. У6.6. Диалоговое окно Сумма квадратов

к оглавлению   к 4GL - визуальному программированию

Знаете ли Вы, почему "черные дыры" - фикция?
Согласно релятивистской мифологии, "чёрная дыра - это область в пространстве-времени, гравитационное притяжение которой настолько велико, что покинуть её не могут даже объекты, движущиеся со скоростью света (в том числе и кванты самого света). Граница этой области называется горизонтом событий, а её характерный размер - гравитационным радиусом. В простейшем случае сферически симметричной чёрной дыры он равен радиусу Шварцшильда".
На самом деле миф о черных дырах есть порождение мифа о фотоне - пушечном ядре. Этот миф родился еще в античные времена. Математическое развитие он получил в трудах Исаака Ньютона в виде корпускулярной теории света. Корпускуле света приписывалась масса. Из этого следовало, что при высоких ускорениях свободного падения возможен поворот траектории луча света вспять, по параболе, как это происходит с пушечным ядром в гравитационном поле Земли.
Отсюда родились сказки о "радиусе Шварцшильда", "черных дырах Хокинга" и прочих безудержных фантазиях пропагандистов релятивизма.
Впрочем, эти сказки несколько древнее. В 1795 году математик Пьер Симон Лаплас писал:
"Если бы диаметр светящейся звезды с той же плотностью, что и Земля, в 250 раз превосходил бы диаметр Солнца, то вследствие притяжения звезды ни один из испущенных ею лучей не смог бы дойти до нас; следовательно, не исключено, что самые большие из светящихся тел по этой причине являются невидимыми." [цитата по Брагинский В.Б., Полнарёв А. Г. Удивительная гравитация. - М., Наука, 1985]
Однако, как выяснилось в 20-м веке, фотон не обладает массой и не может взаимодействовать с гравитационным полем как весомое вещество. Фотон - это квантованная электромагнитная волна, то есть даже не объект, а процесс. А процессы не могут иметь веса, так как они не являются вещественными объектами. Это всего-лишь движение некоторой среды. (сравните с аналогами: движение воды, движение воздуха, колебания почвы). Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution