Powershell передает функцию в качестве параметра

#powershell

#powershell

Вопрос:

Я новичок в мире программирования, и я пытаюсь создать форму, используя функции для создания кнопок, меток и т. Д. Форма создается с тем исключением, что функции, переданные в события нажатия кнопки, передаются неправильно. Например, у меня есть функция для создания кнопки….

 function new_btn ($name, $parent, $x, $y, $l, $h, $text, $onClick){
    $object = New-Object System.Windows.Forms.Button
    $object.Location = New-Object System.Drawing.Point($x, $y)
    $Object.Size = New-Object System.Drawing.Size($l, $h)
    $Object.Text = $text
    $object.add_Click({$onClick})
    New-Variable $name -Value $object -Scope global
    (Get-Variable $parent).Value.Controls.Add((Get-Variable $name).value)
}
  

Затем у меня есть функция, которую я хочу запустить при нажатии кнопки…..

 function msg {
    [System.Windows.Forms.MessageBox]::Show("We are proceeding with next step.") 

}
  

Затем я вызываю функцию и передаю ей параметры…….

new_btn getdbslist tab1 20 50 69 23 «Получить сообщение базы данных»

Это создает кнопку, как и ожидалось, и добавляет ее в tab1, но событие on click не будет работать, вообще ничего не происходит. Любая помощь была бы очень признательна!

Ответ №1:

Вы просто передаете строку. Вместо этого передайте блок сценария:

 new_btn getdbslist tab1 20 50 69 23 'Get DBs' {
  [System.Windows.Forms.MessageBox]::Show("We are proceeding with next step.") 
}
  

И в вашей new_btn функции вам, вероятно, просто нужно использовать

 $object.add_Click($onClick)
  

Если вы действительно хотите передать строку, то вам, вероятно, нужно использовать следующее:

 $object.add_Click({ amp; $onClick })
  

Комментарии:

1. Примечание: ваше именование функций здесь вызывает сомнения. New-Button было бы гораздо более значимым именем, хотя затем оно должно возвращать новый экземпляр, а не просто добавлять что-то к другому объекту. Add-Button Вероятно, это было бы предпочтительнее. И как только вы пойдете по этому пути, вам, вероятно, следует также использовать имена параметров PascalCase и, возможно, использовать префикс для имени вашей функции, чтобы избежать столкновений с другими модулями.

2. Большое тебе спасибо, Джоуи, очень ценю такой быстрый ответ и подсказки по улучшению кода.