Lukasb14 1 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 (bearbeitet) Hallo Leute, vielleicht kann mir hier jemand weiter helfen bzw. einen besseren Code vorschlagen. Vielen Dank im Voraus Ich habe/möchte eine Powershell GUI mit functions erstellen, jedoch weiß ich nicht wie ich Beispielsweise ein Label ein/ausblenden kann (Siehe letzten 15 Zeilen im Code) Hier mein derzeitiger Code: Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $Windowname = "Script" $xmax = "300" #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen $ymax = "450" #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen function Button{ param( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name, [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx, [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy, [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex, [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey, [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable, [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result, [AllowEmptyString()][ValidateSet($true, $false)]$AddClick, [AllowEmptyString()]$Click ) $ButtonName = "Button" + $Name $ButtonName = New-Object System.Windows.Forms.Button $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy) $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $ButtonName.Text = $Name $ButtonName.DialogResult = $Result if($AddClick -eq $true){ $ButtonName.add_click({ $Click }) } if($Visable -eq $true){$form.Controls.Add($ButtonName)} } function Label{ param( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name, [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx, [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy, [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex, [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey, [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable, [AllowEmptyString()] $Text ) $LabelName = "Label" + $Name $LabelName = New-Object System.Windows.Forms.Label $LabelName.Location = New-Object System.Drawing.Point($posx,$posy) $LabelName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $LabelName.Text = $Text if($Visable -eq $true){$form.Controls.Add($LabelName)} } function Box{ param( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name, [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx, [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy, [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex, [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey, [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable, [parameter(Mandatory=$true)][ValidateSet("List", "Text", "Search")]$Version, [AllowEmptyString()] $input, [AllowEmptyString()] $Text ) if($Version -eq "List"){ $ListBoxName = "ListBox" + $Name $ListBoxName = New-Object System.Windows.Forms.ListBox $ListBoxName.Location = New-Object System.Drawing.Point($posx,$posy) $ListBoxName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $ListBoxName.SelectionMode = 'MultiExtended' foreach ($i in $input){[void] $ListBoxName.Items.Add($i)} $listBox.Height = $Sizey $form.Topmost = $true if($Visable -eq $true){$form.Controls.Add($ListBoxName)} }elseif($Version -eq "Text"){ $TextBoxName = "TextBox" + $Name $TextBoxName = New-Object System.Windows.Forms.TextBox $TextBoxName.Location = New-Object System.Drawing.Point($posx,$posy) $TextBoxName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $form.Topmost = $true if($Visable -eq $true){$form.Controls.Add($TextBoxName)} } } $form = New-Object System.Windows.Forms.Form $form.Text = $Windowname $form.Size = New-Object System.Drawing.Size($xmax,$ymax) $form.StartPosition = 'CenterScreen' Button -Name "OK" -posx "75" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result OK Button -Name "Cancel" -posx "150" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result Cancel Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Add(Text2)" Label -Name "Text1" -posx "10" -posy "10" -Sizex "280" -Sizey "30" -Visable True -Text 'Wähle die Drucker aus (Mit "STRG" können mehrere ausgewählt werden)' Label -Name "Text2" -posx "10" -posy "330" -Sizex "280" -Sizey "30" -Visable False -Text 'Gib den vollständigen Druckernamen ein:' Box -Name "Text" -posx "10" -posy "350" -Sizex "260" -Sizey "20" -Visable True -Version Text $result = $form.ShowDialog() bearbeitet 22. Juni 2022 von Lukasb14 Zitieren Link zu diesem Kommentar
NorbertFe 2.050 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 Ich kanns nicht, aber Code sollte man als Code formatiert hier einstellen. So wirds schnell unübersichtlich. 1 Zitieren Link zu diesem Kommentar
Lian 2.425 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 @Lukasb14 Bitte in Zukunft beherzigen, Danke https://www.mcseboard.de/topic/114988-code-posten-bitte-mit-code-button-im-editor-einfügen/#comment-709994 Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 Schau doch mal in diesen Thread: https://stackoverflow.com/questions/56640925/creating-a-label-which-disappears-after-a-few-seconds $label.Visible = $false Du hast Visable geschrieben, ersetz das doch mal mit *visible*. ;) Zitieren Link zu diesem Kommentar
Lukasb14 1 Geschrieben 22. Juni 2022 Autor Melden Teilen Geschrieben 22. Juni 2022 vor 12 Minuten schrieb Sunny61: Schau doch mal in diesen Thread: https://stackoverflow.com/questions/56640925/creating-a-label-which-disappears-after-a-few-seconds $label.Visible = $false Du hast Visable geschrieben, ersetz das doch mal mit *visible*. ;) Hallo dies ist nur eine Variable die übergeben wird sollte also egal sein wie diese geschrieben wird, habs trotzdem mal geändert und hab das selbe Thema ;) Außerdem ist sie auch sichtbar wenn ich sie auf true setze, möchte aber nicht dass sie von anfang an angezeigt wird. Wie im Code ersichtlich möchte ich mit einem Klick auf dem Button "NoPrinter", dass das Label mit dem Namen "Text2" sichtbar wird. Weiß allerdings nicht wie ich herausfinde wie ich genau dieses Label sichtbar mache. Folgendes funktioniert leider nicht: $form.Controls.Add(Text2) Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 Du meinst also es ist egal ob Du -Visable oder -Visible schreibst? OK, dann viel Erfolg weiterhin. :) Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 Nur der Vollständigkeit halber ... vor 10 Minuten schrieb Sunny61: Du meinst also es ist egal ob Du -Visable oder -Visible schreibst? OK, dann viel Erfolg weiterhin. :) Wenn das ein selbst gewählter Variablen- oder Parameter-Name ist, ist es tatsächlich egal. Man muss es dann eben nur konsistent so benutzen und kann nicht einmal -Visible und ein anderes mal -Visable nutzen.. Zitieren Link zu diesem Kommentar
daabm 1.357 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 vor einer Stunde schrieb BOfH_666: Wenn das ein selbst gewählter Variablen- oder Parameter-Name ist, ist es tatsächlich egal. vor 7 Stunden schrieb Lukasb14: [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable, That said - das könnte auch $Apfelbutzen oder $Trashbin heißen Ich würde zwar statt dem ValidateSet einfach ein [Bool] davorsetzen, aber das ist pure Kosmetik. 1 Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 Me culpa, es ist ein selbst erstellter Variablenname, zumindest sehe ich das so in Zeile: if($Visable -eq $true){$form.Controls.Add($ButtonName)} Ich bin auf Visable/Visible reingefallen. Apfelbutzen oder Trashbin wären Namen gewesen, die mir nicht so ins Auge gefallen wären, wie Visable. ;) 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 22. Juni 2022 Melden Teilen Geschrieben 22. Juni 2022 vor 6 Stunden schrieb daabm: Ich würde zwar statt dem ValidateSet einfach ein [Bool] davorsetzen, aber das ist pure Kosmetik. Eine weitere Möglichkeit wäre, einfach einen [Switch] Parameter zu nehmen. Zitieren Link zu diesem Kommentar
Lukasb14 1 Geschrieben 23. Juni 2022 Autor Melden Teilen Geschrieben 23. Juni 2022 Hallo, danke für die ganzen Vorschläge, jedoch geht es mir nicht um den Prameter. Da ich hier "function" verwende, kann ich einen speziellen Button oder ein Label im weiteren Code nicht mehr aufrufen um es der Form hinzuzufügen oder zu entfernen. ZB möchte ich in folgender Zeile bei einem Klick auf den Button "NoPrinter" das Label mit dem "Text2" anzeigen lassen. Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Add(Text2)" Wie kann ich herausfinden welches Label den "Text2" hat Alle Labels werden vereinfacht gesagt so erstellt: function Label{ $LabelName = New-Object System.Windows.Forms.Label } Ein "Get-Object System.Windows.Form.Label" gibt es anscheinend nicht :( Zitieren Link zu diesem Kommentar
daabm 1.357 Geschrieben 23. Juni 2022 Melden Teilen Geschrieben 23. Juni 2022 Du könntest ein globales (Script-Scope) Array erstellen, in dem Du [PSCustomObject]@{} speicherst, die alle von Dir benötigten Objekte enthalten. Das kannst Du in Where-Object pipen mit $_.Name -eq 'Text2'. Oder Du erstellst ein globales [PSCustomObject]{}, dem Du jedes Label als Member hinzufügst, dann kannst Du mit $Object.LabelName direkt auf alle seine Eigenschaften zugreifen: $Object.Text2.posx oder so Hier gibt es leider zu viele Wege nach Rom... Zitieren Link zu diesem Kommentar
Lukasb14 1 Geschrieben 24. Juni 2022 Autor Melden Teilen Geschrieben 24. Juni 2022 vor 16 Stunden schrieb daabm: Du könntest ein globales (Script-Scope) Array erstellen, in dem Du [PSCustomObject]@{} speicherst, die alle von Dir benötigten Objekte enthalten. Das kannst Du in Where-Object pipen mit $_.Name -eq 'Text2'. Oder Du erstellst ein globales [PSCustomObject]{}, dem Du jedes Label als Member hinzufügst, dann kannst Du mit $Object.LabelName direkt auf alle seine Eigenschaften zugreifen: $Object.Text2.posx oder so Hier gibt es leider zu viele Wege nach Rom... Danke für die Hilfe leider hab ich noch eher wenig mit PSCustomObject gearbeitet, habe nun folgendes gemacht function Button{ param( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name, [parameter(Mandatory=$true)][ValidateRange(0,300)] $posx, [parameter(Mandatory=$true)][ValidateRange(0,450)] $posy, [parameter(Mandatory=$true)][ValidateRange(0,300)] $Sizex, [parameter(Mandatory=$true)][ValidateRange(0,450)] $Sizey, [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visable, [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result, [AllowEmptyString()][ValidateSet($true, $false)]$AddClick, [AllowEmptyString()]$Click ) $ButtonName = New-Object System.Windows.Forms.Button $ButtonName.Name = "Button$Name" $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy) $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $ButtonName.Text = $Name $ButtonName.DialogResult = $Result if($AddClick -eq $true){ $ButtonName.add_click({ $Click }) } if($Visable -eq $true){$form.Controls.Add($ButtonName)} [PSCustomObject]@{ Name = $ButtonName.Name Location = $ButtonName.Location Size = $ButtonName.Size Text = $ButtonName.Text DialogResult = $ButtonName.DialogResult add_click = $ButtonName.add_click } } Button -Name "OK" -posx "75" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result OK Button -Name "Cancel" -posx "150" -posy "385" -Sizex "75" -Sizey "23" -Visable True -Result Cancel Button -Name "NoPrinter" -posx "10" -posy "305" -Sizex "260" -Sizey "23" -Visable True -Result None -AddClick True -Click "$form.Controls.Remove([PSCustomObject]'ButtonOK')" Kannst mir vielleicht nochmal helfen, wie ich das PSCustomObject mit dem Namen "ButtonOK" abrufe. Zitieren Link zu diesem Kommentar
EmmKay 2 Geschrieben 24. Juni 2022 Melden Teilen Geschrieben 24. Juni 2022 (bearbeitet) Am 22.6.2022 um 11:12 schrieb Lukasb14: Ich habe/möchte eine Powershell GUI mit functions erstellen, jedoch weiß ich nicht wie ich Beispielsweise ein Label ein/ausblenden kann (Siehe letzten 15 Zeilen im Code) Alle Steuerelement erben von der [System.Windows.Forms.Control]-Klasse die Visible-Eigenschaft. Mit Hilfe dieser Eigenschaften lassen sich Deine Labels ein- und ausblenden. Control.Visible Eigenschaft Ich würde das Steuerelement von der Funktionen zurückgeben lassen und einer Variable zuweisen. Alle Steuerelement würde ich auch grundsätzlich dem Formular hinzufügen Die Sichtbarkeit des Steuerelements steuerst Du ja über die Visible-Eigenschaft. Damit das Click-Ereignis funktioniert, muss Du dem Ereignis ein Scriptblock übergeben. Leicht angepasster Code Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $Windowname = "Script" $xmax = "300" #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen $ymax = "450" #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen function Button{ param( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] $Name, [parameter(Mandatory=$true)][ValidateRange(0,300)] $PosX, [parameter(Mandatory=$true)][ValidateRange(0,450)] $PosY, [parameter(Mandatory=$true)][ValidateRange(0,300)] $SizeX, [parameter(Mandatory=$true)][ValidateRange(0,450)] $SizeY, [parameter(Mandatory=$true)][ValidateSet($true, $false)]$Visible, [parameter(Mandatory=$true)][ValidateSet("OK", "Cancel", "None")]$Result, [AllowEmptyString()][ValidateSet($true, $false)]$AddClick, [AllowEmptyString()]$Click ) $ButtonName = "Button" + $Name $ButtonName = New-Object System.Windows.Forms.Button $ButtonName.Location = New-Object System.Drawing.Point($posx,$posy) $ButtonName.Size = New-Object System.Drawing.Size($Sizex,$Sizey) $ButtonName.Text = $Name $ButtonName.DialogResult = $Result if($AddClick -eq $true){ $ButtonName.add_click( $Click ) } $ButtonName.Visible = $Visible $ButtonName } $form = New-Object System.Windows.Forms.Form $form.Text = $Windowname $form.Size = New-Object System.Drawing.Size($xmax,$ymax) $form.StartPosition = 'CenterScreen' $OKButton = Button -Name "OK" -PosX 75 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result OK $CancelButton = Button -Name "Cancel" -PosX 150 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result Cancel $NoPrtButton = Button -Name "NoPrinter" -PosX 10 -PosY 305 -SizeX 260 -SizeY 23 -Visible $True -Result None -AddClick True -Click {[System.Windows.Forms.Messagebox]::Show("Hello")} $form.Controls.Add($OKButton) $form.Controls.Add($CancelButton) $form.Controls.Add($NoPrtButton) $result = $form.ShowDialog() bearbeitet 24. Juni 2022 von EmmKay Zitieren Link zu diesem Kommentar
Beste Lösung EmmKay 2 Geschrieben 26. Juni 2022 Beste Lösung Melden Teilen Geschrieben 26. Juni 2022 Noch nicht perfekt .... Zitat Add-Type -AssemblyName System.Windows.Forms, System.Drawing $FormName = "Script" $MaxX = "300" #Am besten mit STRG+H alle Zahlen von "300" auf die gewünschte Größe ersetzen $MaxY = "450" #Am besten mit STRG+H alle Zahlen von "450" auf die gewünschte Größe ersetzen function Add-Button { param( [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $Name, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $PosX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $Posy, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $SizeX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $SizeY, [parameter(Mandatory=$true)] [ValidateSet($true, $false)] [System.Boolean] $Visible, [parameter(Mandatory=$true)] [ValidateSet("OK", "Cancel", "None")] [System.Windows.Forms.DialogResult] $Result, # [AllowEmptyString()] # [ValidateSet($true, $false)] # [System.Boolean] # $AddClickEventHandler, [AllowEmptyString()] [System.Management.Automation.ScriptBlock] $ClickEventHandler ) $newButton = New-Object System.Windows.Forms.Button $newButton.Name = "Button$Name" $newButton.Location = New-Object System.Drawing.Point($PosX, $PosY) $newButton.Size = New-Object System.Drawing.Size($SizeX, $SizeY) $newButton.Text = $Name $newButton.DialogResult = $Result $newButton.Visible = $Visible # if ($AddClickEventHandler) { $newButton.Add_Click($ClickEventHandler) # } $newButton } function Add-Label { param( [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $Name, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $PosX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $PosY, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $SizeX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $SizeY, [parameter(Mandatory=$true)] [ValidateSet($true, $false)] [System.Boolean] $Visible, [AllowEmptyString()] $Text ) $newLabel = New-Object System.Windows.Forms.Label $newLabel.Name = "Label$Name" $newLabel.Location = New-Object System.Drawing.Point($PosX, $PosY) $newLabel.Size = New-Object System.Drawing.Size($SizeX, $SizeY) $newLabel.Text = $Text $newLabel.Visible = $Visible $newLabel } function Add-Box{ param( [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $Name, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $PosX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $PosY, [parameter(Mandatory=$true)] [ValidateRange(0,300)] [System.Int32] $SizeX, [parameter(Mandatory=$true)] [ValidateRange(0,450)] [System.Int32] $SizeY, [parameter(Mandatory=$true)] [ValidateSet($true, $false)] [System.Boolean] $Visible, [parameter(Mandatory=$true)] [ValidateSet("List", "Text", "Search")] [System.String] $ControlType, [AllowEmptyString()] [System.String] $Entries, # $Input <- automatische PS-Variable [AllowEmptyString()] [System.String] $Text = "" ) if($ControlType -eq "List") { $newControl = New-Object System.Windows.Forms.ListBox $newControl.Name = "ListBox$Name" $newControl.SelectionMode = 'MultiExtended' $newControl.Height = $SizeY foreach($Entry in $Entries) { [void]$newControl.Items.Add($Entry) } } elseif ($ControlType -eq "Text") { $newControl = New-Object System.Windows.Forms.TextBox $newControl.Name = "TextBox$Name" $newControl.Text = $Text } $newControl.Location = New-Object System.Drawing.Point($PosX, $Posy) $newControl.Size = New-Object System.Drawing.Size($SizeX, $SizeY) $newControl.Visible = $Visible $newControl } $form = New-Object System.Windows.Forms.Form $form.Text = $FormName $form.Size = New-Object System.Drawing.Size($MaxX, $MaxY) $form.StartPosition = 'CenterScreen' $form.Topmost = $True $OKButton = Add-Button -Name "OK" -PosX 75 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result OK $CancelButton = Add-Button -Name "Cancel" -PosX 150 -PosY 385 -SizeX 75 -SizeY 23 -Visible $True -Result Cancel $NoPrtButton = Add-Button -Name "NoPrinter" -PosX 10 -PosY 305 -SizeX 260 -SizeY 23 -Visible $True -Result None -ClickEventHandler { $label2.Visible = $True } $label1 = Add-Label -Name "Text1" -PosX 10 -PosY 10 -SizeX 280 -SizeY 30 -Visible $True -Text 'Wähle die Drucker aus (Mit "STRG" können mehrere ausgewählt werden)' $label2 = Add-Label -Name "Text2" -PosX 10 -PosY 330 -SizeX 280 -SizeY 30 -Visible $False -Text 'Gib den vollständigen Druckernamen ein:' $text = Add-Box -Name "Text" -PosX 10 -PosY 350 -SizeX 260 -SizeY 20 -Visible $True -ControlType Text $form.Controls.Add($OKButton) $form.Controls.Add($CancelButton) $form.Controls.Add($NoPrtButton) $form.Controls.Add($label1) $form.Controls.Add($label2) $form.Controls.Add($text) $result = $form.ShowDialog() Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.