Question utilisation d'une System.Windows.Forms.ProgressBar

Plus d'informations
il y a 13 ans 4 mois #2283 par caillebotte
Bonjour,
Je viens d'utiliser votre \"PowerShell Form Converter\" afin de générer une IHM contenant une barre progression, mais je n'arrive pas à faire évoluer sa valeur en temps

voici mon code, d'avance merci

[System.Reflection.Assembly]::LoadWithPartialName(\"System.windows.forms\")

$progressBar = new-object System.Windows.Forms.ProgressBar
#
# progressBar
#
$progressBar.Location = new-object System.Drawing.Point(32, 48)
$progressBar.Name = \"progressBar\"
$progressBar.Size = new-object System.Drawing.Size(271, 23)
$progressBar.TabIndex = 3
$progressbar.value=50

$Form2 = new-object System.Windows.Forms.form
# Form1
#
$Form2.ClientSize = new-object System.Drawing.Size(337, 331)
$Form2.Controls.Add($progressBar)
$Form2.Name = \"Form2\"
$Form2.Text = \"Progression \"
$Form2.Showdialog()

while ($i -ne 100 )
{
$progressbar.value = $i
$i = $i +1
}
Pièces jointes :

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

Plus d'informations
il y a 13 ans 4 mois #2284 par VICTORIN
Salut Gustave,

Ton while est mal placé car la fonction showdialog empeche son execution.
Il faut soit le mettre avant le showdialog mais tu ne verra pas la progression, soit le mettre dans un evenement click d'un bouton que tu rajoutes sur ta fenetre.

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

Plus d'informations
il y a 13 ans 4 mois #2285 par Robin Lemesle
Hello gustave !

Mauvais forum, je déplace le post.
Sinon pour ta question, j'ai plusieurs interrogations?
- Pourquoi vouloir faire démarrer une progressbar à vide avec un while ?
- Pourquoi utiliser une form pour faire ca (je pense aux progress bar dans la console \"write-progress\", il y a un tuto dessus sur ce site) ?

Sinon, si tu tiens absolument à ta formule, il existe une technique qui repose sur la notion de runspace. Voici le liens ou janel explique le fonctionnement. janel.spaces.live.com/blog/cns!9B5AA3F6FA0088C2!187.entry

Robin MVP PowerShell

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

Plus d'informations
il y a 13 ans 4 mois #2287 par Laurent Dardenne
Salut,
Robin écrit:

Pourquoi utiliser une form pour faire ca (je pense aux progress bar dans la console \"write-progress\", il y a un tuto dessus sur ce site) ?

Voir aussi :
powershellcommunity.org/Blogs/CommunityB...ryID/43/Default.aspx
www.microsoft.com/technet/scriptcenter/r...mar08/pstip0321.mspx
technet.microsoft.com/en-us/magazine/cc194398.aspx
Robin écrit:

il existe une technique qui repose sur la notion de runspace.

Quitte à utiliser cette technique autant partir de la version suivante :
www.leeholmes.com/blog/RealtimeSyntaxHig...werShellConsole.aspx
Elle prend en compte le partage de donnée entre les 2 runspaces.
Je comptais ajouter ce module dans le script Convert-Form, faut que j'étudie la question...
vinz2k écrit:

soit le mettre dans un evenement click d'un bouton que tu rajoutes sur ta fenetre.

On peut éviter cette approche et automatiser le déclenchement de la progression.
Première idée, un timer :
[code:1]
$timer1.Enabled = $true
$progressbar1.value=0
$progressbar1.Minimum=0
$progressbar1.Maximum=100
$progressbar1.MarqueeAnimationSpeed=1
function OnTick_timer1($Sender,$e){
$timer1.Enabled = $false
1..100|% {$progressbar1.value =$_;Write-host $_;start-sleep -m 20}
$FrmTest15ProgressBarTimer.Close()
}
$timer1.Add_Tick( { OnTick_timer1 $timer1 $EventArgs} )
[/code:1]
Cela fonctionne, l'événement est crée par le script et ici le timer est déclenché automatiquement. En fin de traitement on ferme la forme.
Attention à modifier le code avant l'exécution du script généré ;-)

Seconde idée, utiliser le gestionnaire d'événement Add_Shown impléménté par défaut.
On ajoute l'appel d'un scriptBlock :
[code:1]
$FrmTest15ProgressBarTimer.Add_Shown({$FrmTest15ProgressBarTimer.Activate();&$Sb})
[/code:1]
Le contenu du ScriptBlock est identique à celui contenu dans l'événement du timer :
[code:1]
$Sb={
#On connait le nombre d'item
1..100|% {$progressbar1.value =$_;Write-host $_;start-sleep -m 20}
$progressbar1.value=0
$FrmTest15ProgressBarTimer.Close()
}
[/code:1]
Vous remarquerez qu'on peut afficher dans la console tout en ayant la fenêtre au premier plan :-)
Dans le fichier joint il y a 2 autres cas de progression. Le pb est qu'on doit connaitre la borne maximum.

Maintenant je ne sais pas si cela répond à tous les cas.

La pièce jointe progress.ps1 est absente ou indisponible


Tutoriels PowerShell
Pièces jointes :

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

Plus d'informations
il y a 13 ans 4 mois #2288 par caillebotte
Merci pour toutes ces informations qui réponde à mes interrogations

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

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