Борьба с циклом до тех пор, пока он не совмещен с Get-Random и щелчком мыши в форме PowerShell

Я борюсь с циклом до тех пор, пока он не используется в сочетании со случайным выбором и щелчком мыши в форме PowerShell.

Я могу запустить случайный сборщик без формы, где у меня есть будние дни, выбранные случайным образом и один за другим, удаляются, пока Arraylist не станет пустым. Работает неплохо.

$Weekdays = 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'

[System.Collections.ArrayList]$arraylist = $Weekdays

Write-Host $arraylist -ForegroundColor Green
pause
do {
    $removetask = Get-Random $arraylist.ToArray()
    $arraylist.Remove($removetask)
    Write-Host $removetask
    Write-Host $arraylist -ForegroundColor Red
    pause
} until ($arraylist.Count -eq 0)

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

Без do {} until () Я дошел так далеко:

$TestForm = New-Object System.Windows.Forms.Form
$TestForm.Size = New-Object System.Drawing.Size (1200,800)
$TestForm.Text ='Random Test'
$TestForm.StartPosition = "CenterScreen"
$TestForm.AutoSize = $true
$TestForm.BringToFront()
$TestForm.BackgroundImageLayout = "Stretch"

[System.Collections.ArrayList]$Weekdays = 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'

$TestLabel = New-Object System.Windows.Forms.label
$TestLabel.Location = New-Object System.Drawing.Size '500,200'
$TestLabel.Size = New-Object System.Drawing.Size '600,60'
$TestLabel.Font = New-Object System.Drawing.Font ('Times New Roman','20',[System.Drawing.FontStyle]::Bold)
$TestLabel.BackColor = 'Transparent'
$TestLabel.ForeColor = "Blue"
$removetask = Get-Random $Weekdays.ToArray()
$TestLabel.Text = $removetask
$TestForm.Controls.Add($TestLabel)

$TestButton = New-Object System.Windows.Forms.Button
$TestButton.Location = New-Object System.Drawing.Size '500,600'
$TestButton.Size = New-Object System.Drawing.Size '200,75'
$TestButton.Font = New-Object System.Drawing.Font ('Arial','10',[System.Drawing.FontStyle]::Bold)
$TestButton.Text = 'Next Random'
$TestForm.Controls.Add($TestButton)

$TestButton.Add_Click()

$TestForm.ShowDialog()
$TestForm.Dispose()

Теперь у меня осталось несколько строк кода, я не могу включить таким образом, поэтому он работает следующим образом.

Откроется тестовая форма, и в ярлыке я вижу выбранный случайным образом один из дней недели. Нажатие кнопки "Далее" удалит выбранный день недели из массива и покажет следующий день недели случайным образом, и будет продолжаться до тех пор, пока список не станет пустым.

Недостающие части головоломки:

### The loop itself
do {} until ()

### code to find a Random value from $weekdays and write it into $removetask
$removetask = Get-Random $Weekdays.ToArray()

### code to remove the randomly chosen day and remove it from the arraylist
$Weekdays.Remove($removetask) 

#### check if array is empty
($weekdays.Count -eq 0)

Я играл с кодами и пробовал с Button.Add_Click() а также с ButtonClickEvent {} но либо цикл не работает, счетчик работает некорректно, либо я как-то испортил код таким образом, что он где-то застрял, и даже форма не отображается.

1 ответ

Следующая расширенная настройка вашего скрипта реализует своего рода цикл в форме.

Обратите внимание, что нет ключевых слов цикла (например, do, while, until) и даже нет if ключевые слова используются:

### Load Assemblies for creating form & controls ###
if ( -not ("System.Windows.Forms.Form" -as [type]) ) {
    Add-Type -AssemblyName System.Windows.Forms
}
if ( -not ("System.Drawing.Font" -as [type]) ) {
    Add-Type -AssemblyName System.Drawing
}

$TestForm = New-Object System.Windows.Forms.Form
$TestForm.Size = New-Object System.Drawing.Size (1200,800)
$TestForm.Text ='Random Test'
$TestForm.StartPosition = "CenterScreen"
$TestForm.AutoSize = $true
$TestForm.BringToFront()
$TestForm.BackgroundImageLayout = "Stretch"

$TestLabel = New-Object System.Windows.Forms.label
$TestLabel.Location = New-Object System.Drawing.Size '500,200'
$TestLabel.Size = New-Object System.Drawing.Size '600,60'
$TestLabel.Font = New-Object System.Drawing.Font ('Times New Roman','20',[System.Drawing.FontStyle]::Bold)
$TestLabel.BackColor = 'Transparent'
$TestLabel.ForeColor = "Blue"
$TestForm.Controls.Add($TestLabel)

$TestLabe2 = New-Object System.Windows.Forms.Label
$TestLabe2.Location = New-Object System.Drawing.Size '200,300'
$TestLabe2.Size = New-Object System.Drawing.Size '900,200'
$TestLabe2.Font = New-Object System.Drawing.Font ([System.Windows.Forms.Label]::DefaultFont.Name,'16',[System.Drawing.FontStyle]::Italic)
$TestLabe2.BackColor = 'Transparent'
$TestLabe2.ForeColor = [System.Drawing.Color]::MidnightBlue
$TestForm.Controls.Add($TestLabe2)

$TestButton = New-Object System.Windows.Forms.Button
$TestButton.Location = New-Object System.Drawing.Size '500,600'
$TestButton.Size = New-Object System.Drawing.Size '200,75'
$TestButton.Font = New-Object System.Drawing.Font ('Arial','10',[System.Drawing.FontStyle]::Bold)
$TestButton.Text = 'Next Random'
$TestForm.Controls.Add($TestButton)

$TestButtoX = New-Object System.Windows.Forms.Button
$TestButtoX.Location = New-Object System.Drawing.Size '200,600'
$TestButtoX.Size = New-Object System.Drawing.Size '200,75'
$TestButtoX.Font = New-Object System.Drawing.Font ('Arial','10',[System.Drawing.FontStyle]::Bold)
$TestButtoX.Text = 'Next Round'
$TestButtoX.Enabled = $false
$TestForm.Controls.Add($TestButtoX)

Function Swap-Buttons {
    $TestButton.Enabled =      [bool]$script:Weekdays.Count
    $TestButtoX.Enabled = -not [bool]$script:Weekdays.Count
}

Function RemoveWeekday {
    $script:removetask = Get-Random $script:Weekdays.ToArray()
    $script:Weekdays.Remove($script:removetask)
    $TestLabe2.Text = ('(remain {0})' -f $script:Weekdays.Count), ($script:Weekdays -join ', ') -join ':   '
    $TestLabel.Text = $script:removetask
    Swap-Buttons
}

Function DefineWeek {
    $script:Weekdays = [System.Collections.ArrayList]([System.Enum]::GetNames([System.DayOfWeek]))
    <#
    # debugging: try another array list (a larger one)
    $script:Weekdays = [System.Collections.ArrayList]([System.Drawing.Color] |
        Get-Member -MemberType Properties -Static -Force |
            Where-Object Name -match ".+blue"  |
            Select-Object -ExpandProperty Name
    )
    <##>
}

$TestButton.Add_Click({
    RemoveWeekday
})

$TestButtoX.Add_Click({
    DefineWeek
    $TestButtoX.Enabled = $false 
    $TestButton.Enabled = $true
    RemoveWeekday
})

$script:removetask = ''
DefineWeek
RemoveWeekday

$TestForm.ShowDialog()
$TestForm.Dispose()
Другие вопросы по тегам