Тайны и секреты компьютера
Шрифт:
Переведем на язык VBA условие возможности отображения результата. Во-первых, все значения полей ввода должны быть числовыми. В VBA есть специальная функция для проверки того, является ли та или иная строка записью числа — IsNumeric (можно, например, найти ее описание в разделе «Поиск» справки по VBA из Microsoft Office 97 по словам "строковое выражение числовое значение", а в справке VBA из более старших версий этого пакета — по английским эквивалентам данных слов). Ее и используем. Ну, а для проверки отличия от нуля значений в последних двух полях ввода используем функцию «Val». Итак, результат существует, если
IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0
В
rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))
и отобразить его в поле вывода результата:
TextBox6.Text = Str$(rez)
Теперь можно написать процедуру вычисления результата и вызовы ее из всех обработчиков событий "Change":
Private Sub TextBox1_Change
Scet
End Sub
Private Sub TextBox2_Change
Scet
End Sub
Private Sub TextBox3_Change
Scet
End Sub
Private Sub TextBox4_Change
Scet
End Sub
Private Sub TextBox5_Change
Scet
End Sub
Private Sub Scet
If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then
rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))
TextBox6.Text = Str$(rez)
Else
TextBox6.Text = ""
End If
End Sub
В принципе программа уже почти закончена, но стоит еще разобраться с командными кнопками. Для кнопки «Отмена» обработчик события «Click» (то есть нажатия на кнопку) прост — выход из программы:
Private Sub CommandButton2_Click
Unload Me
End Sub
Но у нас есть еще вторая кнопка — "Вставить результат в документ". А пусть она вставит в документ не просто значение результата, а осмысленную фразу, содержащую как результат, так и введенные параметры! Это можно сделать командой
Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.»
Она сформирует фразу из значений полей ввода и вставит ее в активный документ. Проверим… так, действительно вставляет, но фраза остается выделенной. А значит, что следующая фраза, выведенная с помощью нашей программы, сотрет предыдущую. Надо посмотреть, нет ли в VBA функции снятия выделения? Посмотрим по выпадающему меню после точки "Selection."… есть команда «Collapse» (то есть "Свернуть"). Из справки по ней узнаем ее синтаксис:
Selection.Collapse Direction:=wdCollapseEnd.
Эта команда убирает выделение и помещает курсор в его конец.
Можно также вставить текст в активный документ "Selection.TypeText Text:="Мой текст" (двоеточие после слова «Text» обязательно, так как это — оператор присваивания значения параметру команды). Тогда в команде специального снятия выделения со вставленного текста не будет необходимости, — после выполнения команды выделенного текста не окажется.
Но что произойдет, если пользователь вдруг вызовет программу тогда, когда открытых документов в Word'е нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый:
If Documents.Count = 0 Then Documents.Add
Осталась еще одна маленькая деталь. Кнопка "Вставить результат в документ" не должна работать, если результат вычислить нельзя (то есть поле «TextBox6» пусто). Как это сделать?
Среди всего набора возможных свойств элемента «CommandButton» есть свойство «Enabled» — если его установить как «False» (то есть "ложно"), то кнопка будет отображаться серым цветом и не будет реагировать на события (станет неактивной). Это свойство можно задать и программно — командой "CommandButton1.Enabled = False".
Поставим в процедуру вычисления результата пару команд, активизирующих кнопку, когда результат вычисляется и вставка его в текст возможна, и инактивирующих ее в противном случае, а также зададим с самого начала в форме свойство «Enabled» этой кнопки как «False», — чтобы она была неактивной с самого начала, до того, как в какое-либо окно ввода будут вводиться символы и начнет срабатывать процедура вычисления результата с командами задания состояния кнопки.
Вот готовый код нашей программы:
Private Sub CommandButton1_Click
If Documents.Count = 0 Then Documents.Add
Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.»
Selection.Collapse Direction:=wdCollapseEnd
End Sub
Private Sub CommandButton2_Click
Unload Me
End Sub
Private Sub TextBox1_Change
Scet
End Sub
Private Sub TextBox2_Change
Scet
End Sub
Private Sub TextBox3_Change
Scet
End Sub
Private Sub TextBox4_Change
Scet
End Sub
Private Sub TextBox5_Change
Scet
End Sub
Private Sub Scet
If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then
rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))
TextBox6.Text = Str$(rez)
CommandButton1.Enabled = True
Else
TextBox6.Text = ""
CommandButton1.Enabled = False
End If
End Sub
(В формуле, используемой в программе, указывается напряжение между концами проводника, а не сила тока. Поэтому не удивляйтесь, что выделение тепла окажется максимальным при большой толщине проводника и его малой длине. Эта ситуация имеет место быть при коротком замыкании, когда в условиях постоянного напряжения через точку замыкания идет ток огромной силы.)
Назначить форме кнопку или пункт меню для вызова из Word нельзя, — это возможно только для модулей. Поэтому переименуем для красоты форму в «Teplotok», например (свойство «Name» обьекта «UserForm» — можно задать в окне свойств, выделив форму) и напишем модуль, в котором будет всего одна команда — вызов созданной нами формы: