Question [Form Converter][V0.5] Nouvelle version

Plus d'informations
il y a 18 ans 3 semaines #1759 par Laurent Dardenne
[edit]
Voir la nouvelle version 0.7 dans ce post .
[/edit]

Salut,
voici une nouvelle version, consultez l'entête pour les détails.

Dans le fichier joint vous trouverez les 2 scripts et le fichier détaillant les composants supportés ainsi que les bugs que j'ai rencontré sur 2 composants.
Il serait bien que l'auteur à l'origine de ce script commente le traitment de parsing du fichier .CS car pour le moment j'ai un peu de mal avec le mode DEBUG de PowerShell :/

Si vous avez des commentaires n'hésitez pas.

Sinon le tutoriel sur ce script n'est plus à jour...
[code:1]
################################################################################
# www.PowerShell-Scripting.com
#
# PowerShell Form Converter
#
# Version : 0.5
#
# Statut : A valider
#
# Date : 23 février 2008
#
# Nom : CSForm2PS.ps1
#
# Usage : CSForm2PS.ps1 -source Form1.Designer.cs -dest Form1.ps1 [-dontshow]
#
# Objet : Conversion d'un formulaire graphique C# (form) créé à partir
# de Visual C# 2005 (Express Edition ou > ) en un script PowerShell.
#
# Composants supportés : voir le fichier ComposantsSupportes.txt
#
# Composant interdit :
# System.Windows.Forms.WebBrowser : Limite de PowerShell v1.0
# blogs.msdn.com/powershell/archive/2007/0...xecution-thread.aspx
# New-Object : Exception lors de l'appel de « .ctor » avec « 0 » argument(s) : « Impossible d'instancier le contrôle ActiveX
# '8856f961-340a-11d0-a96b-00c04fd705a2', car le thread actuel n'est pas un thread cloisonné (STA, Single-Threaded Apartment)
#
#
# Limitations :
# Pour le moment (02/08) les composants placés sur la form ne doivent pas être renommés sous VS.
# L'imbrication de controls ( panel) n'est pas pris en charge.
#
# V0.5 (23/02/08) (BatchMan):
# - Ajouts :
# - contrôle des arguments de la ligne de commande
# - commentaires
# - Renommage de variables
# - Validation de la syntaxe du script généré en fin de traitement
# - Tests de tous les controles communs, des menus et barre d'outils (en cours)
# Note: Les lignes ((System.ComponentModel.ISupportInitialize) des dataGridView1 sont dédiés il me semble au datasource.
#
# V0.4 (23/02/08) (VV) :
# - Ajout de l'argument -dontshow pour supprimer l'affichage de la form à la fin du script PS1 généré
# - Remplacement de \"new XXXXXX[] {\" dans le cadre du remplissage d'objets avec des valeurs (type listbox)
# - Traitement des enumerations (format [XXXX.XXXX.XXXX.XXXX]::«»XXXX)
# - Suppression de la déclaration des évenements (à rajouter par développeur)
# - Suppression des ISupportInitialize
# - Remplacement du format de typage des données
# - Remplacement de l'opérateur binaire OR
#
# Todo :
# L'imbrication de controls dans un conteneur : this.toolStripContainer1.ContentPanel.Controls.Add(this.maskedTextBox1);
# Certaines lignes du traitement principal devraient forcer l'itération suivante: continue (BatchMan)
# Vérification syntaxe : &\"$Fullpath\CheckSyntaxErrors.ps1\" (BatchMan)
# Ajout projet de test C# (BatchMan)
# Tests avec les propriétés renseignées (BatchMan)
#
##########################################################################

param ([string]$source, [string]$dest, [switch]$dontshow)
if ((!$source) -or (!$dest))
{ Write-Host \"Usage :`n`r CSForm2PS.ps1 -source Form1.Designer.cs -dest Form1.ps1 [-dontshow]`n`r\"
Write-Host \" L'argument -dontshow spécifie la suppression, à la fin du script PS1 généré, de l'appel à la méthode ShowDialog().\"
Return
}

# Programme source CSharp à analyser
$csFilename = $source

# fichier destination PowerShell
$psFileName = $dest

# Collection des lignes utiles de InitializeComponent() : $Components
# Note:
# Le code généré automatiquement par le concepteur Windows Form est inséré
# dans la méthode InitializeComponent.
# L'intégralité du code d'une méthode C# est délimité par { ... }
#
[string[]] $Components = @()
[boolean] $debut = $false

foreach ($ligne in (get-content $csFileName))
{
if (! $debut)
{ if ($ligne.contains(\"InitializeComponent()\"«»)) {$debut = $true}
}
else
{ if (($ligne.trim() -eq \"}\"«») -or ($ligne.trim() -eq \"\"«»)) {break}
if ($ligne.trim() -ne \"{\"«») {$Components += $ligne}
}
}

# On récupère le nom de la form dans $formName
# Note:
# On recherche la ligne d'affectation du nom de la Form : this.Name = \"Form1\";
#
$formName = \"\"
foreach ($ligne in $Components)
{ if ($ligne -match '^\s*this\.Name\s*=\s*\"(?<nom>[^\"]+)\"\w*' )
{$formName = $matches[\"nom\"]; break}
}
if ($formName -eq \"\"«») { write-output \"le nom de la form est introuvable dans le fichier $csFilename\"; exit}

# Collection de lignes constituant le nouveau script : $LinesNewScript
# Note:
# Les déclarations des composants d'une Form se situent entre les lignes suivantes :
# this.SuspendLayout();
# ...
# // Form
#
[string[]] $LinesNewScript = @()
$LinesNewScript += '[void][Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)'
[boolean] $debut = $true # jusqu'à la rencontre de // Form
foreach ($ligne in $Components)
{
$ligne = $ligne.trim()
$util = $true # Cette ligne est-elle utile ?
if ($ligne.Contains(\"Layout\"«»)) {$util = $false}
if ($ligne.Contains(\"AutoScale\"«»)) {$util = $false}
if ($ligne -eq \"\"«») {$util = $false}
if ($util)
{
if ($ligne.EndsWith(\";\"«»)) {$ligne = $ligne.SubString(0, $ligne.Length-1) }
if ($ligne.EndsWith(\"()\"«»)) {$ligne = $ligne.SubString(0, $ligne.Length-2) }
if ($ligne.StartsWith(\"//\"«»)) {$ligne = \"#\" + $ligne.SubString(2)}

$ligne = $ligne.replace(\" true\", ' $true')
$ligne = $ligne.replace(\" false\", ' $false')

# Bug : RegEx erronée pour le composant System.Windows.Forms.ToolStripContainer ?
$ligne = $ligne -replace \"(\w+\.\w+\.\w+\.\w+)\.(\w+)\", '[$1]::$2'


# Remplacement du format de typage des données
$ligne = $ligne -replace \"\((\w+\.\w+\.\w+\.\w+)\)\", '[$1]'

# Aucun équivalent ne semble exister en Powershell pour ces commandes :
#DataGridView
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit\",'')
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit\",'')
#NumericUpDown
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit\",'')
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit\",'')
#pictureBox
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit\",'')
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit\",'')

# Remplacement de \"new XXXXXX[] {\" dans le cadre du remplissage d'objets avec des valeurs
$ligne = $ligne -replace \"new [A-Za-z0-9_\.]+\[\] \{\",'@('
# Tjs dans le cadre du remplissage de listbox, remplacement de \"})\" par \"«»))\"
if ($ligne.EndsWith(\"})\"«»)) {$ligne = $ligne.replace(\"})\", '))')}

# Suppression de la déclaration des événements (à rajouter par le développeur)
if ($ligne -match \"^this\.?[^\.]+\.\w+ \+= new [A-Za-z0-9_\.]+EventHandler\(\"«») { $ligne = \"\" }

# Remplacement de l'opérateur binaire OR
$ligne = $ligne.replace(\"|\", '-bor')

if ($ligne -match \"^#\s+\" + $formName)
{
$debut = $false
$LinesNewScript += '$' + \"$formName = new-object System.Windows.Forms.form\"
}
if ($debut)
{
if ($ligne.StartsWith(\"this.\"«»)) {$ligne = $ligne.replace(\"this.\",'$')}
}
else
{
if ($ligne.StartsWith(\"this.\"«»)) {$ligne = \"$\" + $formName + $ligne.SubString(4)}
if ($ligne.Contains(\"this.\"«»)) {$ligne = $ligne.replace(\"this.\", \"$\"«»)}
}
$ligne = $ligne.replace(\" new \", \" new-object \"«»)
$LinesNewScript += $ligne

} # if ($util)
} # foreach

# Pas d'appel à la méthode ShowDialog
If( -not $dontshow.ISPresent )
{
$LinesNewScript += \"$\" + $formname + \".ShowDialog()\"
}

# Ecriture du fichier de sortie
#
$LinesNewScript | out-file -filepath $psFileName -encoding default

# Vérifie la syntaxe du script généré
#
.\CheckSyntaxErrors.ps1 $psFileName -verbose[/code:1]

La pièce jointe CSForm2PS.zip est absente ou indisponible

<br><br>Message édité par: BatchMan, à: 26/03/08 22:53

Tutoriels PowerShell
Pièces jointes :

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

Plus d'informations
il y a 18 ans 3 semaines #1763 par Laurent Dardenne
J'ai modifié le traitement principal tout en le documentant, il reste 5-6 lignes à documenter.
J'ai utilisé le même projet de test que pour le V0.5.

Les regex avec des commentaires c'est tout de même mieux :ohmy: . Reste à confirmer mes commentaires...

J'ai un doute quand à la suppression de certaines lignes C# : SuspendLayout et AutoScaleDimensions

Je dois tester le changement de résolution une fois le script généré.

[code:1]
################################################################################
# www.PowerShell-Scripting.com
#
# PowerShell Form Converter
#
# Version : 0.6
#
# Statut : A valider
#
# Date : 24 février 2008
#
# Nom : CSForm2PS.ps1
#
# Usage : CSForm2PS.ps1 -source Form1.Designer.cs -dest Form1.ps1 [-dontshow]
#
# Objet : Conversion d'un formulaire graphique C# (form) créé à partir
# de Visual C# 2005 (Express Edition ou &gt; ) en un script PowerShell.
#
# Composants supportés : voir le fichier ComposantsSupportes.txt
#
# Composant interdit :
# System.Windows.Forms.WebBrowser : Limite de PowerShell v1.0
# blogs.msdn.com/powershell/archive/2007/0...xecution-thread.aspx
# New-Object : Exception lors de l'appel de « .ctor » avec « 0 » argument(s) : « Impossible d'instancier le contrôle ActiveX
# '8856f961-340a-11d0-a96b-00c04fd705a2', car le thread actuel n'est pas un thread cloisonné (STA, Single-Threaded Apartment)
#
#
# Limitations :
# Pour le moment (02/08) les composants placés sur la form ne doivent pas être renommés sous VS.
# L'imbrication de controls ( panel) n'est pas pris en charge.
#
# V0.6 (23/02/08) (BatchMan):
# - Ajout :
# - Documentation du parsing.
# - Modifications :
# - Simplification des traitements
# - Toutes les traitements 'unique', tel que la suppression de lignes, déclenche l'itération suivante.
# - Renommage des variables de controle
#
# V0.5 (23/02/08) (BatchMan):
# - Ajouts :
# - Contrôle des arguments de la ligne de commande
# - Commentaires
# - Renommage de variables
# - Validation de la syntaxe du script généré en fin de traitement
# - Tests de tous les controles communs, des menus et barre d'outils (en cours)
# Note: Les lignes ((System.ComponentModel.ISupportInitialize) des dataGridView1 sont dédiés il me semble au datasource.
#
# V0.4 (23/02/08) (VV) :
# - Ajout de l'argument -dontshow pour supprimer l'affichage de la form à la fin du script PS1 généré
# - Remplacement de \&quot;new XXXXXX[] {\&quot; dans le cadre du remplissage d'objets avec des valeurs (type listbox)
# - Traitement des enumerations (format [XXXX.XXXX.XXXX.XXXX]::«»XXXX)
# - Suppression de la déclaration des évenements (à rajouter par développeur)
# - Suppression des ISupportInitialize
# - Remplacement du format de typage des données
# - Remplacement de l'opérateur binaire OR
#
# Todo :
# L'imbrication de controls dans un conteneur : this.toolStripContainer1.ContentPanel.Controls.Add(this.maskedTextBox1);
# Vérification syntaxe : &amp;\&quot;$Fullpath\CheckSyntaxErrors.ps1\&quot; (BatchMan)
# Ajout projet de test C# (BatchMan)
# Tests avec les propriétés renseignées (BatchMan)
#
##########################################################################

param ([string]$source, [string]$dest, [switch]$dontshow)
if ((!$source) -or (!$dest))
{ Write-Host \&quot;Usage :`n`r CSForm2PS.ps1 -source Form1.Designer.cs -dest Form1.ps1 [-dontshow]`n`r\&quot;
Write-Host \&quot; L'argument -dontshow spécifie la suppression, à la fin du script PS1 généré, de l'appel à la méthode ShowDialog().\&quot;
Return
}

# Programme source CSharp à analyser
$csFilename = $source

# fichier destination PowerShell
$psFileName = $dest

# Collection des lignes utiles de InitializeComponent() : $Components
# Note:
# Le code généré automatiquement par le concepteur Windows Form est inséré
# dans la méthode InitializeComponent.
# L'intégralité du code d'une méthode C# est délimité par { ... }
# On insére ces lignes de code et uniquement celles-ci dans le tableau $Component.
#
[string[]] $Components = @()
[boolean] $IsDebutCodeInit = $false

foreach ($ligne in (get-content $csFileName))
{
if (! $IsDebutCodeInit)
{ # On démarre l'insertion à partir de cette ligne
if ($ligne.contains(\&quot;InitializeComponent()\&quot;«»)) {$IsDebutCodeInit= $true}
}
else
{ # Fin de la méthode rencontrée ou ligne vide, on quitte l'itération.
if (($ligne.trim() -eq \&quot;}\&quot;«») -or ($ligne.trim() -eq \&quot;\&quot;«»)) {break}
# C'est une ligne de code, on l'insére
if ($ligne.trim() -ne \&quot;{\&quot;«») {$Components += $ligne}
}
}

# On récupère le nom de la form dans $formName
# Note:
# On recherche la ligne d'affectation du nom de la Form : this.Name = \&quot;Form1\&quot;;
#
$formName = \&quot;\&quot;
foreach ($ligne in $Components)
{ if ($ligne -match '^\s*this\.Name\s*=\s*\&quot;(?&lt;nom&gt;[^\&quot;]+)\&quot;\w*' )
{$formName = $matches[\&quot;nom\&quot;]; break}
}
if ($formName -eq \&quot;\&quot;«») { Write-Output \&quot;le nom de la form est introuvable dans le fichier $csFilename\&quot;; exit}

# Collection de lignes constituant le nouveau script : $LinesNewScript
# Note:
# Les déclarations des composants d'une Form se situent entre les lignes suivantes :
# this.SuspendLayout();
# ...
# // Form
#
[string[]] $LinesNewScript = @()
$LinesNewScript += '[void][Reflection.Assembly]::LoadWithPartialName(\&quot;System.Windows.Forms\&quot;«»)'
[boolean] $IsTraiteMethodesForm = $False # Jusqu'à la rencontre de la chaîne \&quot; # Form1 \&quot;

foreach ($ligne in $Components)
{
$ligne = $ligne.trim()
if ($ligne -eq \&quot;\&quot;«») {Continue} #Ligne suivante

# Suppression des lignes contenant un appel aux méthodes suivantes :
# SuspendLayout, ResumeLayout et PerformLayout
if ($ligne.Contains(\&quot;Layout\&quot;«»)) {Continue}
if ($ligne.Contains(\&quot;AutoScale\&quot;«»)) {Continue}

# Aucun équivalent ne semble exister en Powershell pour ces commandes :
# Pour les controles : DataGridView, NumericUpDown et PictureBox
# Suppression des lignes de gestion du DataBinding.
if ( $ligne.Contains(\&quot;((System.ComponentModel.ISupportInitialize)(\&quot; )) {Continue}

# Suppression de la déclaration des événements (à rajouter par le développeur)
if ($ligne -match \&quot;^this\.?[^\.]+\.\w+ \+= new [A-Za-z0-9_\.]+EventHandler\(\&quot;«») { Continue}

#
Traitement des lignes supportées
# Suppression du token C# de fin de ligne
if ($ligne[-1] -eq \&quot;;\&quot;«») {$ligne = $ligne.SubString(0, $ligne.Length-1) }
# Suppression du token d'appel de méthode. ATTENTION. Util uniquement pour les constructeurs !
if ($ligne.EndsWith(\&quot;()\&quot;«»)) {$ligne = $ligne.SubString(0, $ligne.Length-2) }

# Les lignes commentées le restent mais le traitement de la ligne courante se poursuit
if ($ligne.StartsWith(\&quot;//\&quot;«»)) {$ligne = \&quot;#\&quot; + $ligne.SubString(2)}

# Remplacement des types boolean par les variables dédiées
$ligne = $ligne.replace(\&quot; true\&quot;, ' $true')
$ligne = $ligne.replace(\&quot; false\&quot;, ' $false')

# Bug : RegEx erronée pour le composant System.Windows.Forms.ToolStripContainer ?
$ligne = $ligne -replace \&quot;(\w+\.\w+\.\w+\.\w+)\.(\w+)\&quot;, '[$1]::$2'

# Remplacement du format de typage des données
$ligne = $ligne -replace \&quot;\((\w+\.\w+\.\w+\.\w+)\)\&quot;, '[$1]'

# Remplacement de \&quot;new XXXXXX[] {\&quot; dans le cadre du remplissage d'objets avec des valeurs
$ligne = $ligne -replace \&quot;new [A-Za-z0-9_\.]+\[\] \{\&quot;,'@('
# Tjs dans le cadre du remplissage de listbox, remplacement de \&quot;})\&quot; par \&quot;«»))\&quot;
if ($ligne.EndsWith(\&quot;})\&quot;«»)) {$ligne = $ligne.replace(\&quot;})\&quot;, '))')}

# Remplacement de l'opérateur binaire OR
$ligne = $ligne.replace(\&quot;|\&quot;, '-bor')

# Recherche dans les lignes commentées le nom de la form,
# le nombre d'espace entre # et Form1 importe peu mais il doit y en avoir au moins un.
if ($ligne -match \&quot;^#\s+\&quot; + $formName)
{
$IsTraiteMethodesForm = $True
# On ajoute le constructeur de la Form
$LinesNewScript += '$' + \&quot;$formName = new-object System.Windows.Forms.form\&quot;
# Il n'existe qu'une ligne de ce type
Continue
}
if ($IsTraiteMethodesForm)
{
# On modifie les chaînes débutant par \&quot;this\&quot;
# Ex : \&quot;this.Controls.Add(this.maskedTextBox1) devient \&quot;$Form1.Controls.Add(this.maskedTextBox1)\&quot;
if ($ligne.StartsWith(\&quot;this.\&quot;«»)) {$ligne = \&quot;$\&quot; + $formName + $ligne.SubString(4)}

# Ensuite on remplace toutes les occurences de \&quot;this\&quot;.
# Ex :\&quot;$Form.Controls.Add(this.button1)\&quot; devient \&quot;$Form1.Controls.Add($button1)\&quot;
if ($ligne.Contains(\&quot;this.\&quot;«»)) {$ligne = $ligne.replace(\&quot;this.\&quot;, \&quot;$\&quot;«»)}
}
else
{
# On modifie les chaînes débutant par \&quot;this\&quot; qui opérent sur les composants
# Ex : \&quot;this.treeView1.TabIndex = 18\&quot; devient \&quot;$treeView1.TabIndex = 18\&quot;
if ($ligne.StartsWith(\&quot;this.\&quot;«»)) {$ligne = $ligne.replace(\&quot;this.\&quot;,'$')}
}

#Remplace le token d'appel d'un constructeur d'instance des composants graphique.
$ligne = $ligne.replace(\&quot; new \&quot;, \&quot; new-object \&quot;«»)
$LinesNewScript += $ligne
} # foreach

# Pas d'appel à la méthode ShowDialog
If( -not $dontshow.ISPresent )
{
$LinesNewScript += \&quot;$\&quot; + $formname + \&quot;.ShowDialog()\&quot;
}

# Ecriture du fichier de sortie
#
$LinesNewScript | out-file -filepath $psFileName -encoding default

# Vérifie la syntaxe du script généré
#
.\CheckSyntaxErrors.ps1 $psFileName -verbose
[/code:1]<br><br>Message édité par: BatchMan, à: 25/02/08 19:02

Tutoriels PowerShell

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

Plus d'informations
il y a 18 ans 3 semaines #1765 par Robin Lemesle
Salut Batchman,

Il serait bien que l'auteur à l'origine de ce script commente le traitment de parsing du fichier .CS car pour le moment j'ai un peu de mal avec le mode DEBUG de PowerShell :/


Je vais lui en parler ;).


Je dois tester le changement de résolution une fois le script généré.


Merci de participer à l'évolution de ce script qui est une vrai perle. Surtout n'hésite pas à venir poster tes tests. Je pense faire une mise à jour du script dans la bibliothèque dans les prochaines semaines. Si tu es d'accord, nous pourrions publier ta version si tes tests sont concluants.

Robin

Robin MVP PowerShell

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

Plus d'informations
il y a 18 ans 3 semaines #1769 par Laurent Dardenne
Robin écrit:

Merci de participer à l'évolution de ce script qui est une vrai perle.

C'est avant tout une excellente idée, c'est le plus important je pense.
Robin écrit:

Surtout n'hésite pas à venir poster tes tests.

nous pourrions publier ta version si tes tests sont concluants.

Pour le moment il se comporte correctement
Je pense mettre en place une série de programme C# pour exécuter des tests de non-regressions.

Quels types d'informations voulez-vous sur les tests effectués ?

Pour info dés qu'on commence à modifier un peu plus les composants c'est le début des ennuis ;-) :

# Bug connus :
# Certains caractères du texte d'un item de listbox pose pb :
# Saisie : \&quot;Test : &amp;é\&quot;''((--èè_çà)=+-*/.$¨^%,?;:§~#{'[(-|è`_\ç^à@)]=}\&quot;
# C# : \&quot;Test : &amp;é\\&quot;\'\'((--èè_çà)=+-*/.$¨^%,?;:§~#{\'[(-|è`_\\ç^à@)]=}\&quot;});
# PS : \&quot;Test : &amp;é\\&quot;\'\'((--èè_çà)=+-*/.$¨^%,?;:§~#{\'[(--borè`_\\ç^à@)]=}\&quot;))
#
# Déclaration d'une police différente, la propriété Size pose pb:
# this.label1.Font = new System.Drawing.Font(\&quot;Arial Black\&quot;, 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
# $label1.Font = new-object System.Drawing.Font(\&quot;Arial Black\&quot;, 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)))
# correcte
# $label1.Font = new-object System.Drawing.Font(\&quot;Arial Black\&quot;, 9.75, [System.Drawing.FontStyle]'Bold', [System.Drawing.GraphicsUnit]'Point', 0)

Du coup le pb qui se pose aujourd'hui c'est qu'il est préférable de recenser les cas d'utilisation de base autour de ces composants sinon je crains que ce script parte en vrille pour la maintenance...

Sinon j'ai ajouté la création d'un entête :

################################################################################
## Nom : Form1.ps1
## Version : 1.0
## Auteur :
## Date : le 02/26/2008 00:00:00
################################################################################

Et créé une méthode permettant de charger les assemblies nécessaires :
[code:1]Function Load-Assembly ([String[]] $Assemblies)
{ #Charge une liste d'assemblies .NET
[String[]] $Tableau =@()
foreach ($Assembly in $Assemblies) {
$Tableau += '[void][Reflection.Assembly]::LoadWithPartialName(\&quot;'+$Assembly+'\&quot;«»)'
}
return $Tableau
}
[/code:1]
Ce script c'est un peu comme les cacahuètes, on sait où ça commence jamais où ça s'arrête\&quot; :side:

Je pensais qu'il serait bien de garder les déclarations des gestionnaires d'évènement, quitte à les commenter. Moins on saisi mieux on se porte.

A votre avis ?<br><br>Message édité par: BatchMan, à: 26/02/08 22:51

Tutoriels PowerShell

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

Plus d'informations
il y a 18 ans 1 semaine #1940 par Laurent Dardenne
Pour info j'ai une version en cours qui améliore la prise en charge de certains composants/événements.
Comme l'interactivité des formulaires se base sur des évènements j'ai ajouté la création des délégués d'évènement déclarés dans VisualStudio:
[code:1]
Function Create-EventComponent([String] $ComponentName, [String] $EventName)
{ #Creé et ajoute un événement d'un composant. Par défaut le scriptbloc généré affiche un message d'information

$UnderConstruction = \&quot;[void][System.Windows.Forms.MessageBox]::«»Show(`\&quot;L'évènement $ComponentName.Add_$EventName n'est pas implémenté.`\&quot;«»)\&quot;
#La syntaxe d'ajout d'un délégué est : Add_NomEvénément
# où le nom de l'événement est celui du SDK .NET
#On double le caractère '{' afin de pouvoir l'afficher
Return \&quot;`${0}.Add_{1}({{`n`r`t{2}`n`r }})\&quot; -f ($ComponentName, $EventName, $UnderConstruction)
}
[/code:1]
ce qui génère, par exemple pour l'évènement clic d'un bouton, le code suivant:
[code:1]
$btnLoadFile.Add_Click({

[void][System.Windows.Forms.MessageBox]::«»Show(\&quot;L'évènement btnLoadFile.Add_Click n'est pas implémenté.\&quot;«»)

})
[/code:1]
Je compte inclure la gestion de la substitution CVS ou Subversion (gestionnaire de source) :
[code:1]
$Tableau +=Add-Commentaires @(\&quot;# Nom : $NomScript\&quot;,
\&quot;# Version : 1.0\&quot;,
\&quot;# Auteur : \&quot;,
\&quot;# Date : le $Date\&quot;,
\&quot;@`\&quot;\&quot;,
\&quot;Historique (substitution CVS) :\&quot;,
'$Log$',
'\&quot;@&gt;$Null')
[/code:1]
Mais je ne l'ai pas encore testé, je dois installer le serveur :-), cela me permettra de livrer un projet complet.

En revanche j'ai testé tous les évènements possible d'une Form, ce qui a permis de révéler un pb dans l'analyse des lignes d'appel de méthode de type ResumeLayout()/SuspendLayout().
Une limite de moins !

Sinon l'ajout que je trouve le plus intéressant est celui-ci :
[code:1]
function Add-SpecialEventForm([String] $FormName)
{ # Ajoute des méthodes d'évènement spécifique à la forme principale

$nbLignes=11
[String[]] $Tableau =,0*$nbLignes
#FormClosing
# Permet à l'utilisateur de :
# -déterminer la cause de la fermeture
# -autoriser ou non la fermeture
$Tableau[0]=\&quot;`${0}.Add_FormClosing({{\&quot; -f ($FormName)
$Tableau[1]=\&quot;`t\&quot;+'# $this est égal au paramètre sender (object)'
$Tableau[2]=\&quot;`t\&quot;+'# $_ est égal au paramètre e (eventarg)'
$Tableau[3]=\&quot;\&quot;
$Tableau[4]=\&quot;`t\&quot;+'# Déterminer la raison de la fermeture :'
$Tableau[5]=\&quot;`t\&quot;+'# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)'
$Tableau[6]=\&quot;\&quot;
$Tableau[7]=\&quot;`t\&quot;+'#Autorise la fermeture'
$Tableau[8]=\&quot;`t\&quot;+'($_).Cancel= $False'
$Tableau[9]=\&quot;`t})\&quot;
#FormShown
#Replace au premier plan la fenêtre en l'activant. By /\/\o\/\/
# Form1.topmost=$true est inopérant
$Tableau[10]=\&quot;`${0}.Add_Shown({{`${0}.Activate()}})\&quot; -f ($FormName)
Return $Tableau
}
[/code:1]
J'essaierai de le refactoriser mais la gestion du contenu d'un tableau de chaînes avec out-file me pose qq soucis. Il me faut creuser le pb ;-)
Donc le code précédent nous génère ceci :
[code:1]
$Form1.Add_FormClosing({
# $this est égal au paramètre sender (object)
# $_ est égal au paramètre e (eventarg)

# Déterminer la raison de la fermeture :
# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)

#Autorise la fermeture
($_).Cancel= $false
})
$Form1.Add_Shown({$Form1.Activate()})
[/code:1]
Le dernier évènement place automatiquement la form au premier-plan.
Et le premier gére l'evènement closing de la form. On laisse à la charge du scripteur d'autoriser ou non la fermeture de la form. Par défaut elle est autorisée.
Tous les appels de Form.close passe par celui-ci, on évite ainsi la duplication de code.

Pour ce type d'événement on reçoit un paramètre, je suis resté bloqué qq temps sur ce pb simple mais qui n'est pas documenté %/
J'ai trouvé l'information suivante sur un forum US :

$this est égal au paramètre sender (object)
$_ est égal au paramètre e (eventarg)

Ce qui est cohérent et tombe sous le sens, une fois qu'on le sait :-)

Voilà il reste qq soucis à régler avant de la mettre en ligne. En // je finalise le développement d'un outil simple de gestion de l'historique.
Ce qui me permet de valider les modifications du script CSForm2PS.ps1.

Vos remarques sont les bienvenues (cela s'adresse à tout le monde bien évidemment).

Tutoriels PowerShell

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

Plus d'informations
il y a 18 ans 4 jours #1966 par Robin Lemesle
Bravo pour ton travail !

Ce convertisseur va devenir une véritable référence B) .

Robin MVP PowerShell

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

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