IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Problème de variable dans les fonctions. (windows forms) [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut Problème de variable dans les fonctions. (windows forms)
    Bonsoir, voila mon souci,

    voici un code qui fonctionne tres bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Data Entry Form"
    $objForm.Size = New-Object System.Drawing.Size(300,200) 
    $objForm.StartPosition = "CenterScreen"
    
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
    $objForm.Controls.Add($OKButton)
    
    $objForm.Topmost = $True
    $objForm.Add_Shown({$objForm.Activate()})
    [void] $objForm.ShowDialog()
    j'ai besoin de le faire marcher sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    
    function add-form(){
    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Data Entry Form"
    $objForm.Size = New-Object System.Drawing.Size(300,200) 
    $objForm.StartPosition = "CenterScreen"
    }
    function add-button(){
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
    $objForm.Controls.Add($OKButton)
    }
    
    function turnon {
    $objForm.Topmost = $True
    $objForm.Add_Shown({$objForm.Activate()})
    [void] $objForm.ShowDialog()
    }
    
    add-form
    add-button
    turnon
    vaut il mieux utiliser des returns ? (mais je ne sait pas trop comment...) des variables globales ? une autre subtilité ?
    voilà le topo, j'ai hate d'avoir une solution je suis sur un script qui me passionne xD

  2. #2
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut
    Trouver ! je ne sait pas si c'est la meilleur solution mais cela marche ! je reste ouvert à toutes proposition plus adapté !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    
    function add-form(){
    $script:objForm = New-Object System.Windows.Forms.Form 
    $script:objForm.Text = "Data Entry Form"
    $script:objForm.Size = New-Object System.Drawing.Size(300,200) 
    $script:objForm.StartPosition = "CenterScreen"
    }
    function add-button(){
    $script:OKButton = New-Object System.Windows.Forms.Button
    $script:OKButton.Location = New-Object System.Drawing.Size(75,120)
    $script:OKButton.Size = New-Object System.Drawing.Size(75,23)
    $script:OKButton.Text = "OK"
    $script:OKButton.Add_Click({$x=$objTextBox.Text;$script:objForm.Close()})
    $script:objForm.Controls.Add($script:OKButton)
    }
    
    function turnon {
    $script:objForm.Topmost = $True
    $script:objForm.Add_Shown({$script:objForm.Activate()})
    [void] $script:objForm.ShowDialog()
    }
    
    add-form
    add-button
    turnon

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par gretch Voir le message
    vaut il mieux utiliser des returns ?
    C'est une possible conception, dans ton cas la fonction retournera un objet différent, mais paramétré à l'identique.
    Citation Envoyé par gretch Voir le message
    (mais je ne sait pas trop comment...)
    Write-Output, Return et par défaut PS émet tout objet dans le pipeline :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      $OKButton = New-Object System.Windows.Forms.Button
      Write-Output $OKButton #précise l'intention
      $OKButton #comportement par défaut identique à Write-Output
      Return $OKButton # émet l'objet dans le pipe et quitte le code en cours
    Citation Envoyé par gretch Voir le message
    des variables globales ? une autre subtilité ?
    On retarde autant que possible l'usage de globale, la portée script est une solution. Cela dépend de l'usage de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    
    function add-form(){
    $script:objForm = New-Object System.Windows.Forms.Form 
    $script:objForm.Text = "Data Entry Form"
    $script:objForm.Size = New-Object System.Drawing.Size(300,200) 
    $script:objForm.StartPosition = "CenterScreen"
    }
    
    function add-button{
      $OKButton = New-Object System.Windows.Forms.Button
      $OKButton.Location = New-Object System.Drawing.Size(75,120)
      $OKButton.Size = New-Object System.Drawing.Size(75,23)
      $OKButton.Text = "OK"
      $OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
      $script:objForm.Controls.Add($OKButton)
    }
    
    function turnon {
      $script:objForm.Topmost = $True
      $script:objForm.Add_Shown({$objForm.Activate()})
      [void] $script:objForm.ShowDialog()
    }
    
    add-form
    add-button
    turnon
    
    test-path variable:objForm
    test-path variable:script:objForm
    $script:objForm.Dispose()
    Ne pas oublier l'appel à Dispose(), ce n'est pas une option :-)
    Dans ton dernier post, les objets ajoutés ainsi objForm.Controls.Add() n'ont pas besoin d'avoir la portée script,.
    N'oublie pas le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $script:OKButton.Add_Click({$x=$objTextBox.Text;$script:objForm.Close()})

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Une autre approche pour manipuler tes composants, sous réserve de le nommer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      $OKButton.Name = "btnOK"
      $OKButton.Add_Click(
       {
         Write-host "Composant courant :$($this.Name)"
         Write-host "Recherche le texte d'un composant en utilisant son nom :$(($script:objForm.Controls.Find('btnOK',$false)).Text)"
         $script:objForm.Close()
       }
      )

  5. #5
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut
    re

    bon un petit retour...

    les returns : j'ai pour l"instant abandonné cette idée, je passe par la scope script comme tu as pu le constater

    Ne pas oublier l'appel à Dispose(),
    mouarf, que fait donc cet appel (il "clos" la form si j'ai bien compris cela ne va t'il pas m'empécher de la modifier ensuite ?)je crois que j'ai pas tout compris, vu que tu utilise aussi l'appel .close() ,

    D'une manière générale, pour voir ou je veux en venir je te propose de jeter un petit coup d'oeil sur ce post :
    http://www.developpez.net/forums/d14...m/#post7935402

    en gros le but de la manip est de convertir un GUI KODA en GUI Powershell c'est bien partie ! (entre autre grace à toi )
    n'hesite pas à venir donner un coups de main xD

    Merci encore !

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gretch Voir le message
    mouarf, que fait donc cet appel
    Il libère explicitement les ressources de l'objet Form. Close() devrait suffire, sauf que :
    Il existe deux situations dans lesquelles un formulaire n'est pas disposé sur Close : (1) lorsqu'il fait partie d'une application MDI et que le formulaire n'est pas visible ; (2) lorsque vous avez affiché le formulaire en utilisant ShowDialog. Dans ces circonstances, vous devez appeler manuellement Dispose pour marquer tous les contrôles du formulaire pour le garbage collection.
    Citation Envoyé par gretch Voir le message
    n'hesite pas à venir donner un coups de main xD
    J'ai du temps en ce moment, mais j'ai d'autres priorités. Désolé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/07/2014, 18h13
  2. [NASM] Problème de variable dans la fonction appelante
    Par Joccd dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 01/04/2009, 15h45
  3. problème de variable dans une fonction
    Par K4trix dans le forum C
    Réponses: 9
    Dernier message: 06/07/2006, 10h38
  4. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 02h55
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo