0

I am working on a GUI with several TabPages. There are within each TabPage several buttons that should 'do' s.th.

So I defined the $..OnClick={..} which in this example write s.th. - but it doesn't work. Please what's wrong?

Here is a full example that shows the button Check 1 in a dialog, but the button isn't working at all:

function guibutton ($window,$todo,[string]$name="Butty",[string]$text="Butty",
                    [int]$x=300,[int]$y=200,[int]$w=75,[int]$h=23) {
  $Button = New-Object System.Windows.Forms.Button
  $Button.Location = New-Object System.Drawing.Size($x,$y)
  $Button.Size = New-Object System.Drawing.Size($w,$h)
  $Button.Name = $name
  $Button.Text = $text
  $Button.Add_Click( { $todo } )
  $window.Controls.Add($Button)
}


#Generated Form Function
function GenerateForm {

  #region Import the Assemblies
  [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
  [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null

  #region Generated Form Objects
  $MainMenu = New-Object System.Windows.Forms.Form
  $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState

  #Buttons
  $TestTabA = New-Object System.Windows.Forms.Button
  $EXIT = New-Object System.Windows.Forms.Button
  $TabControl = New-Object System.Windows.Forms.TabControl

  #Misc Items
  $ProgressBar = New-Object System.Windows.Forms.ProgressBar
  $StatusBar = New-Object System.Windows.Forms.StatusBar

  #Tabs
  $TabControl = New-object System.Windows.Forms.TabControl
  $TabTestA = New-Object System.Windows.Forms.TabPage

  #----------------------------------------------
  #Generated Event Script Blocks
  #----------------------------------------------
  #Provide Custom Code for events specified in PrimalForms.
  #Unknown
  $handler_MainMenu_Load =
  $OnLoadForm_StateCorrection= { $MainMenu.WindowState = $InitialFormWindowState }

  #Buttons
  $TestTabA_OnClick = { $TabControl.SelectTab($TabTestA) }
  $EXIT_OnClick={
     Write-Host "Bye-Bye"
     $MainMenu.close()
  }

  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 474
  $System_Drawing_Size.Width = 665

  $MainMenu.Font = New-Object System.Drawing.Font("Mistral",8.25,0,3,0) # Schriftart festlegen
  $MainMenu.ClientSize = $System_Drawing_Size
  $MainMenu.DataBindings.DefaultDataSourceUpdateMode = 0
  $MainMenu.Name = "MainMenu"
  $MainMenu.Text = "Test GUI"
  $MainMenu.TopMost = $True
  $MainMenu.add_Load($handler_form1_Load)

  # == FIX-Trade Button == #
  $TestTabA.Name = "TestTabA"
  $TestTabA.Text = "Test TabA"
  $TestTabA.TabIndex = 2
  $TestTabA.UseVisualStyleBackColor = $True
  $TestTabA.add_Click($TestTabA_OnClick)
  $TestTabA.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 12
  $System_Drawing_Point.Y = 69
  $TestTabA.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 35
  $System_Drawing_Size.Width = 100
  $TestTabA.Size = $System_Drawing_Size
  $MainMenu.Controls.Add($TestTabA)


  # == EXIT all Button == #
  $EXIT.Name = "EXIT"
  $EXIT.Text = "EXIT"
  $EXIT.TabIndex = 7
  $EXIT.UseVisualStyleBackColor = $True
  $EXIT.add_Click($EXIT_OnClick)
  $EXIT.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 12
  $System_Drawing_Point.Y = 274
  $EXIT.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 35
  $System_Drawing_Size.Width = 100
  $EXIT.Size = $System_Drawing_Size

  $MainMenu.Controls.Add($EXIT)

  # == Tab Control == #
  $TabControl.Name = "TabControl"
  $TabControl.TabIndex = 4
  $TabControl.SelectedIndex = 0
  $TabControl.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 118
  $System_Drawing_Point.Y = 70
  $TabControl.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 374
  $System_Drawing_Size.Width = 535
  $TabControl.Size = $System_Drawing_Size

  # Add the following to the TabControl property-setting section:

  $TabSizeMode = New-object System.Windows.Forms.TabSizeMode
  $TabSizeMode = "Fixed"
  $TabControl.SizeMode =$TabSizeMode
  $TabControl.ItemSize = New-Object System.Drawing.Size(0, 1)
  $TabAppearance = New-object System.Windows.Forms.TabAppearance
  $TabAppearance = "Buttons"
  $TabControl.Appearance = $TabAppearance
  $MainMenu.Controls.Add($TabControl)


  $Check1Button_OnClick  = { Write-Host "Check1-Click, mach was.. " }
  # == Trade Tab == #
  $TabTestA.DataBindings.DefaultDataSourceUpdateMode = 0
  $TabTestA.Name = "TestTabA"
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 4
  $System_Drawing_Point.Y = 22
  $TabTestA.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 205
  $System_Drawing_Size.Width = 445
  $TabTestA.Size = $System_Drawing_Size
  $TabTestA.TabIndex = 2
  $TabTestA.Text = "Tab2"
  $TabTestA.UseVisualStyleBackColor = $True

  #                         name     Txt        x   y    w  h
  guibutton $TabTestA $Check1Button_OnClick "Check1"   "Check 1"    10  20  75 23
  $TabControl.Controls.Add($TabTestA)

  # == Progress Bar == #
  $progressBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 589
  $System_Drawing_Point.Y = 458
  $progressBar.Location = $System_Drawing_Point
  $progressBar.Name = "progressBar"
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 15
  $System_Drawing_Size.Width = 75
  $progressBar.Size = $System_Drawing_Size
  $progressBar.TabIndex = 0

  $MainMenu.Controls.Add($progressBar)

  # == Status bar == #
  $StatusBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 0
  $System_Drawing_Point.Y = 456
  $StatusBar.Location = $System_Drawing_Point
  $StatusBar.Name = "StatusBar"
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 18
  $System_Drawing_Size.Width = 665
  $StatusBar.Size = $System_Drawing_Size
  $StatusBar.TabIndex = 1
  $StatusBar.Text = "statusBar - Text..."
  $StatusBar.add_PanelClick($statusBar_PanelClick)

  $MainMenu.Controls.Add($StatusBar)

  #To show that the tabs are switching correctly, you could add:
  $TabTestA.BackColor = "White"

  # == Save and Open Form == #
  $InitialFormWindowState = $MainMenu.WindowState
  $MainMenu.add_Load($OnLoadForm_StateCorrection)
  $MainMenu.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

If I start the GUI the dialog appears, but if I click on the button that should write-host ".." nothing happens :(

4
  • 1
    What is s.th.? Is this the absolute minimal example that demonstrates your problem? Commented Jun 23, 2014 at 14:53
  • More code would help... Commented Jun 23, 2014 at 15:18
  • Please here it is, this works, try to press the Check 1 button. I expect at console to be written "Check1-Click, mach was.." but nothing happens :( Commented Jun 23, 2014 at 15:36
  • @alroc Is that your way of saying tl;dr;? :-) Commented Jun 23, 2014 at 17:39

1 Answer 1

3

You are wrapping the passed in scriptblock in another scriptblock. Change this line:

$Button.Add_Click({$todo})

to

$Button.Add_Click($todo)

You also might want to specify the type of $todo as a scriptblock.

function guibutton($window,[scriptblock]$todo,[string]$name="Butty",[string]$text="Butty", ...

In the future, you should try to get the problem script down to the minimum possible script that duplicates the problem. I just happened to spot the problem at the top of your script.

Sign up to request clarification or add additional context in comments.

1 Comment

qKeith Hill: Thank you very much. In the beginning I gave less code but two others said to provide more code, so I created a working script..But thanks a lot!!, Gooly

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.