Интерфейс с пользователем
Решение задачи осуществляется с помощью формы, на которой имеется одно простое текстовое поле txtТребуется и массив текстовых полей txtПлан (рис. 8.3). В эти текстовые поля вводятся соответствующие исходные данные. Результаты расчетов выводятся в области надписей lblИтого (сумма плановых значений по дням недели) и lblОтклонение (текстовая информация о результатах сравнения величин «Требуется» и «Итого»), а соответствующее числовое значение – в текстовое поле txtОтклонение.
Рис. 8.3. Форма для решения задачи планирования
Поскольку на форме нет командных кнопок, то процесс вычисления и вывода результата запускается событиями в полях ввода исходных данных – выходом из текстового поля txtТребуется после ввода исходных данных (событие потеря фокуса – LostFоcus) и изменения в плановых данных по любому дню недели (событие – Change).
В последнем случае выбрано событие Change, поскольку в самом начале планирования, когда исходные данные по дням недели еще не введены (плановые значения считаются равными нулю) и по мере планирования они изменяются. Приложение реагирует на каждое изменение плановых показателей, выводя соответствующие значения их суммы и отклонения от требуемого значения.
Численное значение отклонения дает представление о том, какую величину показателя нужно еще распределить или наоборот – на какую уменьшить
Для большей выразительности предусматривается выводить качественную характеристику состояния процесса планирования (слова “Перевыполнение”, “Недовыполнение” и “Норма”) на соответствующем фоне (желтом, красном или зеленом).
Код программы
Для реализации задачи планирования в коде нужно предусмотреть обработку следующих двух событий:
1) потеря фокуса текстовым полем txtТребуется;
2) изменение любого значения в массиве текстовых полей txtПлан.
Причем обработка обоих событий производится одинаково в соответствии со схемой алгоритма, представленной на рис. 8.2. Поэтому для обработки первого события составляется процедура по схеме алгоритма, а тело второй процедуры состоит из вызова первой. Тексты соответствующих процедур представлены ниже.
Option Explicit
'Вычисление отклонения заданного плана на неделю
'от требуемого значения показателя
Private Sub txtТребуется_LostFocus()
Dim sngИтого As Single 'Сумма плана по дням
Dim sngТребуется As Single 'Требуемое значение
Dim i As Byte 'Номер дня недели
'Вычисление суммы плановых значений по дням недели
sngИтого = 0
For i = 1 To 7
sngИтого = sngИтого + CSng(txtПлан(i - 1))
Next i
'Вывод на форму
lblИтого = Format(sngИтого, "0.00")
'Подготовка к использованию в вычислениях
sngТребуется = CSng(txtТребуется)
'Вывод сообщения об отклонении
If sngИтого > sngТребуется Then
lblОтклонение = "Перевыполнение"
lblОтклонение.BackColor = vbYellow
ElseIf sngИтого < sngТребуется Then
lblОтклонение = "Недовыполнение"
lblОтклонение.BackColor = vbRed
Else
lblОтклонение.BackColor = vbGreen
lblОтклонение = "Норма"
End If
'Вычисление и вывод величины отклонения
txtОтклонение = Abs(sngИтого - CSng(txtТребуется))
End Sub
'Те же действия, что и в предыдущей процедуре,
'но при изменении планового значения в любой день
Private Sub txtПлан_Change(Index As Integer)
txtТребуется_LostFocus
End Sub
Реализация проекта
1. Запустить на выполнение VB для создания нового проекта.
2. Задать заголовок формы и ее имя.
3. Для ввода требуемого значения показателя создать текстовое поле txtТребуется и надпись к нему.
4. Для определения контейнера, в котором будут содержаться данные по дням недели, создать рамку fraEжедневный_план достаточных размеров, чтобы в ней поместился массив текстовых полей из семи элементов.
5. Для ввода плановых значений по дням недели создать внутри рамки текстовое поле txtПлан и надпись lblПн (для понедельника) к нему. Свойству Text для поля txtПлан задать значение ноль. Скопировать пару этих элементов в буфер, а затем вставить из буфера в рамку. При вставке подтвердить запрос VB о том, что создается массив элементов. Затем еще пять раз произвести вставки из буфера. Таким образом, в рамке будет содержаться семь текстовых полей с соответствующими надписями (заголовки надписей скорректировать в соответствии с днями недели).
7. Для вывода суммы плановых значений по дням недели (величина «Итого») создать ниже рамки пару надписей на одном уровне – свойству Caption левой задать значение Итого, а для правой установить значения следующих свойств:
Name: lblИтого,
Caption: пусто,
BorderStyle: 1.
8. Для вывода текстовой и числовой информации об отклонении суммы плановых значений от требуемой величины показателя под предыдущей парой надписей создать текстовое поле с надписью слева от него. Установить значения следующих свойств надписи:
Name: lblОтклонеие,
Caption: пусто.
Для текстового поля установить значения следующих свойств:
Name: txtОтклонение
Text: пусто.
8. Для создания процедуры обработки события ”Потеря фокуса текстовым полем txtТребуется” дважды щелкнуть на этом поле, в поле со списком <Procedure> выбрать событие LostFocus и ввести тело процедуры.
9. Для создания процедуры обработки события “Изменение значения в массиве текстовых полей txtПлан” дважды щелкнуть на любом текстовом поле массива элементов управления txtПлан и в заготовку процедуры скопировать имя предыдущей процедуры txtТребуется_LostFocus
10. Сохранить форму и проект в папке на диске D:.
Анализ проекта
Для вычисления суммы плановых значений по дням недели в коде используется оператор цикла со счетчиком, который изменяется от 1 до 7. Поскольку нумерация элементов массива текстовых полей txtПлан начинается не с единицы (как счетчик цикла), а с нуля, то в теле цикла при обращении к элементам массива индекс на единицу меньше, чем счетчик (txtПлан(i-1)).
В зависимости от результата сравнения итогового значения с требуемым текстовая информация выдается на фоне, который имеет соответствующий цвет. Цвет фона задается оператором присваивания свойству цвета фона нужной константы среды VB, например,
lblОтклонение.BackColor=vbYellow
При выводе численного значения величины отклонения не требуется указания знака (+, -), поэтому при его вычислении используется встроенная функция Abs, которая возвращает абсолютное значение аргумента.
Ссылка в процедуре txtПлан_Change на имя процедуры txtТребуется_LostFocus означает, что процедура txtПлан_Change будет выполнять те же действия, что и процедура txtТребуется_LostFocus.
В приложении принята стратегия немедленного реагирования на вводимые значения. В данном приложении можно было бы использовать и другую стратегию – производить расчеты только после окончания ввода данных по всем дням недели. В этом случае нужно было бы добавить на форму командную кнопку, щелчок на которой запускал бы процесс вычислений.
Дата добавления: 2020-10-14; просмотров: 319;