Question Creation d'objets dans un Foreach

Plus d'informations
il y a 1 mois 3 jours #34216 par Bruno95
Bonjour, je viens de m'inscrire,

Ce que je souhaiterai:
Creer un objet de type Button, dans une boucle Foreach, se basant sur un tableau de noms de Button,
et lui ajouter un Add-click. 
Dans mon exemple, un seul poste dans le tableau, affichage dans la console de ma variable $element, qui est egale a $Button1A.

Mais l'objet Button n' est pas créé ?

LE SCRIPT:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


$buttonarray = '$Button1A'

#FONCTIONS
#
function fNew-button {
    
    foreach ($button in $buttonarray) {

        $button
        $button = New-Object System.Windows.Forms.Button
        $button.location = New-Object System.Drawing.Point(21,29)
        $button.Size = New-Object System.Drawing.Size(60,60)

        #$Button1B = New-Object System.Windows.Forms.Button
        #$Button1B.Location = New-Object System.Drawing.Point(80,29)
        #$Button1B.Size = New-Object System.Drawing.Size(60,60)

        $button.Add_Click({
            $button.backcolor = 'green'
        })
                              
    }

}


#MISE EN FORME
#
$page = New-Object System.Windows.Forms.Form
$page.FormBorderStyle = 3 #fenêtre à taille fixe
$page.Maximizebox = $false
$page.size = New-Object System.Drawing.Size(1860,1020)
$page.StartPosition = 'CenterScreen'
$page.Text = 'LA FENETRE'
$page.BackColor = 'black'

$fenetrejoueur = New-Object System.Windows.Forms.GroupBox
$fenetrejoueur.Location = New-Object System.Drawing.Point(20,22)
$fenetrejoueur.Width = 888
$fenetrejoueur.Height = 900
#$fenetrejoueur.Text = « User »

$fenetreordinateur = New-Object System.Windows.Forms.GroupBox
$fenetreordinateur.Location = New-Object System.Drawing.Point(946,22)
$fenetreordinateur.Width = 888
$fenetreordinateur.Height = 900
#$fenetreordinateur.Text = « Station »

$page.controls.AddRange(@($Button1A,$fenetrejoueur,$fenetreordinateur)
)

#TRAITEMENT
#
fNew-button

#AFFICHAGE
#
$page.ShowDialog()

Voila, si vous pouvez m'aider, ca ne doit pas etre grand chose, ou alors je m'y prends mal :-)

Bruno.

 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 2 jours - il y a 1 mois 2 jours #34217 par Bruno95
Réponse de Bruno95 sur le sujet Creation d'objets dans un Foreach
Bonjour,

Voila ou j' en suis..., il me faut maintenant mettre des Add-click ou On-click sur les boutons.
N'hesitez pas a corriger ma facon de faire :-)

Bonne journée 

Fichier attaché :

Nom du fichier : script2.ps1
Taille du ficher :2 ko
 

Fichier attaché :

Nom du fichier : script2.ps1
Taille du ficher :2 ko



 
Pièces jointes :
Dernière édition: il y a 1 mois 2 jours par Bruno95.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 jour #34224 par Fabien
Réponse de Fabien sur le sujet Creation d'objets dans un Foreach
Bonjour Bruno.

Dans ton exemple, il suffit d'intégrer dans la boucle Foreach l'action au clic sur le bouton.
L'inconvénient est que tu auras la même action pour chaque bouton.
Set-StrictMode -Version 2.0
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#Tableau des noms de boutons
$buttonarray = '$Button1A', '$Button1B', '$Button1C'

#FONCTIONS
#----------
#Creation des boutons
function fNew-Button {
    #Colonne de depart
    [int]$col = 21
    foreach ($button in $buttonarray) {        
        $col
        $button
        $button = New-Object System.Windows.Forms.Button
        $button.location = New-Object System.Drawing.Point($col,29)
        $button.Size = New-Object System.Drawing.Size(60,60)
        $button.Add_Click({ Write-Host "Click"})
        $page.controls.Add($button)
        $col += 59                     
    }  
}
#MISE EN FORME
#--------------
$page = New-Object System.Windows.Forms.Form
$page.FormBorderStyle = 3 #fenêtre à taille fixe
$page.Maximizebox = $false
$page.size = New-Object System.Drawing.Size(1860,1020)
$page.StartPosition = 'CenterScreen'
$page.Text = 'LA FENETRE'
$page.BackColor = 'black'
$fenetrejoueur = New-Object System.Windows.Forms.GroupBox
$fenetrejoueur.Location = New-Object System.Drawing.Point(20,22)
$fenetrejoueur.Width = 888
$fenetrejoueur.Height = 900
$fenetreordinateur = New-Object System.Windows.Forms.GroupBox
$fenetreordinateur.Location = New-Object System.Drawing.Point(946,22)
$fenetreordinateur.Width = 888
$fenetreordinateur.Height = 900

#Creation des boutons
fNew-Button

$page.controls.AddRange(@($fenetrejoueur,$fenetreordinateur))

#TRAITEMENT
#----------


#AFFICHAGE
#---------
$page.ShowDialog()

Pour réaliser des interfaces graphiques avec Powershell, je te conseille fortement le WPF.
Tu auras l'avantage d'avoir des interfaces graphiques dynamiques et beaucoup plus sympa.

Fabien

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 jour #34225 par Fabien
Réponse de Fabien sur le sujet Creation d'objets dans un Foreach
Bruno,

Si tu veux voir ce que ça donne en WPF.
Voici un exemple de WPF en intégrant la création de bouton comme ton script.
#Code XML de l'interface graphique WPF
[xml]$XAML = @"
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="Buttons" 
        Height="345" 
        Width="233" 
        ResizeMode="NoResize">
        
    <Grid>
        <StackPanel Name="StackButtonsHere" HorizontalAlignment="Left" Height="231" Margin="22,10,0,0" VerticalAlignment="Top" Width="170"/>
        <Button Name="AddAButton" Content="Add Button" HorizontalAlignment="Left" Margin="22,277,0,0" VerticalAlignment="Top" Width="170"/>
        <TextBox Name="ButtonName" HorizontalAlignment="Left" Height="23" Margin="48,249,0,0" TextWrapping="Wrap" Text="Button_Name" VerticalAlignment="Top" Width="120"/>
    </Grid>
    
</Window>
"@       
 
#Chargement de l'assembly
[void][System.Reflection.Assembly]::LoadWithPartialName('PresentationFramework')

#Lecture du code XAML 
$XAMLReader= New-Object System.Xml.XmlNodeReader $XAML
try{
    $Form=[Windows.Markup.XamlReader]::Load($XAMLReader)
} catch {
    Throw "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
}
 
#===========================================================================
# Chargement de l'objet XAML dans PowerShell
#===========================================================================

# Convertir Name=* dans XML en Variable du meme nom
$XAML.SelectNodes("//*[@Name]") | % { Set-Variable -Name ($_.Name) -Value $Form.FindName($_.Name)}

#===========================================================================
# Évenements
#===========================================================================

#Tableau des noms de boutons
$buttonarray = 'Button1A', 'Button1B', 'Button1C'

#FONCTIONS
#----------
#Creation des boutons
function fNew-Button {
    
    #Boucle foreach
    foreach ($i in $buttonarray) {
        
        #Création du bouton
        $button = New-Object System.Windows.Controls.Button
        #Nom du bouton
        $button.Name = $i
        #Contenu du bouton
        $button.Content = $i
        #hauteur du bouton
        $button.Height = 20
        #Intégration du bouton dans le StackPanel
        $StackButtonsHere.AddChild($button)

        #Action au clic sur le bouton
        $button.Add_Click({ Write-Host "Click"})                   
    }
}

#Appel de la fonction
fNew-Button

#Action au clic sur le bouton "Add Button"
$AddAButton.Add_Click({
    #Création du bouton
    $NewButton = New-Object System.Windows.Controls.Button
    #Nom du bouton
    $NewButton.Name = $ButtonName.Text
    #Contenu du bouton
    $NewButton.Content = $ButtonName.Text
    #hauteur du bouton
    $NewButton.Height = 20
    #Intégration du bouton dans le StackPanel
    $StackButtonsHere.AddChild($NewButton)

    #Action au clic sur le bouton
    $NewButton.Add_Click({

        #$Sender : Contient l’objet qui a généré cet événement
        [System.Object]$Sender = $args[0]
        #Affichage du nom du bouton dans la Textbox
        $ButtonName.Text = $Sender.Name
    })
})

#===========================================================================
# Affichage de la fenetre
#===========================================================================
$Form.ShowDialog() | Out-Null

Fabien

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 jour #34227 par Bruno95
Réponse de Bruno95 sur le sujet Creation d'objets dans un Foreach
Bonjour Fabien,

Tres content d' avoir eu des reponses, mais en plus des reponses interessantes .
Tu n' as pas l'air d'etre "la moitié d'un con" :-)
C'est cool...

Concernant, ta reponse, pour mon script actuel, voila mon Add-click, et l' erreur obtenue:

#Creation des boutons
function fNew-Button {
    #Colonne de depart
    [int]$col = 21
    [int]$line = 29
    foreach ($button in $buttonarray) {        
        $button
        $col
        $line
        if ($col -eq 906) {
            $col = 21
            $line += 59
        }
        $button = New-Object System.Windows.Forms.Button
        $button.location = New-Object System.Drawing.Point($col,$line)
        $button.Size = New-Object System.Drawing.Size(60,60)
        $button.add_Click({
            $button.BackColor = 'green'
        })
        $page.controls.Add($button)
        $col += 59
        $col
        $line
    }  
}

Voici, l'erreur des que je clique:

Impossible d’extraire la variable « $button », car elle n’a pas été définie.
Au caractère D:\mesdocuments\powershell\script1.ps1:64 : 13
+             $button.BackColor = 'green'
+             ~~~~~~~
    + CategoryInfo          : InvalidOperation : (button:String) [], RuntimeException
    + FullyQualifiedErrorId : VariableIsUndefined
   

Concernant WPF, je regarde ca de plus pret, je te tiens au courant...

Merci encore Fabien et bonne soirée.
 
Les utilisateur(s) suivant ont remercié: Fabien

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 jour #34228 par Bruno95
Réponse de Bruno95 sur le sujet Creation d'objets dans un Foreach
Pour ne pas paraitre trop "con" :-), je faisais ce Add_click avant ta reponse, mais j'ai ce message...

Je suis vraiment "thanks", ca fait plaisir de pouvoir demander a quelq'un (sans l'emmerder, bien sur) :-)
 

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.207 secondes
Propulsé par Kunena