Meilleur auteur de réponses
Conversion d'un UserForm VBA en un Form de Visual Studio C#

Question
-
Aprés un mois et demi d'efforts, j'ai une application qui me permet de générer un fichier propre designer.cs à partir d'un fichier Xml. Ce fichier XML est généré par une Appli VBA pour un userForm donné et contient toutes les propriétés du UserForm ainsi que celles des controls du UserForm.
L'affichage du Form correspondant se fait sans problème. Les textes apparaissent avec les mêmes polices et donc les mêmes largeurs. Tout les controls sont définis (this.controlname.Size = new System.Drawing.Size(X,Y)) en reprenant les valeurs Height et Width du UserForm en VBA.
MAIS L'ensemble des Controls sont redessinés avec un coefficient de réduction d'environ 0,75 (25%). Pour le Form la réduction est de 10% seulement. Je pense que cela vient de l'unité graphique (System.Windows.Graphics) qui ne doit pas être la même en VBA et VS.
Bien sur si j'augmente toutes les valeurs de 25% pour les controls j'arrive au résulat, mais j'aimerais une solution propre.
Quelqu'un a-t'il une solution ou explication technique ?
merci d'avance
Nota : pour la conversion du code (VBA) en c#, ce n'est que du pur développement et j'ai fait 50% du chemin.
riri
Réponses
-
Voici quelques informations qui peuvent peut-être intéresser les personnes ayant consultés le thread.
En VBA les propriétés affichées pour un UserForm et ces controls telles que Left, Top, Height et Width ne peuvent pas être des Twips. Par contre j'ai découvert que dans un fichier correspondant à un export d'un UserForm on trouve les entêtes suivantes dans le fichier (Exemple sur un UserForm appellé UserForm_Chantiers --> UserForm_Chantiers.frm) :
VERSION 5.00
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} UserForm_Chantiers
Caption = "Gestion des Chantiers - Table des Chantiers"
ClientHeight = 7815
ClientLeft = 45
ClientTop = 435
ClientWidth = 11790
OleObjectBlob = "UserForm_Chantiers.frx":0000
StartUpPosition = 1 'CenterOwner
End
Attribute VB_Name = "UserForm_Chantiers"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = FalseLes valeur Clientheight et ClientWidth semblent par contre être des Twips mais pour ce même UserForm_Chantiers les propriétés Affichés (Affichage --> Objet en VBA) sont : Left = 0, Top = 0, Height = 414,75 et Width = 594
Voici ce que l'on obtient avec le code suivant en VBA :
Public UF As UserForm
Public UFO As Object
Public XXX As String
Set UF = UserForm_ChantiersSet UFO = UserForm_Chantiers
XXX = UserForm_Chantiers.Height ' Donne "414,75"
XXX = UserForm_Chantiers.Width ' Donne "594"
XXX = UF.Height ' Propriété ou Méthode non géré par cet Objet
XXX = UF.ClientHeight ' Propriété ou Méthode non géré par cet Objet
XXX = UFO.ClientHeight ' La Propriété "ClientHeight" est en écriture seule !!!!!!
XXX = UFO.ClientWidth ' La Propriété "ClientWidth" est en écriture seule !!!!!!Si je converti les valeurs ClientHeight et ClientWidth de l'entête du fichier UserForm_Chantiers.frm on obtient 7815/1440*96 = 521 différent de 414,75 et 11790/1440*96 = 786 différent de 594.
Je pense avoir trouvé une méthode qui marche en appliquant des coefficients constants pour passer des propriétés Left, Top, Height et Width de VBA à celle d'un Windows Forms de même dimension.
Je multiplie toute les valeurs Left, Top, Height et Width de VBA par 1,35 pour obtenir les valeurs de this.Controlname.Location = new System.Drawing.Point(X, Y) et this.ControlName.Size = new System.Drawing.Size(X, Y) nécessaire au fichier ....Designer.cs. Idem pour les valeurs X et Y du ClientSize du Windows Form : this.ClientSize = new System.Drawing.Size(X, Y) avec une réduction de 10 pour X et de 36 pour Y (la barre de titre vraisemblablement). Autre précaution il faut rajouter 10 à la valeur obtenu pour Y pour tous les Controls situés à l'intérieur d'un GroupBox (Frame en VBA).
La méthode est trés empirique, mais cela m'a donné d'excellent résultat.
Je suis bien sûr toujours preneur d'autres avis, conclusions ou expériences.
Cordialement.
riri- Marqué comme réponse Alex Petrescu mardi 4 mai 2010 08:14
-
Bonjour,
Les contrôles en Office VBA sont mesurés en twips. Les contrôles de .NET sont mesurés en pixels.
Les twips sont indépendants par rapport aux dimensions d’écran (1 twip = 1/1440 inch).
Pour une conversion correcte, je vous propose le KB suivant :
http://support.microsoft.com/Default.aspx?kbid=210590
Cordialement,
Alex
Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/bd974e0e-5519-4122-b8fc-3b998207c34f- Proposé comme réponse Gabriel MongeonModerator mercredi 21 avril 2010 13:07
- Marqué comme réponse Alex Petrescu vendredi 23 avril 2010 08:01
-
Toutes les réponses
-
Bonjour,
Les contrôles en Office VBA sont mesurés en twips. Les contrôles de .NET sont mesurés en pixels.
Les twips sont indépendants par rapport aux dimensions d’écran (1 twip = 1/1440 inch).
Pour une conversion correcte, je vous propose le KB suivant :
http://support.microsoft.com/Default.aspx?kbid=210590
Cordialement,
Alex
Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/bd974e0e-5519-4122-b8fc-3b998207c34f- Proposé comme réponse Gabriel MongeonModerator mercredi 21 avril 2010 13:07
- Marqué comme réponse Alex Petrescu vendredi 23 avril 2010 08:01
-
-
Désolé de revenir sur la question. La réponse reste excellente mais le résultat est moins probant.
En VBA 1440 Twips me donne 96 Pixels et aussi bien en direction X que Y et la function calcule 96 pixels par pouce aussi bien en X qu'en Y
J'ai fait le test en VB.Net et j'obtiens le même résultat.
La première conclusion pour le moment, sachant qu'un pouce = 2,54 cm, est que les valeurs afficheées en VBA pour les propriétés Left, Top, Height et Width ne peuvent pas être des Twips.
J'ai fait un Test en VBA un control d'environ 5 pouces de large et 1 pouce de hauteur me donne Height = 67 et Width = 480.
En Twips je devrais avoir en largeur 7200 Twips et en hauteur 1440 Twips.
Ou est l'erreur ?
Merci pour les réponses.
riri -
Voici quelques informations qui peuvent peut-être intéresser les personnes ayant consultés le thread.
En VBA les propriétés affichées pour un UserForm et ces controls telles que Left, Top, Height et Width ne peuvent pas être des Twips. Par contre j'ai découvert que dans un fichier correspondant à un export d'un UserForm on trouve les entêtes suivantes dans le fichier (Exemple sur un UserForm appellé UserForm_Chantiers --> UserForm_Chantiers.frm) :
VERSION 5.00
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} UserForm_Chantiers
Caption = "Gestion des Chantiers - Table des Chantiers"
ClientHeight = 7815
ClientLeft = 45
ClientTop = 435
ClientWidth = 11790
OleObjectBlob = "UserForm_Chantiers.frx":0000
StartUpPosition = 1 'CenterOwner
End
Attribute VB_Name = "UserForm_Chantiers"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = FalseLes valeur Clientheight et ClientWidth semblent par contre être des Twips mais pour ce même UserForm_Chantiers les propriétés Affichés (Affichage --> Objet en VBA) sont : Left = 0, Top = 0, Height = 414,75 et Width = 594
Voici ce que l'on obtient avec le code suivant en VBA :
Public UF As UserForm
Public UFO As Object
Public XXX As String
Set UF = UserForm_ChantiersSet UFO = UserForm_Chantiers
XXX = UserForm_Chantiers.Height ' Donne "414,75"
XXX = UserForm_Chantiers.Width ' Donne "594"
XXX = UF.Height ' Propriété ou Méthode non géré par cet Objet
XXX = UF.ClientHeight ' Propriété ou Méthode non géré par cet Objet
XXX = UFO.ClientHeight ' La Propriété "ClientHeight" est en écriture seule !!!!!!
XXX = UFO.ClientWidth ' La Propriété "ClientWidth" est en écriture seule !!!!!!Si je converti les valeurs ClientHeight et ClientWidth de l'entête du fichier UserForm_Chantiers.frm on obtient 7815/1440*96 = 521 différent de 414,75 et 11790/1440*96 = 786 différent de 594.
Je pense avoir trouvé une méthode qui marche en appliquant des coefficients constants pour passer des propriétés Left, Top, Height et Width de VBA à celle d'un Windows Forms de même dimension.
Je multiplie toute les valeurs Left, Top, Height et Width de VBA par 1,35 pour obtenir les valeurs de this.Controlname.Location = new System.Drawing.Point(X, Y) et this.ControlName.Size = new System.Drawing.Size(X, Y) nécessaire au fichier ....Designer.cs. Idem pour les valeurs X et Y du ClientSize du Windows Form : this.ClientSize = new System.Drawing.Size(X, Y) avec une réduction de 10 pour X et de 36 pour Y (la barre de titre vraisemblablement). Autre précaution il faut rajouter 10 à la valeur obtenu pour Y pour tous les Controls situés à l'intérieur d'un GroupBox (Frame en VBA).
La méthode est trés empirique, mais cela m'a donné d'excellent résultat.
Je suis bien sûr toujours preneur d'autres avis, conclusions ou expériences.
Cordialement.
riri- Marqué comme réponse Alex Petrescu mardi 4 mai 2010 08:14
-