Question Form Converter : Ajout de fonctionnalités

Plus d'informations
il y a 16 ans 1 mois #1753 par VICTORIN
Bonjour à tous,

Voici ma contribution à la communauté Powershell : une nouvelle version du script de conversion des forms C# en PS (très pratique). Les nouvelles fonctionnalités sont indiquées dans l'en-tête du script :

[code:1]##########################################################################
# www.PowerShell-Scripting.com
#
# PowerShell Form Converter
#
# Version : 0.4
#
# 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 en PowerShell
#
# Date : Avril 2007
#
# v0.4 (22/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
#
##########################################################################

param ([string]$source, [string]$dest, [switch]$dontshow)

# Programme source CSharp à analyser
$csFilename = $source
#
# fichier destination PowerShell
$psFileName = $dest
#
# Collection des lignes utiles de InitializeComponent() : $component
#
[string[]] $component = @()
[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 \"{\"«») {$component += $ligne}
}
}
# On récupère le nom de la form dans $formName
#
$formName = \"\"
foreach ($ligne in $component)
{ if ($ligne -match '^\s*this\.Name\s*=\s*\"(?<nom>[^\"]+)\"\w*' )
{$formName = $matches[\"nom\"]; break}
}
if ($formName -eq \"\"«») { write-output \"Nom de la form non trouvé\"; exit}

# Collection des lignes résultat : $resul
#
[string[]] $resul = @()
$resul += '[void][Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)'
[boolean] $debut = $true # jusqu'à la rencontre de // Form
foreach ($ligne in $component)
{
$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')
$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 equivalent ne semble exister en powershell pour ces commandes :
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit\",'')
$ligne = $ligne.replace(\"((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).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 évenements (à 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
$resul += '$' + \"$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 \"«»)
$resul += $ligne

} # if ($util)
} # foreach
If( -not $dontshow.ISPresent )
{
$resul += \"$\" + $formname + \".ShowDialog()\"
}

# Ecriture du fichier de sortie
#
$resul | out-file -filepath $psFileName -encoding default
#
[/code:1]

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

Plus d'informations
il y a 16 ans 1 mois #1757 par Robin Lemesle
Merci vinz2k, je n'ai pas eu le temps de tester, mais dès que j'ai 5 min je vais le faire. Merci de faire progresser ce script ;)

Robin MVP PowerShell

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

Plus d'informations
il y a 16 ans 3 semaines #2018 par Laurent Dardenne
SAlut Vinz2k,
peux-tu m'expliquer l'objectif de ces 2 lignes :
[code:1]
...
# Remplacement du format de typage des données
$ligne = $ligne -replace \"\((\w+\.\w+\.\w+\.\w+)\)\", '[$1]'
...
# Remplacement de l'opérateur binaire OR
$ligne = $ligne.replace(\"|\", '-bor')
...
[/code:1]
Pour la seconde je n'ai pas trouvé de cas où cela est nécessaire. Jusqu'à maintenant je ne retrouve le caractère pipe que dans des énumérations ou dans des chaînes des caractères.

Quant à la première expression, c'est le grand mystère. Si tu pouvais m'indiquer un cas où elle match.
Merci

ps:
Pour infos on trouve ces 2 cas dans la gestion des events:

# Gestion d'un event d'un composant : this.btnRunClose.Click += new System.EventHandler(this.btnRunClose_Click);

#Gestion d'un event de la form :
this.Load += new System.EventHandler(this.Form1_Load);

Pour la gestion des énumérations on trouve des noms d'énumération avec 3,4 ou 5 'points', j'ai donc modifié le code comme ceci :
[code:1]
#Recherche l'affectation d'une valeur d'énumération par une capture
# Trois groupe: 1- Les caractères à gauche de '= ', i.e. en début de ligne
# 2- Les caractères à droite de '= ' et avant le dernier '.'
# 3- Les caractères après le dernier '.'
# Pour renforcer la reconnaissance on opére avant la suppression du ';'
$Ligne = $Ligne -replace \&quot;^(.*)= (.*)\.(\w+);$\&quot;, '$1=[$2]::$3'[/code:1]<br><br>Message édité par: BatchMan, à: 26/03/08 13:43

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 11 mois #2276 par VICTORIN
Salut BatchMan !

Visiblement, tu as bien avancé sur ce script, tu en es à la version 0.9, pas mal :)

Pour tes questions, tu as peut être déjà trouver les réponses, mais je vais quand même y répondre :
- Pour la 1° question, j'ai dans le code c# dans cas comme celui-ci :
[code:1]this.bArret.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
[/code:1]
Il fallait remplacer ce format de typage qui est entre parenthèse par la même chose entre crochet.

- Pour la 2° question,l'opérateur binaire OR (\&quot;|\&quot; en C#) apparait dans les forms C# (comme dans l'exemple ci-dessus).

En tout cas, merci pour ta contribution. Je l'essayerai quand j'aurai un peu de temps.

@+

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

Plus d'informations
il y a 15 ans 11 mois #2277 par Laurent Dardenne
Salut,
merci pour ta réponse.
J'ai surtout avancé sur le recensement des cas les + courants à analyser.
vinz2k écrit:

Il fallait remplacer ce format de typage qui est entre parenthèse par la même chose entre crochet.

J'ai modifié ces traitements en qq chose de beaucoup plus verbeux autour de groupes :
[code:1]
$MatchTmp =[Regex]::Match($Ligne,'^(.*)(\.Anchor =.*System.Windows.Forms.AnchorStyles\))(.*)\)$')
if ($MatchTmp.Success -eq $true)
{
#On traite la partie paramètres d'une déclaration
$ParametresAnchor = ParseProprieteANCHOR $MatchTmp
...
[/code:1]
cas recensés :

Il n'y a qu'un paramètre qui peut être une combinaison de valeur (entre 1 et 4). La combinaison \&quot;Top,Left\&quot; est la valeur par défaut et n'est pas inscrite par VS dans le fichier Form1.designer.cs.
L'argument de type AnchorStyles peut être une combinaison de valeurs :
1 valeurs : this.button2.Anchor = System.Windows.Forms.AnchorStyles.None; (ou .Left)
2 valeurs : ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
3 valeurs : (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)| System.Windows.Forms.AnchorStyles.Right)));
4 valeurs : ((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)| System.Windows.Forms.AnchorStyles.Left)| System.Windows.Forms.AnchorStyles.Right)));


Tutoriels PowerShell

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

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