none
Conversion d'un UserForm VBA en un Form de Visual Studio C# RRS feed

  • 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
    mardi 20 avril 2010 11:22

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 = False

    Les 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_Chantiers

        Set 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
    lundi 3 mai 2010 10:37
  • 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
    mercredi 21 avril 2010 10:17
  • Bonjour,

    Excélent. Merci


    riri
    • Marqué comme réponse BRI_67 vendredi 23 avril 2010 08:49
    vendredi 23 avril 2010 08:39

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
    mercredi 21 avril 2010 10:17
  • Bonjour,

    Excélent. Merci


    riri
    • Marqué comme réponse BRI_67 vendredi 23 avril 2010 08:49
    vendredi 23 avril 2010 08:39
  • 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
    samedi 24 avril 2010 11:12
  • 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 = False

    Les 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_Chantiers

        Set 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
    lundi 3 mai 2010 10:37
  • Bonjour,

    BRI_67, merci pour les informations et pour le suivi de ce thread.

     

     

    Cordialement,

    Alex


    Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/bd974e0e-5519-4122-b8fc-3b998207c34f
    mardi 4 mai 2010 08:16