Вопрос или проблема
Привет, ребята.
Я пытаюсь создать калькулятор. На данный момент у меня готов графический интерфейс. Но мне нужна помощь с фоновыми функциями. Пример: я нажимаю на кнопки 5+6. Теперь, когда я нажимаю “=”, ввод из текстового поля должен быть помещен в переменную и затем вычислен. У кого-нибудь есть идея, как это сделать. (Я совсем новичок в Powershell).
Спасибо и извините за мой плохой английский.
Привет,
Сандро
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#Платформа
$Taschenrechner = New-Object System.Windows.Forms.Form
$Taschenrechner.StartPosition = "CenterScreen"
$Taschenrechner.Size = New-Object System.Drawing.Size(470,400)
$Taschenrechner.Text = "Taschenrechner"
#Заголовок
$Titel = New-Object System.Windows.Forms.Label
$Titel.Location = New-Object System.Drawing.Size(70,10)
$Titel.Size = New-Object System.Drawing.Size(360,50)
$Font = New-Object System.Drawing.Font("Arial",30,[System.Drawing.FontStyle]::Regular)
$Titel.Font = $Font
$Titel.Text = "Taschenrechner"
$Titel.Name = "Taschenrechner"
$Taschenrechner.Controls.Add($Titel)
#Текстовое поле
$Textfeld= New-Object System.Windows.Forms.TextBox
$Textfeld.Location = New-Object System.Drawing.Size(25,100)
$Textfeld.Size = New-Object System.Drawing.Size(100,100)
$Textfeld.Width = (400)
$Taschenrechner.Controls.Add($Textfeld)
#1
$button1 = New-Object System.Windows.Forms.Button
$button1.Location = New-Object System.Drawing.Size(25,120)
$button1.Size = New-Object System.Drawing.Size(100,50)
$button1.Add_Click({$Textfeld.Text+='1'})
$button1.Text = "1"
$button1.Name = "1"
$Taschenrechner.Controls.Add($button1)
#2
$button2 = New-Object System.Windows.Forms.Button
$button2.Location = New-Object System.Drawing.Size(125,120)
$button2.Size = New-Object System.Drawing.Size(100,50)
$button2.Add_Click({$Textfeld.Text+='2'})
$button2.Text = "2"
$button2.Name = "2"
$Taschenrechner.Controls.Add($button2)
#3
$button3 = New-Object System.Windows.Forms.Button
$button3.Location = New-Object System.Drawing.Size(225,120)
$button3.Size = New-Object System.Drawing.Size(100,50)
$button3.Add_Click({$Textfeld.Text+='3'})
$button3.Text = "3"
$button3.Name = "3"
$Taschenrechner.Controls.Add($button3)
#4
$button4 = New-Object System.Windows.Forms.Button
$button4.Location = New-Object System.Drawing.Size(25,170)
$button4.Size = New-Object System.Drawing.Size(100,50)
$button4.Add_Click({$Textfeld.Text+='4'})
$button4.Text = "4"
$button4.Name = "4"
$Taschenrechner.Controls.Add($button4)
#5
$button5 = New-Object System.Windows.Forms.Button
$button5.Location = New-Object System.Drawing.Size(125,170)
$button5.Size = New-Object System.Drawing.Size(100,50)
$button5.Add_Click({$Textfeld.Text+='5'})
$button5.Text = "5"
$button5.Name = "5"
$Taschenrechner.Controls.Add($button5)
#6
$button6 = New-Object System.Windows.Forms.Button
$button6.Location = New-Object System.Drawing.Size(225,170)
$button6.Size = New-Object System.Drawing.Size(100,50)
$button6.Add_Click({$Textfeld.Text+='6'})
$button6.Text = "6"
$button6.Name = "6"
$Taschenrechner.Controls.Add($button6)
#7
$button7 = New-Object System.Windows.Forms.Button
$button7.Location = New-Object System.Drawing.Size(25,220)
$button7.Size = New-Object System.Drawing.Size(100,50)
$button7.Add_Click({$Textfeld.Text+='7'})
$button7.Text = "7"
$button7.Name = "7"
$Taschenrechner.Controls.Add($button7)
#8
$button8 = New-Object System.Windows.Forms.Button
$button8.Location = New-Object System.Drawing.Size(125,220)
$button8.Size = New-Object System.Drawing.Size(100,50)
$button8.Add_Click({$Textfeld.Text+='8'})
$button8.Text = "8"
$button8.Name = "8"
$Taschenrechner.Controls.Add($button8)
#9
$button9 = New-Object System.Windows.Forms.Button
$button9.Location = New-Object System.Drawing.Size(225,220)
$button9.Size = New-Object System.Drawing.Size(100,50)
$button9.Add_Click({$Textfeld.Text+='9'})
$button9.Text = "9"
$button9.Name = "9"
$Taschenrechner.Controls.Add($button9)
#0
$button0 = New-Object System.Windows.Forms.Button
$button0.Location = New-Object System.Drawing.Size(25,270)
$button0.Size = New-Object System.Drawing.Size(100,50)
$button0.Add_Click({$Textfeld.Text+='0'})
$button0.Text = "0"
$button0.Name = "0"
$Taschenrechner.Controls.Add($button0)
#Десятичная точка
$Punkt = New-Object System.Windows.Forms.Button
$Punkt.Location = New-Object System.Drawing.Size(125,270)
$Punkt.Size = New-Object System.Drawing.Size(100,50)
$Punkt.Add_Click({$Textfeld.Text+='.'})
$Punkt.Text = "."
$Punkt.Name = "."
$Taschenrechner.Controls.Add($Punkt)
#Равно
$gleich = New-Object System.Windows.Forms.Button
$gleich.Location = New-Object System.Drawing.Size(225,270)
$gleich.Size = New-Object System.Drawing.Size(100,50)
$gleich.Text = "="
$gleich.Name = "="
$Taschenrechner.Controls.Add($gleich)
#Делить
$durch = New-Object System.Windows.Forms.Button
$durch.Location = New-Object System.Drawing.Size(325,120)
$durch.Size = New-Object System.Drawing.Size(100,50)
$durch.Text = "https://superuser.com/"
$durch.Name = "https://superuser.com/"
$Taschenrechner.Controls.Add($durch)
#Умножить
$mal = New-Object System.Windows.Forms.Button
$mal.Location = New-Object System.Drawing.Size(325,170)
$mal.Size = New-Object System.Drawing.Size(100,50)
$mal.Text = "x"
$mal.Name = "x"
$Taschenrechner.Controls.Add($mal)
#Минус
$minus = New-Object System.Windows.Forms.Button
$minus.Location = New-Object System.Drawing.Size(325,220)
$minus.Size = New-Object System.Drawing.Size(100,50)
$minus.Text = "-"
$minus.Name = "-"
$Taschenrechner.Controls.Add($minus)
#Плюс
$plus = New-Object System.Windows.Forms.Button
$plus.Location = New-Object System.Drawing.Size(325,270)
$plus.Size = New-Object System.Drawing.Size(100,50)
$plus.Text = "+"
$plus.Name = "+"
$Taschenrechner.Controls.Add($plus)
[void] $Taschenrechner.ShowDialog()
Следующее улучшение моего предыдущего ответа на ваш почти такой же вопрос может помочь, однако такая мозаика приведет вас к погибели (как и меня). Удачи!
Remove-Variable script:Part* -ErrorAction SilentlyContinue
$script:PartialResult=""
$script:PartOperation = ''
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#Платформа
### код без изменений здесь (около 110 строк)
#Десятичная точка
$Punkt = New-Object System.Windows.Forms.Button
$Punkt.Location = New-Object System.Drawing.Size(225,270)
$Punkt.Size = New-Object System.Drawing.Size(100,50)
$Punkt.Add_Click({$Textfeld.Text+='.'})
$Punkt.Text = "."
$Punkt.Name = "."
$Taschenrechner.Controls.Add($Punkt)
#Равно
$gleich = New-Object System.Windows.Forms.Button
$gleich.Location = New-Object System.Drawing.Size(325,270)
$gleich.Size = New-Object System.Drawing.Size(100,50)
$gleich.Text = "="
$gleich.Name = "="
$Taschenrechner.Controls.Add($gleich)
#Делить
$durch = New-Object System.Windows.Forms.Button
$durch.Location = New-Object System.Drawing.Size(425,120)
$durch.Size = New-Object System.Drawing.Size(100,50)
$durch.Text = "https://superuser.com/"
$durch.Name = "https://superuser.com/"
$Taschenrechner.Controls.Add($durch)
#Умножить
$mal = New-Object System.Windows.Forms.Button
$mal.Location = New-Object System.Drawing.Size(425,170)
$mal.Size = New-Object System.Drawing.Size(100,50)
$mal.Text = "×"
$mal.Name = "*"
$Taschenrechner.Controls.Add($mal)
#Минус
$minus = New-Object System.Windows.Forms.Button
$minus.Location = New-Object System.Drawing.Size(425,220)
$minus.Size = New-Object System.Drawing.Size(100,50)
$minus.Text = "-"
$minus.Name = "-"
$Taschenrechner.Controls.Add($minus)
#Плюс
$plus = New-Object System.Windows.Forms.Button
$plus.Location = New-Object System.Drawing.Size(425,270)
$plus.Size = New-Object System.Drawing.Size(100,50)
$plus.Text = "+"
$plus.Name = "+"
$Taschenrechner.Controls.Add($plus)
Function Operation {
param([string] $Ope)
### вам нужно показать промежуточный результат и операцию!!!
if ( $Textfeld.Text -ne '' ) {
if ($script:PartialResult -ne '' ) {
$aux = [string] $script:PartialResult + $script:PartOperation + $script:Textfeld.Text
$script:PartialResult = [string] $( Invoke-Expression $aux )
} else {
$script:PartialResult = $Textfeld.Text
}
if ( $Ope -eq '=' ) {
$Textfeld.Text="" + [string] $script:PartialResult
$script:PartialResult=""
$script:PartOperation = ''
} else {
$Textfeld.Text=""
$script:PartOperation = $Ope
}
}
}
$gleich.Add_Click( { Operation '=' } )
$mal. Add_Click( { Operation '*' } ) # Имя = "×"
$plus. Add_Click( { Operation '+' } ) # Имя = "+"
$minus. Add_Click( { Operation '-' } ) # Имя = "-"
$durch. Add_Click( { Operation "https://superuser.com/" } ) # Имя = "https://superuser.com/"
[void] $Taschenrechner.ShowDialog()
Ответ или решение
Создание калькулятора с графическим интерфейсом на PowerShell является отличной задачей для изучения основ работы с PowerShell и графическими интерфейсами Windows Forms. Для данного проекта требуется как создание визуальных элементов интерфейса (формы, кнопок, текстовых полей), так и программирование логики обработки вводимых данных с последующим выполнением математических операций.
Теория
PowerShell является скриптовым языком, который позволяет администрировать системы Windows, а также создавать приложения с графическими интерфейсами с использованием библиотеки .NET, а именно пространства имен System.Windows.Forms
. Это позволяет программистам создавать окна и контролы графического интерфейса, такие как кнопки, текстовые поля и другие элементы управления.
В PowerShell можно создавать и управлять элементами графического интерфейса, загружая соответствующие библиотеки и работая с ними аналогично тому, как это делается в C#. Ключевыми элементами, используемыми в данном проекте, являются формы (Form
), текстовые поля (TextBox
), кнопки (Button
) и других элементы управления, которые требуется располагать на форме с указанием их свойств, таких как размер и расположение.
Пример
Пример включает в себя создание простого калькулятора с базовыми операциями: сложением, вычитанием, умножением и делением. Кроме того, здесь реализован ввод чисел и операций через кнопки и получение результата при нажатии на кнопку "=".
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# Создание формы
$CalculatorForm = New-Object System.Windows.Forms.Form
$CalculatorForm.StartPosition = "CenterScreen"
$CalculatorForm.Size = New-Object System.Drawing.Size(470, 400)
$CalculatorForm.Text = "Калькулятор"
# Добавление поля ввода
$InputBox = New-Object System.Windows.Forms.TextBox
$InputBox.Location = New-Object System.Drawing.Size(25, 20)
$InputBox.Size = New-Object System.Drawing.Size(400, 30)
$CalculatorForm.Controls.Add($InputBox)
# Функция выполнение операции
function PerformOperation {
if ($InputBox.Text -match '^\s*\-?\d+(\.\d+)?(\s*[\+\-\*\/]\s*\-?\d+(\.\d+)?)*\s*$') {
try {
$InputBox.Text = [string](Invoke-Expression $InputBox.Text)
} catch {
$InputBox.Text = "Ошибка расчета"
}
} else {
$InputBox.Text = "Ошибка ввода"
}
}
# Создание кнопок цифр и операций
@(
@{Text='1'; X=25; Y=60}; @{Text='2'; X=125; Y=60}; @{Text='3'; X=225; Y=60};
@{Text='4'; X=25; Y=110}; @{Text='5'; X=125; Y=110}; @{Text='6'; X=225; Y=110};
@{Text='7'; X=25; Y=160}; @{Text='8'; X=125; Y=160}; @{Text='9'; X=225; Y=160};
@{Text='0'; X=125; Y=210}; @{Text='+'; X=325; Y=60};
@{Text='-'; X=325; Y=110}; @{Text='*'; X=325; Y=160};
@{Text='/'; X=325; Y=210}; @{Text='='; X=325; Y=260}
) | ForEach-Object {
$button = New-Object System.Windows.Forms.Button
$button.Size = New-Object System.Drawing.Size(100, 50)
$button.Location = New-Object System.Drawing.Size($_.X, $_.Y)
$button.Text = $_.Text
$CalculatorForm.Controls.Add($button)
if ($_.Text -eq "=") {
$button.Add_Click({PerformOperation})
} else {
$button.Add_Click({$InputBox.Text += $_.Text})
}
}
[void] $CalculatorForm.ShowDialog()
Применение
Данный код создаёт оконное приложение с полем ввода и набором кнопок для операций и ввода чисел. Каждая кнопка при нажатии добавляет соответствующий символ в поле ввода. Когда пользователь нажимает "=", функция PerformOperation
проверяет введенную строку на корректность, используя регулярное выражение, и выполняет вес математические вычисления. Используется Invoke-Expression
, что позволяет интерпретировать введённую строку как математическое выражение. Если выражение корректно, оно вычисляется и замещает текст в поле ввода. В случае ошибки вычислений или некорректного ввода возвращается сообщение об ошибке.
Такой подход позволяет организовать простой и интуитивно понятный интерфейс калькулятора, поддерживающего базовые математические операции. Это решение также демонстрирует использование регулярных выражений для проверки корректности ввода и обработки ошибок, что важно для создания устойчивых к ошибкам приложений.
Эта реализация демонстрирует основные возможности PowerShell в части создания GUI приложений и может использоваться в качестве отправной точки для создания более сложных систем и добавления новых функций в ваш калькулятор.