IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

VS2008 / instanciation formulaire


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 57
    Par défaut VS2008 / instanciation formulaire
    Bonjour,

    Comme vous devez le savoir, vb.net 2008, ou plutôt VS2008, autorise l'utilisation d'une Form même si on ne l'a pas instancié (sa création intervient automatiquement du moment qu'une instruction y fait référence).
    Je crois que c'était déjà vrai en VS2005.

    Connaissez-vous le moyen de changer ce comportement (qui est éminemment dangereux) au profit d'une exception générée sans une instanciation bien propre des formulaires ?

    Merci
    Squale69

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Par défaut
    S'il existe une solution, je suis également preneur !

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par squale69 Voir le message
    Comme vous devez le savoir, vb.net 2008, ou plutôt VS2008, autorise l'utilisation d'une Form même si on ne l'a pas instancié (sa création intervient automatiquement du moment qu'une instruction y fait référence).
    Je crois que c'était déjà vrai en VS2005.
    He bah non je savais pas, d'ailleurs c'est probablement pas le cas.
    M'enfin, quel est le code qui te permet de dire ça ?

    Juste au cas où, si c'est parce que tu peux direct utiliser ton "Form1", c'est parce qu'il a été instancié dans le fichier Program.cs (ou dans le fichier Form1.cs avec la fonction Main) via un Application.Run(new Form1());

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Par défaut
    Perso, ca le fait avec toutes les Form que je crée et pas seulement avec Form1...

    On a effectivement observé ce comportement avec un de mes collègues... on crée plusieurs Form dans un même projet et on peut directement les afficher avec un Form3.Show()

    La Form est instanciée et affichée. On ajoute des données dans un TextBox... puis, on fait un Form3.Close() (ou Dispose) et si on refais un Form3.Show() juste après, la Form réapparait avec le TextBox vide...

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Je crée un projet Windows Forms, je fait dans le constructeur de Form1, et je fais Form1.Show(), il me répond que la méthode n'existe pas (et c'est le cas en effet, c'est une méthode d'instance, donc à moins que Form1 soit le nom d'une variable ...).

    Envoies un projet avec ce cas pour voir ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Par défaut
    Je suis tout à fait d'accord avec ce que tu dis, c'est bien cela qui m'a surpris à la base... Form1, Form2, Form3, ... c'est pas le nom d'un objet de la classe Form... c'est le nom de la classe qui dérive elle-même de Form donc des méthodes telles que Show() ne devraient être accessibles qu'à partir d'une instance de la classe...

    Et pourtant... moi, j'en suis venu à la conclusion que pour les Form, VB.NET vérifie s'il existe une instance de la classe et s'il n'en trouve pas, il la crée tout seul comme un grand... et si on ferme par Close() ou Dispose(), il détruit l'instance et la recrée tout seul dès qu'on refait un Show() ...

    Si tu n'as pas le même comportement, ca doit être lié à une option du projet mais je vois pas quoi.

    Voici un projet en pièce jointe. Je te décris brièvement ce que j'ai fait :

    - Création d'un nouveau projet Windows Form.
    - Création de Form2, Form3, Form4 et Form5 dans le même projet par l'explorateur de solutions.
    - Form2.Show() et Form4.Show() dans la méthode Form1_Load de Form1.
    - Form3.Show() dans la méthode Form2_Load de Form2.
    - Form5.Show() dans la méthode Form4_Load de Form4.

    Et au démarrage de l'application, j'ai bien Form1, 2, 3, 4 et 5 qui s'ouvrent !
    Fichiers attachés Fichiers attachés

  7. #7
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Ahhhhhh, VB.Net ce truc de ... , j'avais pas vu.

    Ouai, VB.Net génère lui même cette chose horrible (ce qui n'est pas le cas en C#).
    En fait on se retrouve avec ce code dans l'assembly générée pour par exemple, la ligne Form2.Show:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyProject.Forms.Form2.Show
    Et en l'occurence, MyProject.Forms contient ceci :
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Friend NotInheritable Class MyForms
        ...
     
        ' Properties
        Public Property Form1 As Form1
        Public Property Form2 As Form2
        Public Property Form3 As Form3
        Public Property Form4 As Form4
        Public Property Form5 As Form5
     
        ' Fields
        Public m_Form1 As Form1
        Public m_Form2 As Form2
        Public m_Form3 As Form3
        Public m_Form4 As Form4
        Public m_Form5 As Form5
        ...
    End Class
    Ce qui rend possible et effectif le comportement observé.

    Après, comment désactiver la génération de cette classe par le compilateur, j'en ai aucune idée (je ne fais pas de VB.Net, j'aime la vie moi ). Mais ça pourra peut être vous éclairer sur le comportement ...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Par défaut
    Oui, c'est parfait, merci pour toutes ces infos !

    Je bossais (et je bosse tjrs) en C# mais j'ai du me coller au VB.NET parce que c'est le langage utilisé dans le nouveau boulot que j'ai décroché il y a 2 mois...

    Mine de rien, c'est tout aussi efficace que le C# avec une syntaxe différente et nettement plus verbeuse... je me suis familiarisé en 2 semaines... mais il y a effectivement de petites différences entre les deux. En C#, je suis obligé d'instancier moi-même les Form avant de les afficher et je préfère...

    Il n'y a qu'un seul truc que je regrette dans le VB.NET ... l'absence totale de l'instruction "continue" qui permet de sauter le reste du code présent dans une boucle et de continuer l'exécution en repartant du début de la boucle... pour faire la meme chose, je suis obligé d'utiliser... un goto... l'horreur !

    Merci de ton aide

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 57
    Par défaut
    Bon maintenant que nous semblons d'accord sur le constat de cette génération "spontanée", je vous laisse imaginer les erreurs "monumentales" qu'il peut en découler.
    Exemple : on instancie correctement une nouvelle form, on met à jour x ou y champs, on masque 2 ou 3 contrôles ... on part par erreur dans une zone ou cette form n'est pas accessible (on l'a par exemple mise en Private au lieu de Public)... et on utilise impunément la form MAIS surprise, quand on fait le show ou le showdialog on a plus toutes les modifs passées : et oui, VB a instancié de lui même une nouvelle forme en appelant classiquement le NEW.

    Et voilà, faut 2 jours de débug pour trouver ce problème.

    Bon, il y sûrement des personnes qui ont trouver dans les réglages de VS comment changer tout ça ????

    Squale69

  10. #10
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    A ta place j'aurai proprement déclaré
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MaFormPrincipale As Form1
    et utilisé cet objet, et non pas celui crée par VB.Net.

Discussions similaires

  1. instanciation d'un formulaire windows
    Par TaymouWan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/04/2009, 16h07
  2. Réponses: 2
    Dernier message: 21/05/2008, 08h13
  3. Echec d'instanciation -- bean de formulaire
    Par chat_roux dans le forum Struts 1
    Réponses: 2
    Dernier message: 14/01/2008, 02h51
  4. Instancier un objet en paramètre d'un autre formulaire
    Par sl.info dans le forum VBA Access
    Réponses: 5
    Dernier message: 14/11/2007, 11h36
  5. Réponses: 2
    Dernier message: 05/01/2007, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo